53

Gaffer on Games には、RK4 統合を使用してゲームの物理特性を改善することに関する素晴らしい記事があります。実装は簡単ですが、その背後にある計算は私を混乱させます。導関数と積分を概念レベルで理解していますが、長い間方程式を操作していませんでした。

Gaffer の実装の矢面は次のとおりです。

void integrate(State &state, float t, float dt)
{
     Derivative a = evaluate(state, t, 0.0f, Derivative());
     Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a);
     Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b);
     Derivative d = evaluate(state, t+dt, dt, c);

     const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
     const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv)

     state.x = state.x + dxdt * dt;
     state.v = state.v + dvdt * dt;
}

RK4 の仕組みを簡単に説明できる人はいますか? 具体的には、なぜ、 、 、 、および で導関数を平均化する0.0f0.5fです0.5f1.0f??


以下の受け入れられた回答と他のいくつかの記事を読んだ後、RK4の仕組みを理解しました。私自身の質問に答えるには:

RK4 の仕組みを簡単に説明できる人はいますか?

RK4 は、関数の 1 次導関数または 2 次導関数だけでなく、高次の導関数を使用すると、関数のより優れた近似を得ることができるという事実を利用しています。これが、テイラー級数 がオイラー近似よりもはるかに速く収束する理由です。(そのページの右側にあるアニメーションを見てください)

具体的には、なぜ0.0f0.5f0.5f、およびで導関数を平均化するの1.0fでしょうか?

ルンゲクッタ法は、単一点の導関数のみをサンプリングするテイラー級数とは異なり、時間ステップ内の複数の点の導関数をサンプリングする関数の近似です。これらの導関数をサンプリングした後、可能な限り最も近い近似値を得るために、各サンプルを重み付けする方法を知る必要があります。これを行う簡単な方法は、テイラー級数と一致する定数を選択することです。これは、ルンゲ クッタ方程式の定数を決定する方法です。

この記事は私にとってそれをより明確にしました。がルンゲ・クッタ導関数であるの(15)に対し、 はテイラー級数展開であることに注意してください。(17)

微分を 4 次まで平均化することは、時間ステップを小さくして単純なオイラー積分を行うこととどう違うのでしょうか?

数学的には、多くのオイラー近似を行うよりもはるかに速く収束します。もちろん、十分なオイラー近似を使用すると、RK4 と同等の精度を得ることができますが、必要な計算能力がオイラーの使用を正当化するものではありません。

4

3 に答える 3

34

これは、実際の数学に関しては少し単純化しすぎているかもしれませんが、Runge Kutta統合への直感的なガイドとして意図されています。

ある時点での数量が与えられた場合t1、別の時点での数量を知りたいとしt2ます。一階微分方程式で、その量の における変化率を知ることができt1ます。私たちが確実に知ることができるものは他にありません。残りは推測です。

オイラー積分は推測する最も簡単な方法t1ですt1。これは通常、悪い答えになります。t2 が t1 から離れている場合、この線形外挿は理想的な答えの曲率と一致しません。t1 から まで多くの小さなステップを踏むとt2、同様の値の減算の問題が発生します。丸め誤差は結果を台無しにします。

したがって、推測を絞り込みます。1 つの方法は、先に進んでこの線形外挿を行い、それが真実からそれほど離れていないことを期待して、微分方程式を使用して での変化率の推定値を計算することt2です。これは、 での (正確な) 変化率で平均化され、とt1の間の真の答えの典型的な傾きをよりよく表しています。これを使用して、 から までの新しい線形外挿を行います。誤差を見積もるために計算を行わずに、単純な平均を取るべきか、それとも での比率を重視するべきかは明らかではありませんが、ここには選択肢があります。いずれにせよ、それはオイラーが与えるよりも良い答えです。t1t2t1t2t1

t1おそらく、との間の中間の時点に最初の線形外挿をt2行い、微分方程式を使用してそこでの変化率を計算します。これにより、先ほど説明した平均とほぼ同じくらい良い答えが得られます。t1次に、これを からへの線形外挿に使用しt2ます。目的は での量を見つけることだからt2です。これが中点アルゴリズムです。

変化率の中間点推定値を使用して、からt1中間点までの量の別の線形外挿を行うことを想像できます。微分方程式を使用すると、そこでの勾配をより適切に推定できます。これを使用して、答えが必要な場所までt1ずっと外挿することで終了します。t2これがRunge Kuttaアルゴリズムです。

中間点に 3 番目の外挿を行うことはできますか? 確かに、それは違法ではありませんが、詳細な分析では、他のエラーの原因が最終的な結果を支配しているように、改善が減少していることが示されています.

ルンゲ・クッタは微分方程式を最初の点 t1 に適用し、中点に 2 回、最終点 t2 に 1 回適用します。中間点は選択の問題です。勾配のこれらの改善された推定値を作成するために、t1およびその間の他の点を使用することが可能です。t2たとえば、t1t2 に向かって 3 分の 1 の点、 に向かってさらに 2/3 の点、t2およびを使用できますt2。4 つの導関数の平均の重みは異なります。実際には、これは実際には役に立ちませんが、テストでは同じ答えが得られるはずですが、異なる丸め誤差のセットが提供されるため、場所があるかもしれません。

于 2009-11-06T19:08:26.033 に答える
3

最も単純な意味での RK4 は、各タイム ステップの 4 つの導関数とポイントに基づく近似関数を作成します。開始点 A での初期条件、タイム ステップ/2 でのデータ ポイント A に基づく最初の近似勾配 B、およびA からの傾き、関数の形状の変化を反映するための B での傾きの補正値を持つ 3 番目の近似値 C 、そして最後に点 C での修正された傾きに基づく最終的な傾き。

したがって、基本的にこの方法では、開始点、形状を調整するために両方の部分に修正が組み込まれている平均化された中間点、および二重に修正された終点を使用して計算できます。これにより、各データポイントからの効果的な寄与が 1/6 1/3 1/3 および 1/6 になるため、ほとんどの答えは関数の形状の修正に基づいています。

RK 近似 (Euler は RK1 と見なされます) の次数は、時間ステップが小さいほどその精度がどのように変化するかに対応することがわかります。

RK1 近似間の関係は線形であるため、精度が 10 倍になると、収束が約 10 倍向上します。

RK4 の場合、精度が 10 倍になると、収束が約 10^4 倍向上します。したがって、RK4 では計算時間が直線的に増加しますが、精度は多項式で増加します。

于 2013-09-27T18:35:33.880 に答える
2

なぜあなたの質問について: 私は、クロスがノードで相互接続された一連のスプリングであるクロス シミュレーターを書いたことを思い出します。シミュレーターでは、スプリングによって加えられる力は、スプリングが伸びた距離に比例します。力は節点で加速を引き起こし、節点を動かす速度を引き起こし、ばねを伸ばします。2 つの積分 (加速度を積分して速度を取得する方法と、速度を積分して位置を取得する方法) があり、それらが不正確な場合、エラーが雪だるま式に発生します。不安定。

図なしで説明するのは難しいですが、試してみます: f(t) があるとします。ここで、f(0) = 10、f(1) = 20、f(2) = 30 です。

間隔 0 < t < 1 での f(t) の適切な積分により、その間隔での f(t) のグラフの下の表面が得られます。

長方形ルールの統合は、幅が時間のデルタで長さが f(t) の新しい値である長方形でそのサーフェスを近似するため、間隔 0 < t < 1 では、20 * 1 = 20 が得られます。そして次の間隔で 1

これらの点をプロットして線を引くと、実際には 30 (単位) の面を持つ三角形であることがわかります。したがって、オイラー積分は不適切です。

表面 (積分) をより正確に推定するには、t の間隔を小さくして、たとえば f(0)、f(0.5)、f(1)、f(1.5)、f(2) で評価します。

あなたがまだ私をフォローしているなら、RK4 法は、t0 < t < t0+dt に対する f(t) の値を推定する単なる方法であり、積分の正確な推定値を得るために私より賢い人々によって発明されました。

(しかし、他の人が言ったように、より詳細な説明についてはウィキペディアの記事を読んでください。RK4は数値積分のカテゴリにあります)

于 2009-11-03T16:11:31.540 に答える