Zum Inhalt springen

Ing Mathematik: Näherungsweises Lösen gewöhnlicher Dgl.

Aus Wikibooks


Numerisches Differenzieren

[Bearbeiten]

Die findiff-Funktion

[Bearbeiten]

Python-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

[Bearbeiten]
Brook Taylor (englischer Mathematiker, 1685-1731)
Joseph-Louis Lagrange (italienisch-französischer Mathematiker, 1736-1813)

Taylorpolynom:

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

[Bearbeiten]

Problem: 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

[Bearbeiten]

ist 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

[Bearbeiten]

Allgemeines

[Bearbeiten]

Die 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

[Bearbeiten]
Rudolf Lipschitz (deutscher Mathematiker, 1832-1903)

heiß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]
Charles Émile Picard (französischer Mathematiker, 1856-1941
Ernst Leonard Lindelöf (finnischer Mathematiker, 1870-1946)
  • 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

[Bearbeiten]

Zur Berechnung der Größe ist stets die Verfügbarkeit von ausreichend.

 Einschrittverfahren

Mehrschrittverfahren

[Bearbeiten]

Zur Berechnung der Lösung sind neben mit noch weitere Stützpunkte zu berücksichtigen.

 Mehrschrittverfahren

Explizite Verfahren

[Bearbeiten]

Weist die Verfahrensfunktion keine Abhängigkeit von auf, so heißt das Verfahren explizit.

Implizite Verfahren

[Bearbeiten]

Weist die Verfahrensfunktion eine Abhängigkeit von auf, so heißt das Verfahren implizit.

Steife Differenzialgleichungen

[Bearbeiten]

Bei 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

[Bearbeiten]
Leonhard Euler (schweizer Mathematiker und Naturwissenschaftler, 1707-1783)

Explizit

[Bearbeiten]
Augustin-Louis Cauchy (französischer Mathematiker, 1789-1857)

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

[Bearbeiten]
Carl David Tolmé Runge (deutscher Mathematiker, 1856-1927)

Es 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

[Bearbeiten]
Martin Wilhelm Kutta (deutscher Mathematiker, 1867-1944)

Das 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