RK4がオイラー統合よりも優れているのはなぜですか?[閉まっている]


20

これらの素晴らしいスライドの最後に、著者は提示されたすべての異なるインテグレーターを比較します。いずれにせよ、改善されたオイラー統合ルンゲ・クッタ4統合を除き、それらはすべて不足しています。どちらもすべてのテストに合格します。

物理学をあまり重視していない 2Dゲームに取り組んでいることに言及する必要があると思います。改善されたオイラー統合がどこで不足し、代わりにRK4を使用する必要があるかについて、私は興味があります。

私のゲームは、主に単純な重力(ジャンプと落下)、X軸とY軸に沿った動き、境界ボックスの衝突で構成されています。RK4を実装する価値はありますか、または改良型オイラーで十分ですか?Euler Integrationのユーザーが懲戒される多くの議論を見ますが、私が見ることができることから、改良されたEulerは単純な2Dの問題に相当します。それも速くなると思います。


オフトピックですが、これらの領域の素晴らしいスライドは、例とすべてで非常に明確です。そのリンクをありがとう!
ロイT.

もしこれが本当にここで話題から外れているのなら、おそらく計算科学にぴったりだろう。
デビッドZ

また:時間補正されたVerlet統合 -改良オイラーに似ています:まったく同じかどうかを判断するのが面倒です。TCVは、固定タイムステップに寛容であるため、素晴らしいです(他のインテグレーターは、保証された固定タイムステップを必要とします)。
ジョナサンディキンソン

1
編集できない:彼が言及しているようです。記事で概説されている初期条件の要件に関して彼の実装にバグがあるかどうかはわかりませんが、初期条件を正しく計算した場合、TCVの実装でその重力の問題を見たことはありません。
ジョナサンディキンソン

回答:


15

私は個人的にほとんどのシミュレーションにVelocity Verletを好みます。この方法の私の経験では、かなり硬い方程式に非常に適しています。この「改善されたオイラー」メソッドは、Velocity Verletのメソッドに非常に似ており、予測子修正子として知られる統合メソッドのクラスに依存しているようです。今日、これらのメソッドに関する多くのことを読むことができます。DavidBaraffの「布シミュレーションの大きなステップ」から始まり、暗黙のメソッドの力が本当に輝いています。彼らの没落はあなたです:

  1. ヤコビアンまたはヘッセ行列を近似しなければならず、その後、
  2. フレームごとにかなりの量の逆行列を計算します。

あなたが数学の第一人者ではない場合、あなたの指が立ち往生する可能性があります。どちらの方法でも試してみて、最適なパフォーマンスが得られると思われる方法を選んでください。シンプルが常に良いとは限りませんが、インタラクティブフレームレートの場合、妥協という言葉を1つだけ知っています。

あなたが見たいかもしれないいくつかの追加リソース:

ヤコブセンは、大げさな問題に対するこのような単純なアイデアを思いつくための一種の天才です(彼の専門は間違いではないが暗号ですが、彼はガウス-ザイデル反復アルゴリズムのクラスとの数学的な同等性を証明することに成功しました。 )。簡単にするために、暗黙のメソッドを深く掘り下げる前に、まずこれに進みます。

後の編集:最近、ソフトまたはセミリジッドボディシミュレーションに明示的なインテグレーターを使用し、そのパフォーマンスと品質に与える影響についてのこの問題に関する論文を受け取りました。このペーパーは、シナリオに応じて特定のインテグレーターを選択するためのガイドとして役立つはずです。


1
+1これは、実際にはコンテンツの点では非常に質の高い回答でしたが、消化するのが少し難しい(テキストの壁)でした。良い書式設定は常に投票に役立つことがわかりました。私はそれを改善しました、そして、うまくいけば、あなたがあなたに値する賛成票を得るでしょう。
ジョナサンディキンソン

ジョナサンのおかげで、私は「読みやすい」手順を無視して、急いでやりましたが、今日でも非常に頻繁に使用されているため、これらのいくつかのソースに言及する必要がありました。
テオドロン

10

Q:なぜ高度なルンゲクッタを使用するのですか?
A:非常に正確だからです。

Q:どうしてですか?
A:あなたはゲームを作っているので、非常に正確な物理エンジンは重要ではないので、プレーヤーをだますのに十分なだけでなければなりません。

ちなみに、ほとんどのプラットフォーマーがそうであるように、衝突時に激しい減衰が生じた場合、単純なオイラーは問題ありません。

プレゼンテーションのコードとは異なり、固定ステップ物理学を使用することを強くお勧めします。これにより、潜在的な不具合を防ぎ、非常に簡単な方法でボールのエネルギーの増減の問題を解決できます。明示的統合と暗黙的統合の中間地点に行くだけです。

velocity += 0.5 * acceleration;
position += velocity;
velocity += 0.5 * acceleration;

プレゼンテーションで示されていないのは、オブジェクトが境界を越えないように衝突を処理する方法です。その問題の簡単な解決策は、高い更新頻度を使用することです。より複雑ですが、パフォーマンスが向上する可能性があるソリューションは、衝突時にオブジェクトを戻すことです。正確な実装は、目的の物理的挙動に依存します。


1
「プレーヤーをだます」ための+1-しかし、私は個人的にオイラー統合のために「非常に単純な」システムが爆発しました。
ジョナサンディキンソン

@JonathanDickinsonそれは、オイラー統合のせいではなく、むしろオイラー統合がそれらの1つにすぎない状況が混在しているためだと思います。例があれば、システムの爆発を避ける方法を見つけることができると確信しています。
aaaaaaaaaaaa

ああ、それはRK / Verletについて学ぶ前の私の本当に古いVB6のもの(文字通り14歳頃)にあります-もうコードを持っていません。に混ざった :)。
ジョナサンディキンソン

1
単純な重力ではなくオブジェクト間の引力をいじり始めるとすぐに、統合方法を強化するのが合理的であると思われることを追加する必要があると思いますが、厳密に必要ではないかもしれませんが、処理能力があれば欠点は、やや複雑なコードだけです。
aaaaaaaaaaaa

1

プレゼンテーションにエラーがあります。プレゼンターによって「改善されたオイラー」と呼ばれている方法は、実際にはVelocity Verlet法です!

信頼できるソースについてはこちらをご覧くださいhttp : //www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html

ウィキペディアにも同じ方程式があります。

オイラーの方法に対する一般的な即時改善はミッドポイント法であり、これはプレゼンターがおそらく念頭に置いていたが、Velocity Verletを改善されたオイラーと間違えてしまいました。MidpointメソッドとVelocity Verletの唯一の違いは、速度は単に最後の加速度に依存するのではなく、最後と次の加速度の平均であるということです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.