Numerik1:Explizites Einschrittverfahren in der Praxis

=Explizite Einschrittverfahren in der Praxis=

Wiederholung:
Wir suchen mittels des Einschrittverfahren einen Näherungswert


 * $$y_h(L) \approx y(L)$$

für die Funktion


 * $$y : [0,L] \subset \mathbb{R} \rightarrow \mathbb{R}^d \,,$$

die folgendes System gewöhnlicher Differentialgleichungen und Anfangsbedingung erfüllt:

$$ (1) \quad y'(x) = f(x,y(x)) \,, \quad y(0) = y_0 \,. $$

Explizites Eulerverfahren

 * $$y_h(x+h) = y_h(x) + h f(x,y_h(x))$$

Taylor-Entwicklung

 * $$y(x+h) = y(x) + h f(x,y(x)) + \frac{1}{2} h^2 y''(x) + \mathcal{O}(h^3)$$

Sei


 * $$C = C(x) := 0.5 y''(x) \,.$$

Lokaler Fehler

 * $$y(x+h) - y_h(x+h) = C h^2 + \mathcal{O}(h^3)$$

Lokaler Diskretisierungsfehler

 * $$\frac{y(x+h) - y(x)}{h} - f(x,y(x)) = C h + \mathcal{O}(h^2)$$

Globaler Fehler
Aufpassen - wird der lokale Fehler mit der Schrittweite


 * $$h = \frac{L}{N}$$

N-mal gemacht, der globaler Fehler wird dann von der Ordnung h:


 * $$|y(L) - y_h(L)| = |C_1 h^2 + C_2 h^2 + \ldots + C_N h^2 + N \mathcal{O}(h^3)| \le C_{\max} L h + \mathcal{O}(h^2)$$

Implementierung
double euler(double L, int N, double y0, double *function) {

double h, x, y;

h = L/N; x = 0.0; y = y0;

while (x < L) { y = y + h*function(x,y); x = x + h; } return(y); }

Verwendung
Rufe das Program mit N und 2N Schritten auf und vergleiche die Ergebnisse.

Es folgt


 * $$y(L) - y_h(L) = C h$$

und


 * $$y(L) - y_{h/2}(L) = C_1 \frac{h}{2} \,.$$

Sei


 * $$C_1 \approx C$$

dann kann man die Richardson-Extrapolation verwenden:


 * $$y(L) \approx 2 y_{h/2}(L) - y_h(L)$$

1 Schritt mit der Schrittweite h

 * $$y_{h}(x+h) = y_{h}(x) + h f(x,y_{h}(x))$$

Es folgt


 * $$y(x+h) = y_{h}(x+h) + C h^2 + \mathcal{O}(h^3)$$

2 Schritte mit der Schrittweite h/2

 * $$y_{h/2}(x+0.5 h) = y_{h/2}(x) + 0.5 h f(x,y_{h/2}(x))$$

$$(2)\quad y_{h/2}(x+h) = y_{h/2}(x+h) + 0.5 h f(x+0.5 h,y_{h/2}(x+0.5 h))$$

Wenn man vermutet dass


 * $$y(x+h) = y_{h/2}(x+h) + 2 C \left(\frac{h}{2}\right)^2 + \mathcal{O}(h^3)$$

dann folgt es:


 * $$y(x+h) = 2 y_{h/2}(x+h) - y_h(x+h) + \mathcal{O}(h^3) \,.$$

Verbesserte Polygonzugsverfahren

 * $$y_{h}(x+h) = y(x) + 0.5 h \left(f(x,y(x)) + f(x+0.5 h,y_(x) + 0.5 h f(x,y(x))\right)$$

Abschätzung des lokalen Fehler

 * $$y(x+h) - y_{h}(x+h) = C h^2 + \mathcal{O}(h^3)$$


 * $$y(x+h) - (2 y_{h/2}(x+h) - y_h(x+h)) = \mathcal{O}(h^3)$$

Es folgt:


 * $$2 (y_{h/2}(x+h) - y_h(x+h)) = C h^2 + \mathcal{O}(h^3) \,.$$