1. Kezdeti feltételek megadása: Az kezdeti érték megadása, ahol az időpont, és a megfelelő funkció értéke.
2. Lépés nagyságának megválasztása: Válaszd meg a lépésnagyságot, , amely meghatározza, hogy mennyit lépünk a következő időpontba.
3. A Runge–Kutta lépések végrehajtása: Az értékeket a következő képletek szerint számítjuk:
Itt a differenciálegyenlet jobboldali oldalát jelöli.
4. Új érték kiszámítása: A következő lépésben az új értéket a következő képlettel számítjuk ki:
5. Ismétlés: Az eljárást ismételjük, amíg elérjük a kívánt időpontot.
Példa
Tegyük fel, hogy a következő differenciálegyenletet akarjuk megoldani:
A Runge-Kutta módszer segítségével a következő lépéseket végezhetjük el:
1. Kezdeti érték: 2. Lépésnagyság:
A számítás során az értékeket az függvény segítségével számítjuk ki. Az új értékek a megadott képlet alapján kerülnek meghatározásra.
Ez a módszer nagyon pontos eredményeket adhat, különösen a kisebb lépésnagyságok esetén.
A Runge-Kutta-módszer egy numerikus módszer differenciálegyenletek megoldására. Pontosabban, az alábbi alakú kezdeti értékproblémákat oldja meg:
A módszer iteratív eljárás, amely közelítő megoldásokat ad a (y(t)) függvényre adott (t) értékek mellett. A legismertebb változat a negyedrendű Runge-Kutta-módszer (RK4), amely egyensúlyt teremt a pontosság és a számítási költség között.
Az iterációs képlet az alábbi: ahol: - (h) az időlépés mérete, - () egy súlyozott átlag, amely a derivált értékeire támaszkodik az aktuális lépésen belül.
Az ()-t különböző módszerek különböző pontosságú megközelítésekkel határozzák meg.
A RK4 egy népszerű változat, amely a következő képleteken alapul:
Az RK4 időbonyolultsága egy lépésre (O(1)), azaz minden időlépésben négy deriváltértéket kell kiszámítani. Az összes lépésre vonatkozó számítási költség (O(N)), ahol (N) a lépések száma.
def runge_kutta_4(f, t0, y0, h, n):
t = t0
y = y0
results =
for _ in range(n):
k1 = f(t, y)
k2 = f(t + h / 2, y + h / 2 * k1)
k3 = f(t + h / 2, y + h / 2 * k2)
k4 = f(t + h, y + h * k3)
y += h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
t += h
results.append((t, y))
return results
# Példa differenciálegyenlet: y'(t) = t + y
f = lambda t, y: t + y
# Paraméterek
t0 = 0
y0 = 1
h = 0.1
n = 5
# Számítás
results = runge_kutta_4(f, t0, y0, h, n)
print("t, y értékek:")
for t, y in results:
print(f"{t:.1f}, {y:.5f}")
Kimenet:
t, y értékek: 0.0, 1.00000 0.1, 1.10517 0.2, 1.22140 0.3, 1.34986 0.4, 1.49182 0.5, 1.64872
#include <iostream>
#include <vector>
#include <functional>
#include <iomanip>
using namespace std;
// Runge-Kutta 4. rend implementáció
vector<pair<double, double>> runge_kutta_4(function<double(double, double)> f, double t0, double y0, double h, int n) {
double t = t0, y = y0;
vector<pair<double, double>> results = {{t, y}};
for (int i = 0; i < n; ++i) {
double k1 = f(t, y);
double k2 = f(t + h / 2, y + h / 2 * k1);
double k3 = f(t + h / 2, y + h / 2 * k2);
double k4 = f(t + h, y + h * k3);
y += h / 6 * (k1 + 2 * k2 + 2 * k3 + k4);
t += h;
results.push_back({t, y});
}
return results;
}
int main() {
// Példa differenciálegyenlet: y'(t) = t + y
auto f = (double t, double y) { return t + y; };
// Paraméterek
double t0 = 0, y0 = 1, h = 0.1;
int n = 5;
// Számítás
auto results = runge_kutta_4(f, t0, y0, h, n);
// Eredmények kiírása
cout << fixed << setprecision(5);
cout << "t, y értékek:" << endl;
for (const auto& : results) {
cout << t << ", " << y << endl;
}
return 0;
}
Kimenet:
t, y értékek: 0.00000, 1.00000 0.10000, 1.10517 0.20000, 1.22140 0.30000, 1.34986 0.40000, 1.49182 0.50000, 1.64872
A Runge-Kutta-módszer, különösen az RK4 változata, az egyik legszélesebb körben használt numerikus módszer az időfüggő differenciálegyenletek megoldására. Pontossága és egyszerűsége miatt sokféle alkalmazásban nélkülözhetetlen, bár számítási igénye miatt nagyobb rendszereknél adaptív változatai előnyösebbek lehetnek.