天文学シミュレーションに統合する正しい方法は何ですか?


15

私は、システム内の惑星(または、あらゆるオブジェクト)の動きをシミュレートするために、ニュートン物理学を使用する単純な天文学シミュレーターを作成しています。すべての物体はユークリッド平面の円であり、位置、速度、質量、半径、合力などのプロパティを持っています。

ユニバースを小さなタイムステップ(通常は数ミリ秒)で更新したいのですが、位置の変化を正しく計算する方法がわかりません。

力は簡単ですfr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)

しかし、そこからどのように進むのですか?

私はこれを行うことができます:

a = Fr/body.m
v += a*dt
position += v*dt

しかし、それはもちろん間違っています。位置計算の係数として0.5を追加した場合はどうでしょうか?


コメントしないのは面白すぎます。「植物」の動きをシミュレートするのは確かに一般的な天文学の問題
です;

回答:


17

あなたは本質的に答えを持っています-0.5の係数は必要ありません。

基本的に、1次ODEの2次元システムがあり: ここで、おそらくを除くすべてが時間の関数であり、ドットは時間微分を示します。これらの単純な前方オイラー風の1次差分を行うと、 または ここでは、タイムステップにインデックスを付けています。mx n + 1xn

バツ˙=vv˙=Fm
mxn+1
バツn+1バツnt=vnvn+1vnt=Fnm
n
バツn+1=バツn+tvnvn+1=vn+tFnm
n

ただし、forward-Eulerは本質的に不安定です。幸いなことに、角を曲がったところにシンプレクティックな方法があります。(リンクされた物品は、よりスタブであり、それはいくつかの有用なリンクを含む可能性がある。)キーから前進位置にあるに速度を用いに。つまり、各パーティクルにとが与えられたと仮定します。次に、 時間内に統合します。これはリープフロッグ法として知られていますtntn+1tn+1/2バツ0v1/2

バツn+1=バツn+tvn+1/2vn+1/2=vn1/2+tFnm
。これにより、システムはある種のエネルギーを節約し、軌道は、丸め誤差の指数関数的増加により無限に飛ぶ可能性が低くなります。

おそらくから始めるので、唯一の問題はを取得する方法。そこでは、書くのと同じくらい正確なスキームを使用する必要があります。4次のRunge-Kuttaが一般的な選択肢です。長期的には不安定かもしれませんが、半分のタイムステップで導入するエラーはそれほど多くなく、そのエラーはリープフロッグスキームによってその後小さく保たれます。v1/2v0

最後に、この答えは、一般的なニュートン重力シミュレーションに適用されます。質問の通過で述べたように、完全な円が本当に必要場合は、惑星同士が相互作用せず、初期条件が適切に選択される理想的なシステムを除き、それらを取得できません。その場合、そのようなオブジェクトの角速度(単位時間あたりのラジアン)は単にであるため、統合する必要はありません ここで、中心物体の質量であり、、軌道の半径です。これは、シミュレーションの精度をテストするために使用できます。

ω=GMr3
Mr

ねえ、なぜ0.5ファクターが必要ないのか説明できますか?速度を数n-1/2dt秒前に取っているのと同じことをしているようです。
jcora

速度が0の場合にのみ同じです。必要なのは、と(後者はわからない)の平均の1次推定値です。と平均。n1vnvn+1vn0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.