Як я можу замінити метод Ейлера на Runge-Kutta 4-го порядку, щоб визначити рух вільного падіння в не постійній гравітаційній величині (наприклад, вільне падіння з 10 000 км над землею)?
Поки я писав просту інтеграцію методом Ейлера:
while()
{
v += getMagnitude(x) * dt;
x += v * dt;
time += dt;
}
x змінна означає поточне положення, v означає швидкість, getMagnitude (x) повертає прискорення на позицію x.
Я спробував реалізувати RK4:
while()
{
v += rk4(x, dt) * dt; // rk4() instead of getMagintude()
x += v * dt;
time += dt;
}
де тілом функції rk4 () є:
inline double rk4(double tx, double tdt)
{
double k1 = getMagnitude(tx);
double k2 = getMagnitude(tx + 0.5 * tdt * k1);
double k3 = getMagnitude(tx + 0.5 * tdt * k2);
double k4 = getMagnitude(tx + tdt * k3);
return (k1 + 2*k2 + 2*k3 + k4)/6.0;
}
Але щось не так, тому що я інтегруюсь лише один раз за допомогою RK4 (прискорення). Інтегрування швидкості за допомогою RK4 не має сенсу, оскільки вона така ж, як v * dt.
Не могли б ви сказати мені, як розв’язати диференціальні рівняння другого порядку за допомогою інтеграції Рунге-Кутти? Чи слід реалізувати RK4 шляхом обчислення коефіцієнтів k1, l1, k2, l2 ... l4? Як я можу це зробити?