Pliki do wykorzystania w poniższym ćwiczeniu można pobrać za pomocą poniższych linków:
Celem dzisiejszych zajęć jest zapoznanie się z podstawowymi metodami całkowania numerycznego równań różniczkowych zwyczajnych pierwszego rzędu. Część procesów fizycznych, które obserwujemy w otaczającym nas świecie może być modelowana za pomocą właśnie równań różniczkowych. Większości z nich nie da się rozwiązać w sposób analityczny (tj. podać rozwiązania w postaci jawnej). W szczególności, największe problemy sprawiają równania zawierające człony nieliniowe. Świat, w którym żyjemy, jest silnie nieliniowy i większość problemów, które przyjdzie nam rozwiązywać, nie będzie posiadać rozwiązania w formie analitycznej.
Jako pierwszą poznamy metodę pierwszego rzędu zwaną (od nazwiska twórcy) jawną metodą Eulera. Jest ona jednocześnie najprostszą i bardzo niestabilną metodą. Drugą metodą, którą zastosujemy na dzisiejszych zajęciach, będzie metoda Rungego-Kutty 4-go rzędu. Jest to metoda jawna, która charakteryzuje się stosunkowo wysokim rzędem, łatwością implementacji oraz relatywnie wysoką stabilnością.
Obie metody wykorzystamy do rozwiązania zagadnienia początkowego w postaci: \[ \left\{ \begin{array}{l} \frac{dy}{dt} = f(t,y) \\ y(t_0) = y_0 \\ \end{array} \right. \]
W celu rozwiązania zastosujmy następujący schemat iteracyjny: \[ t_{i+1} = t_{i} + h \] \[ y_{i+1} = y_i + h \cdot f(t_i , y_i ) \] Gdzie:
Schemat iteracyjny ma postać: \[ y_{i+1} = y_i + \frac{h}{6} \left( K_1 + 2K_2 + 2K_3 + K_4 \right) \] gdzie: \[ K_1 = f\left( x_i, y_i \right) \] \[ K_2 = f\left( x_i + \frac{1}{2}h, y_i + \frac{1}{2}hK_1\right) \] \[ K_3 = f\left( x_i + \frac{1}{2}h, y_i + \frac{1}{2}hK_2\right) \] \[ K_4 = f\left( x_i + h, y_i +hK_3 \right) \] Metoda ta jest już zaimplementowana w pliku \(\verb+rk4.cpp+\). Nagłówek funkcji, która wykonuje jeden krok całkowania równania różniczkowego ma postać:
double rk4(double x0, double y0, double h, double (*fun)(double, double))
gdzie:
x0
– wartość początkowa zmiennej niezależnej,y0
– wartość początkowa zmiennej zależnej,h
– krok całkowania,fun
– adres funkcji obliczającej prawe strony równania.Dane jest zagadnienie początkowe w postaci: \[ \left\{ \begin{array}{l} \frac{dy}{dt} = \lambda \cdot y(t) \\ y(t_0) = y_0 \\ \end{array} \right. \] Jego rozwiązanie dokładne to: \[ y(t) = y_0 \cdot \mathrm{e}^{\lambda(t-t_0)} \]