2011-10-23 3 views
1

私は、個々の速度が空間を飛行し、お互いの周りを周回する異なる惑星の簡単なシミュレーションを行っています。シミュレートされた惑星間の重力プルームの連続効果を計算する方法

私は、各惑星がそれぞれの「重力ベクトル場」を投影しているとみなして、互いのプルをシミュレートする予定です。各時間ステップでは、計算に影響を及ぼさないものを除いて、各惑星個別ベクトル場方程式(V = -xj +(-yj)またはそのような表記法)から出力されたベクトルを加算し、影響を受けた惑星位置方程式への入力として。

しかし、これは不正確で、重力引っ張りは連続的かつ一定であるとはみなされません。私は惑星の動きを計算します。

ありがとうございます!

+0

「多くの身体の問題」のためのGoogle –

答えて

2

ニュートンの方程式を使用したことについてBlenderが書いていることに加えて、あなたはあなたの「加速フィールド」をどのように統合するかを検討する必要があります。

最も簡単な方法はEuler's Methodです。その問題は急速に発散していますが、コード化が容易で合理的に高速であるという利点があります。

精度を向上させ、パフォーマンスを犠牲にしたい場合は、通常Runge-Kutta methods(おそらくRK4)のいずれかを選択するのが良いでしょう。私はあなたの「加速フィールド」が動的である(つまり、時間の経過とともに変化する、おそらく惑星が軌道を移動した結果として)RK4が挑戦になることに注意します。 (下記のコメント/質問に基づいて)

更新

あなたには、いくつかの時間ステップtにおける力ベクトルF I(トン Nを計算したい場合は N特定のオブジェクト iに適用された場合、Blenderの参照式を使用して、シミュレーション内の他のすべてのオブジェクトによって与えられた力を計算する必要があります。これはオブジェクトごとに、 iです。他のすべてのオブジェクトがどのように引っ張られるか(力を加える)を計算します。合計したベクトルは、 iに適用されます。アルゴリズム的にこれは次のようになります。

for each object i 
    Fi(tn) = 0 
    for each object ji 
     Fi(tn) = Fi(tn) + G * mi * mj/|pi(tn)-pj(tn)|2 

P私は(トン N)とP J(トン N)は、オブジェクト、iの位置でありますおよびjをそれぞれ時刻t nとし、 |標準ユークリッド(l )である。すなわち、2つのオブジェクト間のユークリッド距離である。また、Gはgravitational constantです。

オイラーの方法は、シミュレーションを離散時間スライスに分割します。現在の状態を確認し、例の場合は、集計されたすべての力をシミュレーション内のすべてのオブジェクトに適用し、それらの力をタイムスライスの期間にわたって定数として適用します。 iは時刻tにおける((T N)=加速度ベクトルを

ai(tn) = Fi(tn)/mi

使用する場合 N Iをオブジェクトに適用される、F I(T n)は、時刻tでオブジェクト iに適用される力ベクトルです力ベクトル(ひいては加速度ベクトル)は、時間スライスの持続時間にわたって一定に保たれる。別ウィンドウ(タブ)の大きな表示で見るあなたの場合、実際に加速を計算する別の方法がある場合は、力を計算する必要はなく、代わりに加速度を直接計算することもできます。加速とのいずれかのイベントに N + 1P(T N + 1)及び速度時刻tにおける時刻tで、定数として位置を保持され N + 1V(T RK4法が良いが、その挙動を近似する2次多項式にシステムのドライバに合っ

pi(tn+1) = 0.5*ai(tn)*(tn+1-tn)2 + vi(tn)*(tn+1-tn)+pi(tn) 
vi(tn+1) = ai(tn+1)*(tn+1-tn) + vi(tn)

:オブジェクトの N + 1)は、によって与えられます。詳細は上で参照したウィキペディアのサイトにあります。また、Web上で見つけることができる他の多くのリソースがあります。基本的な考え方は、特定のタイムスライスに対して単一の力値を選択するのではなく、特定の時間に4つの力ベクトルを計算し、力ベクトルを2次多項式に当てはめることです。あなたの力ベクトルのフィールドがタイムスライスの間で変化しないなら、それはいいです。ベクトル場を導出するために重力を使用し、重力源であるオブジェクトが動いている場合は、力ベクトルを計算するために4つの部分間隔のそれぞれでそれらの位置を計算する必要があります。これは可能ですが、オイラーの方法を使用するよりも少しパフォーマンスが悪くなります。プラス面では、オブジェクトの相対的な動きがより正確になります。したがって、計算コストが高いという意味での挑戦です。繰り返しのタイムスライスの間に、4つのサンプルに対してすべてのオブジェクトがどこにあるのか把握するのは苦労します。

+0

ありがとうございましたが、「挑戦」とは、コードを正確に理解する/作成するのが難しいということですか?また、私は、ベクトル・フィールド、特に各オブジェクトによって投影された複数のフィールドで構成される「グローバル・フィールド」を介して統合するために、オイラーの方法を使用する方法を学ぶ方法を学ぶために何を検索するかについてはまだよく分かりません。それに加えて、「グローバルな場」によって引き起こされる加速のために、物体の絶え間なく変化する速度をどのように考慮するか。 – Griffin

+0

@グリフィン:上の編集を参照してください – andand

+0

うわー、本当に説明を感謝します!そして、はい、ベクトルのフィールドが変化しているので、正確さを高める唯一の方法は、時間スライスの間にフィールドがどのように変化するかを反復/推定することによるものですか?私は、タイムスライスの間に力ベクトルを定数として保持しないようにしようとしています。 – Griffin

1

コンピュータを扱うときに「連続」ということはないので、ごくわずかな時間間隔で連続性を近似する必要があります。

つまり、なぜベクトルフィールドを使用していますか?ニュートンの何が問題なの?

enter image description here

enter image description here

とオブジェクト上の力の合計

は、上記の式ということです。 2つを等しくして解く a

だから、すべてのオブジェクトを1つずつループさせ、その上で加速を見つけなければなりません。

+0

私は、ベクトルフィールドがより柔軟で視覚化しやすくなっています。私は最終的には、このシミュレーションでコード化された重力を、ベクトル場の方程式を編集することで重力を少し「曲げたり、はねたりしたい」ゲームで使用する予定です。また、私はコンピュータが「連続的」ではないことを知っていますが、私は最近、自然な指数関数「e」について学びました。これは、連続複式計算の問題を修正しています。重力場を通って惑星が動いている...あなたはどう思いますか? – Griffin

+0

あなたは少し重力と混じっているようです。上の方程式は、重力による物体への力の計算方法です。あなたが他の何かを使うなら、重力を計算するのではなく、他の何らかの力を計算するでしょう。複合ニュートリノの物理学には「e」はありません。化合物の関心は、この文脈ではあまり使われない限界でしか得られないからです。 – Blender

+0

それ以外は、どのようにベクトルフィールドの使用を計画していますか?あなたはそれを統合していくでしょう。これは、3Dで絶対的な地獄になり、絶えず変化するフィールドで(すべてのフィールドを一緒に*加えなければならないので)ます。 – Blender

関連する問題