如何用Runge-Kutta第四阶代替Euler方法来确定自由落体运动的重力大小不是恒定的(例如,从地面10000 km处自由落体)?
到目前为止,我通过欧拉方法编写了简单的积分:
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相同。
您能告诉我如何使用Runge-Kutta积分求解二阶微分方程吗?我是否应该通过计算k1,l1,k2,l2 ... l4系数来实现RK4?我怎样才能做到这一点?
@Marcin,您好,我编辑了您的标题以更好地反映我认为您的问题所在。我认为我们可能会得到更多有用的答案,并且对于将来使用新标题看到此问题的其他人来说,搜索起来会更容易。如果您不同意,请随时将其更改。
—
Doug Lipinski'3