Ing Mathematik: Näherungsweises Lösen gewöhnlicher Dgl.
Numerisches Differenzieren
BearbeitenDie findiff-Funktion
BearbeitenPython-Code:
import findiff import numpy as np x = np.linspace(0, 1, 100) f = np.sin(x) d_dx = findiff.FinDiff(0, x, 1) df_dx = d_dx(f) print(df_dx[-1])
Ausgabe:
0.5403208977697744
Differenzenquotient
Bearbeiten- Vorwärts-Differenzenquotient:
- Rückwärts-Differenzenquotient:
- Zentraler Differenzenquotient:
Siehe auch Numerische Differentiation, Differenzenquotient.
Satz von Taylor
BearbeitenTaylorpolynom:
Lagrangesche Restgliedformel:
Nachfolgend seien Entwicklungen der -Funktion als Taylorpolynome gezeigt. Zuerst die Linearisierung um den Arbeitspunkt und eine Parabel. Anschließend Polynome höheren Grades.
Zugehöriger Python-Code:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import approximate_taylor_polynomial x = np.arange(-10.0, 10.0, 0.01) degree1 = 5 degree2 = 11 taylor1 = approximate_taylor_polynomial(np.exp, 0, degree1, 1, degree1+2) taylor2 = approximate_taylor_polynomial(np.exp, 0, degree2, 1, degree2+2) plt.plot(x, np.exp(x), label = r"$e^x$") plt.plot(x, taylor1(x), label="Taylor, %d" % degree1) plt.plot(x, taylor2(x), label="Taylor, %d" % degree2) plt.plot(0, 1, "o", label = "Entwicklungspunkt") plt.legend() plt.tight_layout() plt.grid() plt.axis([-10, 10, -5, 5]) plt.show()
Siehe auch Taylor-Formel, Knorrenschild: Seite 112ff
Diskretisierungsfehler
BearbeitenProblem: Wählt man zu klein, so ist ggf. der Rundungsfehler zu groß. Ist zu groß, dann ist offensischtlich der Diskretisierungsfehler hoch.
Herleitung: Mit der Taylorformel erhält man für
Diskretisierungsfehler:
(Fehler)Ordnung : mit .
Je höher die Fehlerordnung, desto genauer ist i. A. die Formel. Die Schrittweite h ist optimal, wenn der Gesamtfehler aus Diskretisierungs- und Rundungsfehler minimal wird. Lt. Korrenschild: Seite 115 ist das Optimum bei erreicht. eps sei die Maschinengenauigkeit.
Siehe auch Lokaler Diskretisierungsfehler.
Gewöhnliche Differentialgleichungen - Allgemeines
Bearbeitenist eine gewöhnliche Differenzialgleichung n-ter Ordnung. Es sind sämtliche Lösungen dieser Gleichung zu bestimmen. Häufig gelingt das nicht mehr analytisch, sondern die Gleichung muss numerisch bearbeitet werden.
Siehe auch Differentialgleichung, Gewöhnliche Differentialgleichung und Burg, Haf, Wille, Meister
Anfangswertprobleme
BearbeitenAllgemeines
BearbeitenDie Lösung eines Anfangswertproblems ist die Lösung der Differentialgleichung plus Berücksichtigung von vorgegebenen Anfangswerten.
mit .
Wie nachfolgendes Bild zeigt, gibt es auch hier eine Vielzahl an numerischen Methoden (das Bild beinhaltet nicht alle verfügbaren Methoden, Quelle: Tabellen in Burg, Haf, Wille, Meister: Seite 75f).
Lipschitz-Bedingung
Bearbeitenheißt lipschitzstetig, wenn eine Konstante (die Lipschitz-Konstante) existiert, die für alle gilt.
Siehe auch Lipschitz-stetige Funktion, Burg, Haf, Wille, Meister: Seite 21, Hanke-Bourgeois: Seite 553
Picard-Lindelöf
Bearbeiten- Existenzproblem: Finden wir stets eine Lösung des Anfangswertproblems?
- Eindeutigkeit: Ist dies die einzige Lösung?
- Ist diese Lösung lokal oder lässt sie sich auf einen größeren Bereich fortsetzen?
Die dritte Frage lässt sich so beantworten: Existenzaussagen sind i.A. nur lokal gültig. Die ersten beiden beantwortet der Existenz- und Eindeutigkeitssatz von Picard-Lindelöf.
Die nachfolgende Variante des Satzes von Picard-Lindelöf stammt aus Wikipedia (Satz von Picard-Lindelöf, Autoren siehe dort):
Sei ein Banachraum, , mit und stetig und lokal Lipschitz-stetig in der zweiten Variablen. Hierin bezeichnet
die abgeschlossene Kugel um mit Radius . Ist
und
dann existiert genau eine Lösung des Anfangswertproblems
auf dem Intervall ; sie hat Werte in .
Eine etwas einfacher verständliche Variante findet sich in Burg, Haf, Wille, Meister: Seite 15ff. Auch in Hanke-Bourgeois: Seite 553ff findet sich dieser Satz.
Rekursionsformel nach Picard-Lindelöf:
Das Anfangswertproblem wird durch die Integralgleichung ersetzt.
.
Dabei muss gelten: stetig.
Mit dem Verfahren von Picard-Lindelöf ist zwar schon eine Methode zur numerischen Lösung von Anfangswertproblemen gegeben. In Burg, Haf, Wille, Meister: Seite 22ff ist ein einfaches Beispiel gezeigt. Allerdings lassen sich oft die Integrale nicht einfach explizit bestimmen. Es gibt daher eine Vielzahl anderer Methoden, die dieses Problem vermeiden.
Integrationsmethoden
Bearbeiten. Das Integral kann durch numerische Quadraturformeln gelöst werden. Mit der Rechteckregel ergibt sich:
Differenziationsmethoden
Bearbeiten
Einschrittverfahren
BearbeitenZur Berechnung der Größe ist stets die Verfügbarkeit von ausreichend.
Mehrschrittverfahren
BearbeitenZur Berechnung der Lösung sind neben mit noch weitere Stützpunkte zu berücksichtigen.
Explizite Verfahren
BearbeitenWeist die Verfahrensfunktion keine Abhängigkeit von auf, so heißt das Verfahren explizit.
Implizite Verfahren
BearbeitenWeist die Verfahrensfunktion eine Abhängigkeit von auf, so heißt das Verfahren implizit.
Steife Differenzialgleichungen
BearbeitenBei diesen versagen explizite Einschrittverfahren (Quelle: Hanke-Bourgeois: Seite 587). Die Lösungskomponenten setzen sich aus verschieden stark exponentiell abklingenden Anteilen zusammen (Quelle: Bronstein, Semendjajew, Musil, Mühlig: Taschenbuch der Mathematik. 7. Aufl., Harri Deutsch, 2008, Seite 978). Die Lipschitzkonstante nimmt große Werte an.
Siehe auch Steifes Anfangswertproblem. Im Englischen werden derartige DGL als stiff bezeichnet.
Ein PDF-File zum Thema Steife Differentialgeichungen findet sich auch auf [1].
Euler
BearbeitenExplizit
Bearbeiten
Mit kann dieses Verfahren aus obigen Formeln abgeleitet werden. Oder noch einfacher via nachfolgendem Bildchen.
oder allgemein
Dieses Verfahren wird auch Euler-Cauchy-, Vorwärts-Euler-Verfahren oder eulersches Polygonzugverfahren genannt.
Siehe auch Explizites Euler-Verfahren, Burg, Haf, Wille, Meister: Seite 43ff, Knorrenschild: Seite 147ff oder Hanke-Bourgeois: Seite 557ff
Implizit
Bearbeiten
Auch dieses Verfahren lässt sich aus dem obigen Bild herleiten. Diesmal wird aber nicht der Punkt betrachtet, sondern . Es wird auch Rückwärts-Euler-Verfahren genannt.
Siehe auch Implizites Euler-Verfahren, Burg, Haf, Wille, Meister: Seite 45ff oder Hanke-Bourgeois: Seite 560ff
Runge
BearbeitenEs ist ein verbessertes Polygonzugverfahren. Es lässt sich auch mit der Mittelpunktregel herleiten.
Herleitung:
Der folgende Python-Code dient nur der Visualisierung und zu Testzwecken und ist nicht für den Produktiveinsatz gedacht. Dazu siehe das Kapitel Runge-Kutta und die vorgefertigte SciPy-Funktion solve_ivp
.
Grafikausgabe des nachfolgenden Python-Codes:
import numpy as np import matplotlib.pyplot as plt def f(t,y): return(y) def runge(dt, n, y0): t = np.zeros(n+2) y = np.zeros(n+2) t[0] = 0. y[0] = y0 for i in np.arange(0, n+1): y[i+1] = y[i] + dt * f(t[i]+dt/2, y[i]+dt/2*f(t[i],y[i])) t[i+1] = t[i] + dt plt.plot(t,y, label="Runge-Näherung") return y,t y, t = runge(1., 9, 1.) print("Runge-Näherung = ", y[-1]) x = np.arange(0., 10.1, .1) y = np.exp(x) plt.plot(x,y, label="exaktes Ergebnis") plt.grid() plt.legend(loc="best") plt.show() print("exaktes Ergebnis = ", y[-1])
Konsolenausgabe:
Runge-Näherung = 9536.7431640625 exaktes Ergebnis = 22026.465794806718
Python-Code:
import numpy as np def f(t,y): return(y) def runge(dt, n, y0): t = np.zeros(n+2) y = np.zeros(n+2) t[0] = 0. y[0] = y0 for i in np.arange(0, n+1): y[i+1] = y[i] + dt * f(t[i]+dt/2, y[i]+dt/2*f(t[i],y[i])) t[i+1] = t[i] + dt return y y = runge(.01, 1000, 1.) print(y[-1])
Ausgabe:
22244.151807018065
Die exakte Lösung wäre
Siehe auch Burg, Haf, Wille, Meister: Seite 53f.
Runge-Kutta
BearbeitenDas obige Bild zeigt auch, dass das Runge-Kutta-Verfahren schon sehr genaue Werte liefert (verglichen mit den anderen dargestellten Verfahren).
Python-Programm (es soll die DGL mit dem Anfangswert gelöst werden. Siehe dazu auch Burg, Haf, Wille, Meister: Seite22f. Dort wird auch die exakte Lösung mit vollständiger Induktion hergeleitet. Dies kann aber auch mit grundlegenden Mathematikkenntnissen selbst durchgeführt werden -> Separation der Variablen):
import scipy import numpy as np def dy_dx(x, y): return y y0 = [1] xi = [0, 10] z = scipy.integrate.solve_ivp(dy_dx, xi, y0, method="RK45") y = z.y print(y[-1, -1])
Ausgabe:
22016.12509092586
Die exakte Lösung wäre:
Knorrenschild gibt auf Seite 157 seines Buches eine Tabelle mit Zahlenwerten für verschiedene Verfahren an. Es soll die DGL u.a. mit dem Runge-Kutta-Verfahren gelöst werden. Nachfolgendes Python-Programm zeigt die Vorgehensweise. Die gelieferten Werte liegen sehr nahe an der Knorrenschild-Tabelle (und auch an den exakten Werten).
Python-Code:
import scipy import numpy as np import matplotlib.pyplot as plt def dy_dx(x, y): return x*x + 0.1*y y0 = [0] x = [-1.5, 1.5] z = scipy.integrate.solve_ivp(dy_dx, x, y0, method="RK45" , t_eval=[-1.5,-0.9,-0.3,0.3,0.9,1.5]) y = z.y print(y)
Ausgabe:
0. 0.91345018 1.21332982 1.30691808 1.62660618 2.63179452
Siehe auch Runge-Kutta-Verfahren, Burg, Haf, Wille, Meister: Seite 55ff, Knorrenschild: Seite 157ff, Hanke-Bourgeois: Seite 565ff und [2].
Gedruckte Bücher (auszugsweise)
Bearbeiten- Burg, Haf, Wille, Meister: Höhere Mathematik für Ingenieure, Band III: Gewöhnliche Differentialgleichungen, Distributionen, Integraltransformationen. 5. Auflage, Vieweg+Teubner, 2009, ISBN 978-3-8348-0565-2
- Hanke-Bourgeois: Grundlagen der Numerischen Mathematik und des Wissenschaftlichen Rechnens. 3. Aufl., Vieweg+Teubner, 2009, ISBN 978-3-8348-0708-3
- Knorrenschild: Numerische Mathematik, Eine beispielorientierte Einführung. 6. Aufl., Hanser, 2017, ISBN 978-3-446-45161-2