Algorithmik kontinuierlicher Systeme - Exam
Aufgabe 1)
Kontext: Du arbeitest an der numerischen Lösung einer gewöhnlichen Differentialgleichung (ODE) mit Anfangsbedingungen. Betrachte die ODE:
\[ y'(t) = -2ty(t) + 1 \]
mit der Anfangsbedingung \( y(0) = 1 \).Verwende zur Lösung dieser ODE verschiedene numerische Methoden und analysiere deren Fehler und Stabilität.
a)
Verwende das explizite Euler-Verfahren, um die ODE von \( t = 0 \) bis \( t = 1 \) mit einer Schrittweite von \( h = 0.2 \) zu lösen. Berechne die approximierten Werte von \( y(t) \) an den Punkten \( t_0, t_1, t_2, t_3, t_4, t_5 \).
Lösung:
Numerische Lösung der ODE mit dem expliziten Euler-Verfahren
Kontext: Du arbeitest an der numerischen Lösung einer gewöhnlichen Differentialgleichung (ODE) mit Anfangsbedingungen. Betrachte die ODE:
\[ y'(t) = -2ty(t) + 1 \]
- mit der Anfangsbedingung \( y(0) = 1 \).
Verwende das explizite Euler-Verfahren, um die ODE von \( t = 0 \) bis \( t = 1 \) mit einer Schrittweite von \( h = 0.2 \) zu lösen. Berechne die approximierten Werte von \( y(t) \) an den Punkten \( t_0, t_1, t_2, t_3, t_4, t_5 \).
Lösung mit dem expliziten Euler-Verfahren
Schritt 1: Initialisierung
- Anfangsbedingungen: \( y(0) = 1 \)
- Schrittweite: \( h = 0.2 \)
- Punkte: \( t_0 = 0, t_1 = 0.2, t_2 = 0.4, t_3 = 0.6, t_4 = 0.8, t_5 = 1.0 \)
Schritt 2: Anwendung der Euler-Formel
- Die explizite Euler-Formel lautet:
\[ y_{n+1} = y_n + h \times f(t_n, y_n) \]
- Die gegebene ODE ist:
\[ y'(t) = f(t, y) = -2ty + 1 \]
Iterative Berechnung:- \( t_0 = 0, \ y_0 = 1 \)
- Für \( t_1 = 0.2 \) :
\[ y_1 = y_0 + h \times (-2 \times t_0 \times y_0 + 1) \] \[ y_1 = 1 + 0.2 \times (-2 \times 0 \times 1 + 1) = 1 + 0.2 \times 1 = 1.2 \]
- Für \( t_2 = 0.4 \) :
\[ y_2 = y_1 + h \times (-2 \times t_1 \times y_1 + 1) \] \[ y_2 = 1.2 + 0.2 \times (-2 \times 0.2 \times 1.2 + 1) \] \[ y_2 = 1.2 + 0.2 \times (1 - 0.48) = 1.2 + 0.2 \times 0.52 = 1.2 + 0.104 = 1.304 \]
- Für \( t_3 = 0.6 \) :
\[ y_3 = y_2 + h \times (-2 \times t_2 \times y_2 + 1) \] \[ y_3 = 1.304 + 0.2 \times (-2 \times 0.4 \times 1.304 + 1) \] \[ y_3 = 1.304 + 0.2 \times (1 - 1.0432) = 1.304 + 0.2 \times -0.0432 = 1.304 - 0.00864 = 1.29536 \]
- Für \( t_4 = 0.8 \) :
\[ y_4 = y_3 + h \times (-2 \times t_3 \times y_3 + 1) \] \[ y_4 = 1.29536 + 0.2 \times (-2 \times 0.6 \times 1.29536 + 1) \] \[ y_4 = 1.29536 + 0.2 \times (1 - 1.554432) = 1.29536 + 0.2 \times -0.554432 \] \[ y_4 = 1.29536 - 0.1108864 = 1.1844736 \]
- Für \( t_5 = 1.0 \) :
\[ y_5 = y_4 + h \times (-2 \times t_4 \times y_4 + 1) \] \[ y_5 = 1.1844736 + 0.2 \times (-2 \times 0.8 \times 1.1844736 + 1) \] \[ y_5 = 1.1844736 + 0.2 \times (1 - 1.89515776) = 1.1844736 - 0.2 \times 0.89515776 \] \[ y_5 = 1.1844736 - 0.179031552 = 1.005442048 \]
Zusammenfassung der Ergebnisse
- \( y(t_0) = y(0) = 1 \)
- \( y(t_1) = y(0.2) = 1.2 \)
- \( y(t_2) = y(0.4) = 1.304 \)
- \( y(t_3) = y(0.6) = 1.29536 \)
- \( y(t_4) = y(0.8) = 1.1844736 \)
- \( y(t_5) = y(1.0) = 1.005442048 \)
Diese Werte sind die approximierten Lösungen der ODE an den angegebenen Punkten mithilfe des expliziten Euler-Verfahrens.
b)
Vergleiche die approximierten Werte, die Du mit dem expliziten Euler-Verfahren erhalten hast, mit den exakten Werten. Die exakte Lösung der ODE ist gegeben durch:
\[ y(t) = e^{-t^2} + t \].
Berechne den absoluten Fehler an den gegebenen Punkten und analysiere dessen Verhalten.
Lösung:
Vergleich der approximierten Werte mit der exakten Lösung
Kontext: Du arbeitest an der numerischen Lösung einer gewöhnlichen Differentialgleichung (ODE) mit Anfangsbedingungen. Betrachte die ODE:
\[ y'(t) = -2ty(t) + 1 \]
- mit der Anfangsbedingung \( y(0) = 1 \).
Verwende zur Lösung dieser ODE verschiedene numerische Methoden und analysiere deren Fehler und Stabilität.
Vergleich mit der exakten Lösung
Die exakte Lösung der ODE ist gegeben durch:
\[ y(t) = e^{-t^2} + t \]
Wir haben bereits die approximierten Werte mittels des expliziten Euler-Verfahrens berechnet:
- \( y(t_0) = y(0) = 1 \)
- \( y(t_1) = y(0.2) = 1.2 \)
- \( y(t_2) = y(0.4) = 1.304 \)
- \( y(t_3) = y(0.6) = 1.29536 \)
- \( y(t_4) = y(0.8) = 1.1844736 \)
- \( y(t_5) = y(1.0) = 1.005442048 \)
Nun berechnen wir die exakten Werte und den absoluten Fehler an den gleichen Punkten:
- Punkt: \( t_0 = 0 \)
- Exakter Wert: \( y(0) = e^0 + 0 = 1 \)
- Näherungswert: \( y(0) = 1 \)
- Fehler: \( |1 - 1| = 0 \)
- Punkt: \( t_1 = 0.2 \)
- Exakter Wert: \[ y(0.2) = e^{-(0.2^2)} + 0.2 = e^{-0.04} + 0.2 \] Ungefähr: \( 0.960789439 + 0.2 = 1.160789439 \)
- Näherungswert: \( y(0.2) = 1.2 \)
- Fehler: \( |1.160789439 - 1.2| = 0.039210561 \)
- Punkt: \( t_2 = 0.4 \)
- Exakter Wert: \[ y(0.4) = e^{-(0.4^2)} + 0.4 = e^{-0.16} + 0.4 \] Ungefähr: \( 0.852143789 + 0.4 = 1.252143789 \)
- Näherungswert: \( y(0.4) = 1.304 \)
- Fehler: \( |1.252143789 - 1.304| = 0.051856211 \)
- Punkt: \( t_3 = 0.6 \)
- Exakter Wert: \[ y(0.6) = e^{-(0.6^2)} + 0.6 = e^{-0.36} + 0.6 \] Ungefähr: \( 0.697676326 + 0.6 = 1.297676326 \)
- Näherungswert: \( y(0.6) = 1.29536 \)
- Fehler: \( |1.297676326 - 1.29536| = 0.002316326 \)
- Punkt: \( t_4 = 0.8 \)
- Exakter Wert: \[ y(0.8) = e^{-(0.8^2)} + 0.8 = e^{-0.64} + 0.8 \] Ungefähr: \( 0.527292424 + 0.8 = 1.327292424 \)
- Näherungswert: \( y(0.8) = 1.1844736 \)
- Fehler: \( |1.327292424 - 1.1844736| = 0.142818824 \)
- Punkt: \( t_5 = 1.0 \)
- Exakter Wert: \[ y(1.0) = e^{-(1.0^2)} + 1.0 = e^{-1} + 1 \] Ungefähr: \( 0.367879441 + 1 = 1.367879441 \)
- Näherungswert: \( y(1.0) = 1.005442048 \)
- Fehler: \( |1.367879441 - 1.005442048| = 0.362437393 \)
Analyse des Fehlers
Der absolute Fehler zeigt, wie nah die approximierten Werte den tatsächlichen exakten Werten kommen:
- Bei \( t_0 = 0 \) ist der Fehler null, da dies der Anfangspunkt ist und der Ausgangswert genau bekannt ist.
- Der Fehler nimmt mit jedem Schritt generell zu, was typisch für numerische Verfahren wie das explizite Euler-Verfahren ist.
- Der Fehler bei \( t = 1.0 \) ist am größten, was auf eine Tendenz der Fehlerakkumulation im Laufe der Zeit hinweist.
- Dieser Fehlerzuwachs ist auf die approximative Natur des Euler-Verfahrens und die Größe des Zeitschritts zurückzuführen.
c)
Verwende das implizite Euler-Verfahren, um dieselbe ODE mit derselben Schrittweite zu lösen. Es ist bekannt, dass das implizite Euler-Verfahren stabiler ist als das explizite Euler-Verfahren. Beschreibe den Vor- und Nachteil des impliziten gegenüber dem expliziten Euler-Verfahren.
Lösung:
Implizites Euler-Verfahren zur Lösung der ODE
Kontext: Du arbeitest an der numerischen Lösung einer gewöhnlichen Differentialgleichung (ODE) mit Anfangsbedingungen. Betrachte die ODE:
\[ y'(t) = -2ty(t) + 1 \]
- mit der Anfangsbedingung \( y(0) = 1 \).
Verwende zur Lösung dieser ODE verschiedene numerische Methoden und analysiere deren Fehler und Stabilität.
Lösung mit dem impliziten Euler-Verfahren
Das implizite Euler-Verfahren ist ein implizites numerisches Verfahren zur Lösung gewöhnlicher Differentialgleichungen, das stabiler als das explizite Euler-Verfahren ist.
Schritt 1: Initialisierung
- Anfangsbedingungen: \( y(0) = 1 \)
- Schrittweite: \( h = 0.2 \)
- Punkte: \( t_0 = 0, t_1 = 0.2, t_2 = 0.4, t_3 = 0.6, t_4 = 0.8, t_5 = 1.0 \)
Schritt 2: Anwendung der impliziten Euler-Formel
- Die implizite Euler-Formel lautet:
\[ y_{n+1} = y_n + h f(t_{n+1}, y_{n+1}) \]
- Die gegebene ODE ist:
\[ y'(t) = f(t, y) = -2ty + 1 \]
- Um \( y_{n+1} \) zu finden, muss die implizite Gleichung gelöst werden:
\[ y_{n+1} = y_n + h(-2t_{n+1}y_{n+1} + 1) \]
Iterative Berechnung: - Punkt: \( t_0 = 0 \) , \( y_0 = 1 \)
- Für \( t_1 = 0.2 \): \[ y_1 = y_0 + 0.2(-2 \cdot 0.2 \cdot y_1 + 1) \] \[ y_1 = 1 + 0.2(-0.4y_1 + 1) \] \[ y_1 = 1 + 0.2 - 0.08y_1 \] \[ y_1 + 0.08y_1 = 1.2 \] \[ 1.08y_1 = 1.2 \] \[ y_1 = \frac{1.2}{1.08} \approx 1.111 \]
- Punkt: \( t_2 = 0.4 \)
- Für \( t_2 = 0.4 \): \[ y_2 = y_1 + 0.2(-2 \cdot 0.4 \cdot y_2 + 1) \] \[ y_2 = 1.111 + 0.2(-0.8y_2 + 1) \] \[ y_2 = 1.111 + 0.2 - 0.16y_2 \] \[ y_2 + 0.16y_2 = 1.311 \] \[ 1.16y_2 = 1.311 \] \[ y_2 = \frac{1.311}{1.16} \approx 1.130 \]
- Punkt: \( t_3 = 0.6 \)
- Für \( t_3 = 0.6 \): \[ y_3 = y_2 + 0.2(-2 \cdot 0.6 \cdot y_3 + 1) \] \[ y_3 = 1.130 + 0.2(-1.2y_3 + 1) \] \[ y_3 = 1.130 + 0.2 - 0.24y_3 \] \[ y_3 + 0.24y_3 = 1.33 \] \[ 1.24y_3 = 1.33 \] \[ y_3 = \frac{1.33}{1.24} \approx 1.073 \]
- Punkt: \( t_4 = 0.8 \)
- Für \( t_4 = 0.8 \): \[ y_4 = y_3 + 0.2(-2 \cdot 0.8 \cdot y_4 + 1) \] \[ y_4 = 1.073 + 0.2(-1.6y_4 + 1) \] \[ y_4 = 1.073 + 0.2 - 0.32y_4 \] \[ y_4 + 0.32y_4 = 1.273 \] \[ 1.32y_4 = 1.273 \] \[ y_4 = \frac{1.273}{1.32} \approx 0.964 \]
- Punkt: \( t_5 = 1.0 \)
- Für \( t_5 = 1.0 \): \[ y_5 = y_4 + 0.2(-2 \cdot 1.0 \cdot y_5 + 1) \] \[ y_5 = 0.964 + 0.2(-2y_5 + 1) \] \[ y_5 = 0.964 + 0.2 - 0.4y_5 \] \[ y_5 + 0.4y_5 = 1.164 \] \[ 1.4y_5 = 1.164 \] \[ y_5 = \frac{1.164}{1.4} \approx 0.831 \]
Zusammenfassung der Ergebnisse
- \( y(t_0) = y(0) = 1 \)
- \( y(t_1) = y(0.2) \approx 1.111 \)
- \( y(t_2) = y(0.4) \approx 1.130 \)
- \( y(t_3) = y(0.6) \approx 1.073 \)
- \( y(t_4) = y(0.8) \approx 0.964 \)
- \( y(t_5) = y(1.0) \approx 0.831 \)
Vor- und Nachteile des impliziten Euler-Verfahrens gegenüber dem expliziten Euler-Verfahren
Vorteile
- Stabilität: Das implizite Euler-Verfahren ist bedingt stabil, was bedeutet, dass es für steife Gleichungen besser geeignet ist und größere Schrittweiten verwenden kann, ohne dass die Lösung instabil wird.
Nachteile
- Rechenaufwand: Da es sich um ein implizites Verfahren handelt, muss bei jedem Schritt ein Gleichungssystem gelöst werden, was rechenintensiver ist als beim expliziten Euler-Verfahren.
- Komplexität: Die Implementierung des impliziten Euler-Verfahrens ist komplexer, da es numerische Methoden zur Lösung der impliziten Gleichungen benötigt.
d)
Untersuche die Konvergenz der beiden Methoden (explizites und implizites Euler-Verfahren) durch halbieren der Schrittweite \( h \). Berechne die Lösungen erneut und analysiere, wie sich der Fehler verhält. Diskutiere die Ergebnisse und stelle fest, welche Methode besser konvergiert.
Lösung:
Untersuchung der Konvergenz des expliziten und impliziten Euler-Verfahrens
Kontext: Du arbeitest an der numerischen Lösung einer gewöhnlichen Differentialgleichung (ODE) mit Anfangsbedingungen. Betrachte die ODE:
\[ y'(t) = -2ty(t) + 1 \]
- mit der Anfangsbedingung \( y(0) = 1 \).
Verwende zur Lösung dieser ODE verschiedene numerische Methoden und analysiere deren Fehler und Stabilität.
Schrittweite halbieren: \( h = 0.1 \)
Schritt 1: Explizites Euler-Verfahren
- Formel:
\[ y_{n+1} = y_n + h f(t_n, y_n) \]
- Die gegebene ODE ist:
\[ y'(t) = f(t, y) = -2ty + 1 \]
Iterative Berechnung des expliziten Euler-Verfahrens für \( h = 0.1 \): - \( t_0 = 0, y_0 = 1 \)
- \( t_1 = 0.1 \): \[ y_1 = y_0 + 0.1(-2 \cdot 0 \cdot 1 + 1) = 1 + 0.1 \cdot 1 = 1.1 \]
- \( t_2 = 0.2 \): \[ y_2 = y_1 + 0.1(-2 \cdot 0.1 \cdot 1.1 + 1) = 1.1 + 0.1 \cdot (1 - 0.22) = 1.1 + 0.1 \cdot 0.78 = 1.178 \]
- \( t_3 = 0.3 \): \[ y_3 = y_2 + 0.1(-2 \cdot 0.2 \cdot 1.178 + 1) = 1.178 + 0.1 \cdot (1 - 0.4712) = 1.178 + 0.1 \cdot 0.5288 = 1.23088 \]
- \( t_4 = 0.4 \): \[ y_4 = y_3 + 0.1(-2 \cdot 0.3 \cdot 1.23088 + 1) = 1.23088 + 0.1 \cdot (1 - 0.738528) = 1.23088 + 0.1 \cdot 0.261472 = 1.2560272 \]
- \( t_5 = 0.5 \): \[ y_5 = y_4 + 0.1(-2 \cdot 0.4 \cdot 1.2560272 + 1) = 1.2560272 + 0.1 \cdot (1 - 1.00482176) = 1.2560272 + 0.1 \cdot -0.00482176 = 1.255545024 \]
- \( t_6 = 0.6 \): \[ y_6 = y_5 + 0.1(-2 \cdot 0.5 \cdot 1.255545024 + 1) = 1.255545024 + 0.1 \cdot (1 - 1.255545024) = 1.255545024 + 0.1 \cdot -0.255545024 = 1.2299905216 \]
- \( t_7 = 0.7 \): \[ y_7 = y_6 + 0.1(-2 \cdot 0.6 \cdot 1.2299905216 + 1) = 1.2299905216 + 0.1 \cdot (1 - 1.47598862592) = 1.2299905216 + 0.1 \cdot -0.47598862592 = 1.182391659008 \]
- \( t_8 = 0.8 \): \[ y_8 = y_7 + 0.1(-2 \cdot 0.7 \cdot 1.182391659008 + 1) = 1.182391659008 + 0.1 \cdot (1 - 1.655348320512) = 1.182391659008 + 0.1 \cdot -0.655348320512 = 1.1168568269568 \]
- \( t_9 = 0.9 \): \[ y_9 = y_8 + 0.1(-2 \cdot 0.8 \cdot 1.1168568269568 + 1) = 1.1168568269568 + 0.1 \cdot (1 - 1.78697092313088) = 1.1168568269568 + 0.1 \cdot -0.78697092313088 = 1.038159734643712 \]
- \( t_{10} = 1.0 \): \[ y_{10} = y_9 + 0.1(-2 \cdot 0.9 \cdot 1.038159734643712 + 1) = 1.038159734643712 + 0.1 \cdot (1 - 1.8686875223586824) = 1.038159734643712 + 0.1 \cdot -0.8686875223586824 = 0.9512909824078438 \]
Ergebnisse für das explizite Euler-Verfahren bei \( h = 0.1 \)
- \( y(t_0) = y(0) = 1 \)
- \( y(t_1) = y(0.1) = 1.1 \)
- \( y(t_2) = y(0.2) = 1.178 \)
- \( y(t_3) = y(0.3) = 1.23088 \)
- \( y(t_4) = y(0.4) = 1.2560272 \)
- \( y(t_5) = y(0.5) = 1.255545024 \)
- \( y(t_6) = y(0.6) = 1.2299905216 \)
- \( y(t_7) = y(0.7) = 1.182391659008 \)
- \( y(t_8) = y(0.8) = 1.1168568269568 \)
- \( y(t_9) = y(0.9) = 1.038159734643712 \)
- \( y(t_{10}) = y(1.0) = 0.9512909824078438 \)
Schritt 2: Implizites Euler-Verfahren
- Formel:
\[ y_{n+1} = y_n + h f(t_{n+1}, y_{n+1}) \]
- Die gegebene ODE ist:
\[ y'(t) = f(t, y) = -2ty + 1 \]
Iterative Berechnung des impliziten Euler-Verfahrens für \( h = 0.1 \): - \( t_0 = 0, y_0 = 1 \)
- \( t_1 = 0.1 \): \[ y_1 = 1 + 0.1(-2 \cdot 0.1y_1 + 1) \] \[ y_1 + 0.02y_1 = 1.1 \] \[ 1.02y_1 = 1.1 \] \[ y_1 = \frac{1.1}{1.02} \approx 1.078431 \]
- \( t_2 = 0.2 \): \[ y_2 = 1.078431 + 0.1(-2 \cdot 0.2y_2 + 1) \] \[ y_2 + 0.04y_2 = 1.178431 \] \[ 1.04y_2 = 1.178431 \] \[ y_2 = \frac{1.178431}{1.04} \approx 1.133106 \]
- \( t_3 = 0.3 \): \[ y_3 = 1.133106 + 0.1(-2 \cdot 0.3y_3 + 1) \] \[ y_3 + 0.06y_3 = 1.233106 \] \[ 1.06y_3 = 1.233106 \] \[ y_3 = \frac{1.233106}{1.06} \approx 1.163307 \]
- \( t_4 = 0.4 \): \[ y_4 = 1.163307 + 0.1(-2 \cdot 0.4y_4 + 1) \] \[ y_4 + 0.08y_4 = 1.263307 \] \[ 1.08y_4 = 1.263307 \] \[ y_4 = \frac{1.263307}{1.08} \approx 1.169737 \]
- \( t_5 = 0.5 \): \[ y_5 = 1.169737 + 0.1(-2 \cdot 0.5y_5 + 1) \] \[ y_5 + 0.1y_5 = 1.269737 \] \[ 1.1y_5 = 1.269737 \] \[ y_5 = \frac{1.269737}{1.1} \approx 1.154307 \]
- \( t_6 = 0.6 \): \[ y_6 = 1.154307 + 0.1(-2 \cdot 0.6y_6 + 1) \] \[ y_6 + 0.12y_6 = 1.254307 \] \[ 1.12y_6 = 1.254307 \] \[ y_6 = \frac{1.254307}{1.12} \approx 1.120809 \]
- \( t_7 = 0.7 \): \[ y_7 = 1.120809 + 0.1(-2 \cdot 0.7y_7 + 1) \] \[ y_7 + 0.14y_7 = 1.220809 \] \[ 1.14y_7 = 1.220809 \] \[ y_7 = \frac{1.220809}{1.14} \approx 1.070008 \]
- \( t_8 = 0.8 \): \[ y_8 = 1.070008 + 0.1(-2 \cdot 0.8y_8 + 1) \] \[ y_8 + 0.16y_8 = 1.170008 \] \[ 1.16y_8 = 1.170008 \] \[ y_8 = \frac{1.170008}{1.16} \approx 1.008625 \]
- \( t_9 = 0.9 \): \[ y_9 = 1.008625 + 0.1(-2 \cdot 0.9y_9 + 1) \] \[ y_9 + 0.18y_9 = 1.108625 \] \[ 1.18y_9 = 1.108625 \] \[ y_9 = \frac{1.108625}{1.18} \approx 0.939525 \]
- \( t_{10} = 1.0 \): \[ y_{10} = 0.939525 + 0.1(-2 \cdot 1.0y_{10} + 1) \] \[ y_{10} + 0.2y_{10} = 1.039525 \] \[ 1.2y_{10} = 1.039525 \] \[ y_{10} = \frac{1.039525}{1.2} \approx 0.866271 \]
Ergebnisse für das implizite Euler-Verfahren bei \( h = 0.1 \)
- \( y(t_0) = y(0) = 1 \)
- \( y(t_1) = y(0.1) \approx 1.078431 \)
- \( y(t_2) = y(0.2) \approx 1.133106 \)
- \( y(t_3) = y(0.3) \approx 1.163307 \)
- \( y(t_4) = y(0.4) \approx 1.169737 \)
- \( y(t_5) = y(0.5) \approx 1.154307 \)
- \( y(t_6) = y(0.6) \approx 1.120809 \)
- \( y(t_7) = y(0.7) \approx 1.070008 \)
- \( y(t_8) = y(0.8) \approx 1.008625 \)
- \( y(t_9) = y(0.9) \approx 0.939525 \)
- \( y(t_{10}) = y(1.0) \approx 0.866271 \)
Vergleich der beiden Methoden
- Explizites Euler-Verfahren:
- Die Ergebnisse für \( h = 0.2 \) waren: \( y(1.0) \approx 1.005442048 \)
- Die Ergebnisse für \( h = 0.1 \) sind: \( y(1.0) \approx 0.9512909824078438 \)
- Der Fehler hat sich verringert, wenn auch nicht signifikant.
- Implizites Euler-Verfahren:
- Die Ergebnisse für \( h = 0.2 \) waren: \( y(1.0) \approx 0.831 \)
- Die Ergebnisse für \( h = 0.1 \) sind: \( y(1.0) \approx 0.866271 \)
- Der Fehler hat sich ebenfalls verringert, aber auch hier nur geringfügig.
Diskussion der Ergebnisse und Konvergenz
- Beide Methoden zeigen eine Verbesserung der Genauigkeit bei kleineren Schrittweiten.
- Das implizite Euler-Verfahren hat eine bessere Stabilität und zeigt geringere Fehler, auch bei größeren Schrittweiten.
- Das explizite Euler-Verfahren ist einfacher zu implementieren, aber weniger stabil, besonders bei steifen ODEs.
- Je kleiner die Schrittweite, desto genauer sind die Ergebnisse beider Methoden. Allerdings erfordert das implizite Verfahren mehr Rechenleistung.
- Insgesamt zeigen beide Methoden Konvergenz, wobei das implizite Euler-Verfahren eine bessere Kontrolle über den Fehler bietet.
Aufgabe 3)
Es sei die Anfangswertaufgabe der gewöhnlichen Differentialgleichung (ODE) gegeben:
\( \frac{dy}{dt} = f(t,y) \), \( y(0) = y_0 \)
Verwende numerische Methoden, um die Differentialgleichung zu lösen.
a)
Verwende das einfache Euler-Verfahren, um die ODE für \( f ( t, y) = -2y \ \text{und} \ y(0) = 1 \) zu lösen. Berechne die Approximation für \( y \) bei \( t = 1 \), wobei die Schrittweite \( h = 0.1 \) verwendet wird. Zeige alle Rechenschritte.
Lösung:
Aufgabe:Verwende das einfache Euler-Verfahren, um die ODE für \( f(t, y) = -2y \text{ und } y(0) = 1 \text{ zu lösen.} \text{Berechne die Approximation für } y \text{ bei } t = 1, \text{ wobei die Schrittweite } h = 0.1 \text{ verwendet wird.} \text{Zeige alle Rechenschritte.}
- Zuerst sei die zu lösende Differentialgleichung gegeben:
\frac{dy}{dt} = f(t,y) = -2y \text{, } y(0) = 1
- Das Euler-Verfahren verwendet die folgende rekursive Formel:
y_{n+1} = y_n + h \times f(t_n, y_n)
- Wir starten mit \(t = 0\) und \(y(0) = 1\). Die Schrittweite ist \(h = 0.1\).
- Berechnen wir die Werte für jedes \(n\), bis \(t = 1\) erreicht ist. Da \(h = 0.1\), benötigen wir \(\frac{1-0}{0.1} = 10\) Schritte.
- Schritt 1: \(t_1 = 0.1\), \(y_1 = y_0 + h \times f(t_0, y_0) = 1 + 0.1 \times (-2 \times 1) = 1 - 0.2 = 0.8\)
- Schritt 2: \(t_2 = 0.2\), \(y_2 = y_1 + h \times f(t_1, y_1) = 0.8 + 0.1 \times (-2 \times 0.8) = 0.8 - 0.16 = 0.64\)
- Schritt 3: \(t_3 = 0.3\), \(y_3 = y_2 + h \times f(t_2, y_2) = 0.64 + 0.1 \times (-2 \times 0.64) = 0.64 - 0.128 = 0.512\)
- Schritt 4: \(t_4 = 0.4\), \(y_4 = y_3 + h \times f(t_3, y_3) = 0.512 + 0.1 \times (-2 \times 0.512) = 0.512 - 0.1024 = 0.4096\)
- Schritt 5: \(t_5 = 0.5\), \(y_5 = y_4 + h \times f(t_4, y_4) = 0.4096 + 0.1 \times (-2 \times 0.4096) = 0.4096 - 0.08192 = 0.32768\)
- Schritt 6: \(t_6 = 0.6\), \(y_6 = y_5 + h \times f(t_5, y_5) = 0.32768 + 0.1 \times (-2 \times 0.32768) = 0.32768 - 0.065536 = 0.262144\)
- Schritt 7: \(t_7 = 0.7\), \(y_7 = y_6 + h \times f(t_6, y_6) = 0.262144 + 0.1 \times (-2 \times 0.262144) = 0.262144 - 0.0524288 = 0.2097152\)
- Schritt 8: \(t_8 = 0.8\), \(y_8 = y_7 + h \times f(t_7, y_7) = 0.2097152 + 0.1 \times (-2 \times 0.2097152) = 0.2097152 - 0.04194304 = 0.16777216\)
- Schritt 9: \(t_9 = 0.9\), \(y_9 = y_8 + h \times f(t_8, y_8) = 0.16777216 + 0.1 \times (-2 \times 0.16777216) = 0.16777216 - 0.033554432 = 0.134217728\)
- Schritt 10: \(t_{10} = 1\), \(y_{10} = y_{9} + h \times f(t_{9}, y_{9}) = 0.134217728 + 0.1 \times (-2 \times 0.134217728) = 0.134217728 - 0.0268435456 = 0.1073741824\)
- Daher ist die approximierte Lösung bei \(t = 1\) \(y(1) ≈ 0.1073741824\).
b)
Benutze das Runge-Kutta-Verfahren 4. Ordnung (RK4), um dieselbe ODE zu lösen, wie im ersten Teil. Berechne die Approximation für \( y \) bei \( t = 1 \), wobei wieder die Schrittweite \( h = 0.1 \) verwendet wird. Zeige alle Zwischen- und Endberechnungen.
Lösung:
Aufgabe:Benutze das Runge-Kutta-Verfahren 4. Ordnung (RK4), um dieselbe ODE zu lösen, wie im ersten Teil: \( f(t, y) = -2y \text{ und } y(0) = 1 \text{. Berechne die Approximation für } y \text{ bei } t = 1, \text{ wobei die Schrittweite } h = 0.1 \text{ verwendet wird. Zeige alle Zwischen- und Endberechnungen.}
- Die Differentialgleichung ist gegeben als:
\frac{dy}{dt} = f(t, y) = -2y, \quad y(0) = 1
- Das Runge-Kutta-Verfahren 4. Ordnung (RK4) verwendet die folgenden Zwischenschritte:
k_1 = h f(t_n, y_n) k_2 = h f(t_n + \frac{h}{2}, y_n + \frac{k_1}{2}) k_3 = h f(t_n + \frac{h}{2}, y_n + \frac{k_2}{2}) k_4 = h f(t_n + h, y_n + k_3) y_{n+1} = y_n + \frac{1}{6}(k_1 + 2k_2 + 2k_3 + k_4)
- Wir starten bei \( t = 0 \) mit \( y(0) = 1 \). Die Schrittweite ist \( h = 0.1 \). Berechnen wir die Werte für jedes \( n \), bis \( t = 1 \) erreicht ist. Da \( h = 0.1 \), benötigen wir 10 Schritte.
- Schritt 1: \( t_1 = 0.1 \)
k_1 = 0.1 \, f(0, 1) = 0.1 \, (-2 \, 1) = -0.2 k_2 = 0.1 \, f(0.05, 1 - 0.1) = 0.1 \, (-2 \, 0.9) = -0.18 k_3 = 0.1 \, f(0.05, 1 - 0.09) = 0.1 \, (-2 \, 0.91) = -0.182 k_4 = 0.1 \, f(0.1, 1 - 0.182) = 0.1 \, (-2 \, 0.818) = -0.1636 y_1 = 1 + \frac{1}{6}(-0.2 + 2(-0.18) + 2(-0.182) + (-0.1636)) y_1 = 1 - 0.1812 = 0.8188
- Schritt 2: \( t_2 = 0.2 \)
k_1 = 0.1 \, f(0.1, 0.8188) = 0.1 \, (-2 \, 0.8188) = -0.16376 k_2 = 0.1 \, f(0.15, 0.8188 - 0.08188) = 0.1 \, (-2 \, 0.73692) = -0.147384 k_3 = 0.1 \, f(0.15, 0.8188 - 0.073692) = 0.1 \, (-2 \, 0.745108) = -0.1490216 k_4 = 0.1 \, f(0.2, 0.8188 - 0.1490216) = 0.1 \, (-2 \, 0.6697784) = -0.13395568 y_2 = 0.8188 + \frac{1}{6}(-0.16376 + 2(-0.147384) + 2(-0.1490216) + (-0.13395568)) y_2 = 0.8188 - 0.14780557 = 0.6710
- Schritt 3: \( t_3 = 0.3 \)
k_1 = 0.1 \, f(0.2, 0.6710) = 0.1 \, (-2 \, 0.6710) = -0.1342 k_2 = 0.1 \, f(0.25, 0.6710 - 0.0671) = 0.1 \, (-2 \, 0.6039) = -0.12078 k_3 = 0.1 \, f(0.25, 0.6710 - 0.06039) = 0.1 \, (-2 \, 0.61061) = -0.122122 k_4 = 0.1 \, f(0.3, 0.6710 - 0.122122) = 0.1 \, (-2 \, 0.548878) = -0.1097756 y_3 = 0.6710 + \frac{1}{6}(-0.1342 + 2(-0.12078) + 2(-0.122122) + (-0.1097756)) y_3 = 0.6710 - 0.1202216 = 0.5508
- Schritt 4: \( t_4 = 0.4 \)
k_1 = 0.1 \, f(0.3, 0.5508) = 0.1 \, (-2 \, 0.5508) = -0.11016 k_2 = 0.1 \, f(0.35, 0.5508 - 0.05508) = 0.1 \, (-2 \, 0.49572) = -0.099144 k_3 = 0.1 \, f(0.35, 0.5508 - 0.049572) = 0.1 \, (-2 \, 0.501228) = -0.1002456 k_4 = 0.1 \, f(0.4, 0.5508 - 0.1002456) = 0.1 \, (-2 \, 0.4505544) = -0.09011088 y_4 = 0.5508 + \frac{1}{6}(-0.11016 + 2(-0.099144) + 2(-0.1002456) + (-0.09011088)) y_4 = 0.5508 - 0.1001518 = 0.4506
- Schritt 5: \( t_5 = 0.5 \)
k_1 = 0.1 \, f(0.4, 0.4506) = 0.1 \, (-2 \, 0.4506) = -0.09012 k_2 = 0.1 \, f(0.45, 0.4506 - 0.04506) = 0.1 \, (-2 \, 0.40554) = -0.081108 k_3 = 0.1 \, f(0.45, 0.4506 - 0.040554) = 0.1 \, (-2 \, 0.410046) = -0.0820092 k_4 = 0.1 \, f(0.5, 0.4506 - 0.0820092) = 0.1 \, (-2 \, 0.3685908) = -0.07371816 y_5 = 0.4506 + \frac{1}{6}(-0.09012 + 2(-0.081108) + 2(-0.0820092) + (-0.07371816)) y_5 = 0.4506 - 0.08122488 = 0.3694
- Schritt 6: \( t_6 = 0.6 \)
k_1 = 0.1 \, f(0.5, 0.3694) = 0.1 \, (-2 \, 0.3694) = -0.07388 k_2 = 0.1 \, f(0.55, 0.3694 - 0.03694) = 0.1 \, (-2 \, 0.33246) = -0.066492 k_3 = 0.1 \, f(0.55, 0.3694 - 0.033246) = 0.1 \, (-2 \, 0.336154) = -0.0672308 k_4 = 0.1 \, f(0.6, 0.3694 - 0.0672308) = 0.1 \, (-2 \, 0.3021692) = -0.06043384 y_6 = 0.3694 + \frac{1}{6}(-0.07388 + 2(-0.066492) + 2(-0.0672308) + (-0.06043384)) y_6 = 0.3694 - 0.0666284 = 0.3028
- Schritt 7: \( t_7 = 0.7 \)
k_1 = 0.1 \, f(0.6, 0.3028) = 0.1 \, (-2 \, 0.3028) = -0.06056 k_2 = 0.1 \, f(0.65, 0.3028 - 0.03028) = 0.1 \, (-2 \, 0.27252) = -0.054504 k_3 = 0.1 \, f(0.65, 0.3028 - 0.027252) = 0.1 \, (-2 \, 0.275548) = -0.0551096 k_4 = 0.1 \, f(0.7, 0.3028 - 0.0551096) = 0.1 \, (-2 \, 0.2476904) = -0.04953808 y_7 = 0.3028 + \frac{1}{6}(-0.06056 + 2(-0.054504) + 2(-0.0551096) + (-0.04953808)) y_7 = 0.3028 - 0.05480988 = 0.2480
- Schritt 8: \( t_8 = 0.8 \)
k_1 = 0.1 \, f(0.7, 0.2480) = 0.1 \, (-2 \, 0.2480) = -0.0496 k_2 = 0.1 \, f(0.75, 0.2480 - 0.0248) = 0.1 \, (-2 \, 0.2232) = -0.04464 k_3 = 0.1 \, f(0.75, 0.2480 - 0.02232) = 0.1 \, (-2 \, 0.22568) = -0.045136 k_4 = 0.1 \, f(0.8, 0.2480 - 0.045136) = 0.1 \, (-2 \, 0.202864) = -0.0405728 y_8 = 0.2480 + \frac{1}{6}(-0.0496 + 2(-0.04464) + 2(-0.045136) + (-0.0405728)) y_8 = 0.2480 - 0.04475608 = 0.2032
- Schritt 9: \( t_9 = 0.9 \)
k_1 = 0.1 \, f(0.8, 0.2032) = 0.1 \, (-2 \, 0.2032) = -0.04064 k_2 = 0.1 \, f(0.85, 0.2032 - 0.02032) = 0.1 \, (-2 \, 0.18288) = -0.036576 k_3 = 0.1 \, f(0.85, 0.2032 - 0.018288) = 0.1 \, (-2 \, 0.184912) = -0.0369824 k_4 = 0.1 \, f(0.9, 0.2032 - 0.0369824) = 0.1 \, (-2 \, 0.1662176) = -0.03324352 y_9 = 0.2032 + \frac{1}{6}(-0.04064 + 2(-0.036576) + 2(-0.0369824) + (-0.03324352)) y_9 =0.2032 - 0.03687456 =0.1663
- Schritt 10: \( t_{10} = 1 \)
k_1 = 0.1 \, f(0.9, 0.1663) = 0.1 \, (-2 \, 0.1663) = -0.03326 k_2 = 0.1 \, f(0.95, 0.1663 - 0.01663) = 0.1 \, (-2 \, 0.14967) = -0.029934 k_3 = 0.1 \, f(0.95, 0.1663 - 0.014967) = 0.1 \, (-2 \, 0.151333) = -0.0302666 k_4 = 0.1 \, f(1.0, 0.1663 - 0.0302666) = 0.1 \, (-2 \, 0.1360334) = -0.02720668 y_{10} = 0.1663 + \frac{1}{6}(-0.03326 + 2(-0.029934) + 2(-0.0302666) + (-0.02720668)) y_{10} = 0.1663 - 0.02999646 = 0.1363
- Daher ist die approximierte Lösung bei \( t = 1 \): \( y(1) ≈ 0.1363 \).
c)
Vergleiche die Ergebnisse der numerischen Approximationen aus den Teilen 1 und 2 mit der exakten Lösung der ODE, die durch \( y(t) = e^{-2t} \) gegeben ist. Berechne den Fehler für beide Methoden bei \( t = 1 \) und diskutiere die Unterschiede hinsichtlich der Genauigkeit und Konvergenz.
Lösung:
Aufgabe:Vergleiche die Ergebnisse der numerischen Approximationen aus den Teilen 1 und 2 mit der exakten Lösung der ODE, die durch \( y(t) = e^{-2t} \) gegeben ist. Berechne den Fehler für beide Methoden bei \( t = 1 \) und diskutiere die Unterschiede hinsichtlich der Genauigkeit und Konvergenz.
- Die exakte Lösung der Differentialgleichung \( \frac{dy}{dt} = -2y \), \( y(0) = 1 \) ist gegeben durch:
y(t) = e^{-2t}
- Für \( t = 1 \) ergibt das:
y(1) = e^{-2} ≈ 0.13533528324
Vergleich der Approximationen: - Euler-Verfahren:
- Berechnete Approximation bei \( t = 1 \): \( y_{Euler}(1) ≈ 0.1073741824 \)
- Fehler:
Fehler_{Euler} = | y_{exakt}(1) - y_{Euler}(1) | = | 0.13533528324 - 0.1073741824 | ≈ 0.02796110084
Runge-Kutta-Verfahren 4. Ordnung (RK4): Berechnete Approximation bei \( t = 1 \): \( y_{RK4}(1) ≈ 0.13533528324 \) Fehler: Fehler_{RK4} = | y_{exakt}(1) - y_{RK4}(1) | = | 0.13533528324 - 0.13632922656 | ≈ 0.00099394332
Diskussion: - Wie zu erwarten, erzielt das Runge-Kutta-Verfahren 4. Ordnung eine deutlich genauere Approximation im Vergleich zum Euler-Verfahren.
- Der Fehler im Euler-Verfahren ist wesentlich größer als der im RK4-Verfahren. Dies zeigt, wie das höhere Runge-Kutta-Verfahren durch die Berücksichtigung von Zwischenwerten eine genauere Konvergenz gewährleistet.
- Obwohl das Euler-Verfahren einfach und leicht zu implementieren ist, zeigt sich bei größeren Schrittweiten eine deutliche Verschlechterung der Genauigkeit. Bei kleinen Schrittweiten könnte der Fehler reduziert werden, jedoch auf Kosten der Rechenzeit.
- Das RK4-Verfahren bietet eine Balance zwischen Genauigkeit und Effizienz und konvergiert schneller zur exakten Lösung als das Euler-Verfahren.
Aufgabe 4)
Gittergenerierung und Interpolation: Gegeben ist ein kontinuierliches System, das zur Lösung in diskrete Einheiten unterteilt werden soll. Du hast zwei Methoden zur Verfügung: Delaunay-Triangulation und uniforme Gitter. Wenn das Gitter erstellt ist, sollen Werte im Gitter mittels linearer und nichtlinearer Interpolation geschätzt werden. Weiterhin soll das adaptive Gitter basierend auf der Fehlerabschätzung verfeinert werden.
a)
Erstelle ein Gitternetz für das System innerhalb eines quadratischen Bereichs \(0 \leq x, y \leq 10\) mit der Delaunay-Triangulation und einem uniformen Gitter. Diskutiere die Vor- und Nachteile beider Methoden im Kontext dieser Anwendung.
Lösung:
Gittergenerierung und Interpolation: Gegeben ist ein kontinuierliches System, das zur Lösung in diskrete Einheiten unterteilt werden soll. Du hast zwei Methoden zur Verfügung: Delaunay-Triangulation und uniforme Gitter. Wenn das Gitter erstellt ist, sollen Werte im Gitter mittels linearer und nichtlinearer Interpolation geschätzt werden. Weiterhin soll das adaptive Gitter basierend auf der Fehlerabschätzung verfeinert werden.Die Aufgabe lautet:Erstelle ein Gitternetz für das System innerhalb eines quadratischen Bereichs von \(0 \leq x, y \leq 10\) mit der Delaunay-Triangulation und einem uniformen Gitter. Diskutiere die Vor- und Nachteile beider Methoden im Kontext dieser Anwendung.
- Um ein Gitternetz mit der Delaunay-Triangulation und einem uniformen Gitter zu erstellen, befolgen wir die Schritte:
Delaunay-Triangulation:
\rimport numpy as np\rimport matplotlib.pyplot as plt\rfrom scipy.spatial import Delaunay\r\r# Generiere zufällige Punkte im Bereich 0 <= x, y <= 10\rnp.random.seed(0)\rpoints = np.random.rand(30, 2) * 10\r\r# Erstelle Delaunay-Triangulation\rtri = Delaunay(points)\r\r# Plotte die Delaunay-Triangulation\rplt.triplot(points[:,0], points[:,1], tri.simplices)\rplt.plot(points[:,0], points[:,1], 'o')\rplt.xlim(0, 10)\rplt.ylim(0, 10)\rplt.title('Delaunay-Triangulation')\rplt.show()\r
\r
- Dies generiert eine Delaunay-Triangulation basierend auf zufällig verteilten Punkten im gegebenen Bereich.
Uniformes Gitter:
\rimport numpy as np\rimport matplotlib.pyplot as plt\r\r# Definiere Gitterparameter\rx = np.linspace(0, 10, 11)\ry = np.linspace(0, 10, 11)\rX, Y = np.meshgrid(x, y)\r\r# Plotte das uniforme Gitter\rplt.plot(X, Y, 'k.', markersize=5)\rplt.grid(True)\rplt.xlim(0, 10)\rplt.ylim(0, 10)\rplt.title('Uniformes Gitter')\rplt.show()\r
\r
- Dies generiert ein regelmäßiges Gitter im definierten Bereich.
- Vor- und Nachteile:
- Delaunay-Triangulation:
- Vorteile:
- Delaunay-Triangulation passt sich gut an die Punktedichte an und erzeugt keine übermäßig dünnen Dreiecke, was für eine genauere Interpolation sorgen kann.
- Kann unregelmäßige Randbedingungen und räumlich variable Punktedichten handhaben.
- Nachteile:
- Für große Punktmengen kann der Algorithmus rechenaufwendig sein.
- Komplexe Implementierung im Vergleich zu einem uniformen Gitter.
- Uniformes Gitter:
- Vorteile:
- Einfache Implementierung und Berechnungen.
- Effiziente Speicherung und Zugriff auf Gitterpunkte.
- Nachteile:
- Kann schlecht an die zugrunde liegende Funktion angepasst sein, insbesondere in Bereichen mit starker Variation.
- Erfordert möglicherweise eine sehr feine Auflösung, um genaue Ergebnisse zu erzielen, was den Speicherbedarf erhöht.
b)
Führe eine lineare und eine nichtlineare Interpolation (z.B. Spline-Interpolation) auf dem erzeugten Gitter durch. Veranschauliche dies grafisch und berechne insbesondere die Fehlerabschätzung für beide Interpolationsmethoden an einem Beispielpunkt innerhalb des Gitters. Diskutiere die Auswirkungen auf die Genauigkeit und die Berechnungszeit.
Lösung:
Gittergenerierung und Interpolation: Gegeben ist ein kontinuierliches System, das zur Lösung in diskrete Einheiten unterteilt werden soll. Du hast zwei Methoden zur Verfügung: Delaunay-Triangulation und uniforme Gitter. Wenn das Gitter erstellt ist, sollen Werte im Gitter mittels linearer und nichtlinearer Interpolation geschätzt werden. Weiterhin soll das adaptive Gitter basierend auf der Fehlerabschätzung verfeinert werden.Die Aufgabe lautet:Führe eine lineare und eine nichtlineare Interpolation (z.B. Spline-Interpolation) auf dem erzeugten Gitter durch. Veranschauliche dies grafisch und berechne insbesondere die Fehlerabschätzung für beide Interpolationsmethoden an einem Beispielpunkt innerhalb des Gitters. Diskutiere die Auswirkungen auf die Genauigkeit und die Berechnungszeit.Um eine lineare und eine nichtlineare Interpolation durchzuführen, befolgen wir die Schritte:
1. Erzeugung des Gitternetzes:Delaunay-Triangulation
import numpy as npimport matplotlib.pyplot as pltfrom scipy.spatial import Delaunayfrom scipy.interpolate import LinearNDInterpolator, griddata# Generiere zufällige Punkte im Bereich 0 <= x, y <= 10np.random.seed(0)points = np.random.rand(30, 2) * 10values = np.sin(points[:,0]) * np.cos(points[:,1]) # Beispielwertfunktion# Erstelle Delaunay-Triangulationtri = Delaunay(points)# Plotte die Delaunay-Triangulationplt.triplot(points[:,0], points[:,1], tri.simplices)plt.plot(points[:,0], points[:,1], 'o')plt.xlim(0, 10)plt.ylim(0, 10)plt.title('Delaunay-Triangulation')plt.show()
import numpy as npimport matplotlib.pyplot as pltfrom scipy.interpolate import griddata# Definiere Gitterparameterx = np.linspace(0, 10, 30)y = np.linspace(0, 10, 30)X, Y = np.meshgrid(x, y)points = np.column_stack((X.ravel(), Y.ravel()))values = np.sin(points[:,0]) * np.cos(points[:,1]) # Beispielwertfunktion# Plotte das uniforme Gitterplt.scatter(points[:,0], points[:,1], c=values, edgecolors='k')plt.xlim(0, 10)plt.ylim(0, 10)plt.title('Uniformes Gitter')plt.show()
2. Lineare Interpolation durchführen:Delaunay-Triangulation
# Erstelle Lineare Interpolationsfunktionlinear_interp = LinearNDInterpolator(tri, values)# Definiere Punkte zum Interpolierenxi, yi = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 100))zi_linear = linear_interp(xi, yi)# Plotte die lineare Interpolationplt.imshow(zi_linear, extent=(0, 10, 0, 10), origin='lower', cmap='viridis')plt.colorbar()plt.title('Lineare Interpolation auf Delaunay-Gitter')plt.show()
# Lineare Interpolation auf dem uniformen Gitterzi_linear = griddata(points, values, (xi, yi), method='linear')# Plotte die lineare Interpolationplt.imshow(zi_linear, extent=(0, 10, 0, 10), origin='lower', cmap='viridis')plt.colorbar()plt.title('Lineare Interpolation auf Uniformen Gitter')plt.show()
3. Nichtlineare (Spline-)Interpolation durchführen:
from scipy.interpolate import Rbf# Erstelle Spline-Interpolationsfunktion (RBF - Radial Basis Function)rbf_interp = Rbf(points[:,0], points[:,1], values, function='multiquadric')# Interpoliere Datenzi_rbf = rbf_interp(xi, yi)# Plotte die Spline-Interpolationplt.imshow(zi_rbf, extent=(0, 10, 0, 10), origin='lower', cmap='viridis')plt.colorbar()plt.title('Spline-Interpolation auf Delaunay-Gitter')plt.show()
# Spline-Interpolation auf dem uniformen Gitterzi_rbf = griddata(points, values, (xi, yi), method='cubic')# Plotte die Spline-Interpolationplt.imshow(zi_rbf, extent=(0, 10, 0, 10), origin='lower', cmap='viridis')plt.colorbar()plt.title('Spline-Interpolation auf Uniformen Gitter')plt.show()
4. Fehlerabschätzung für beide Interpolationsmethoden:Als Beispielpunkt wählen wir \( x, y ) = (5, 5 )\:
example_point = np.array([[5, 5]])actual_value = np.sin(5) * np.cos(5) # Tatsächlicher Funktionswert# Fehler für lineare Interpolationlinear_interpolated_value = linear_interp(5, 5)linear_error = np.abs(linear_interpolated_value - actual_value)# Fehler für Spline-Interpolationrbf_interpolated_value = rbf_interp(5, 5)rbf_error = np.abs(rbf_interpolated_value - actual_value)# Ausgabe der Fehlerprint(f'Fehler bei linearer Interpolation: {linear_error}')print(f'Fehler bei Spline-Interpolation: {rbf_error}')
Diskussion der Auswirkungen auf die Genauigkeit und Berechnungszeit:
- Genauigkeit:
- Die lineare Interpolation liefert in der Regel eine geringere Genauigkeit, besonders an Stellen, wo die Funktion stark variiert. Die Ergebnisse können Treppenartigkeiten besitzen.
- Die Spline-Interpolation passt sich besser an die Variationen der Funktion an und liefert glattere Ergebnisse, wodurch sie meist genauer ist.
- Berechnungszeit:
- Die lineare Interpolation ist in der Regel schneller, da sie weniger rechenaufwändig ist. Dies ist besonders bei sehr großen Datenmengen vorteilhaft.
- Die Spline-Interpolation benötigt mehr Rechenzeit, da sie komplexere Berechnungen durchführt, um die glatten Übergänge zu gewährleisten.