オイラー法をルンゲ・クッタの4次に置き換えて、一定の重力ではない自由落下運動(たとえば、地上1万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(加速)を使用して1回だけ統合しているため、何かが間違っています。RK4を使用した速度の積分は、v * dtと同じであるため意味がありません。
Runge-Kutta積分を使用して2次微分方程式を解く方法を教えてください。k1、l1、k2、l2 ... l4係数を計算してRK4を実装する必要がありますか?どうやってやるの?
こんにちは@Marcin、私はあなたのタイトルを編集して、あなたの問題が実際にあると思うものをよりよく反映させました。私たちはもっと役に立つ答えを得るかもしれないし、新しいタイトルでこの質問を将来見る他の人にとってはもっと検索可能になると思います。同意しない場合は、お気軽に元に戻してください。
—
ダグリピンスキー