Làm cách nào tôi có thể thay thế phương pháp Euler bằng Runge-Kutta theo thứ tự thứ 4 để xác định chuyển động rơi tự do ở cường độ trọng lực không đổi (ví dụ: rơi tự do từ 10 000 km so với mặt đất)?
Cho đến nay tôi đã viết tích hợp đơn giản bằng phương pháp Euler:
while()
{
v += getMagnitude(x) * dt;
x += v * dt;
time += dt;
}
biến x có nghĩa là vị trí hiện tại, v có nghĩa là vận tốc, getMagnitude (x) trả về gia tốc trên vị trí x.
Tôi đã thử thực hiện RK4:
while()
{
v += rk4(x, dt) * dt; // rk4() instead of getMagintude()
x += v * dt;
time += dt;
}
Trong đó cơ thể hàm rk4 () là:
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;
}
Nhưng có gì đó không đúng, vì tôi chỉ tích hợp một lần bằng RK4 (tăng tốc). Việc tích hợp vận tốc bằng RK4 không có ý nghĩa gì vì nó giống như v * dt.
Bạn có thể cho tôi biết làm thế nào để giải các phương trình vi phân bậc hai bằng cách sử dụng tích hợp Runge-Kutta? Tôi có nên thực hiện RK4 bằng cách tính các hệ số k1, l1, k2, l2 ... l4 không? Làm thế nào tôi có thể làm điều đó?