2011-10-23 38 views
1

因此,我正在用不同的行星進行簡單的模擬,其中個體速度在空間周圍飛行並相互軌道運動。如何計算模擬行星之間的引力的連續效應

我打算通過考慮每個行星投影自己的「重力矢量場」來模擬彼此之間的拉力。每一個時間步,我要添加從每個行星個別矢量場方程(V = -xj +(-yj)或類似的一些符號)輸出的矢量,除了在計算中受到影響的那個,並使用受影響的行星位置作爲等式的輸入。

但是這樣做會不準確,並且不會將引力視爲連續且恆定的。如果每個人都不斷地影響其他人,我是否會計算我的行星的運動?

謝謝!

+0

谷歌對於「多身體問題」 –

回答

2

除了Blender寫關於使用牛頓方程的內容之外,還需要考慮如何在「加速場」上進行整合(如您在評論中對其答案所述)。

最簡單的方法是使用Euler's Method。問題在於它迅速分化,但它具有易於編碼和合理快速的優點。

如果你正在尋找更好的準確性,並且願意犧牲一些性能,Runge-Kutta methods(可能RK4)之一通常是一個不錯的選擇。我會告誡你的是,如果你的「加速場」是動態的(即它隨着時間的推移而變化......也許是因爲行星在軌道上移動的結果),RK4將是一個挑戰。

更新(基於評論/問題下面):

如果你想在某個時間步長t計算力矢量˚F(T ññ應用於特定對象 i,那麼您需要使用方程式Blender參考計算模擬中所有其他對象貢獻的力。這是針對每個對象,你計算出所有其他對象如何拉動(施加力),並且這些向量在求和時將是應用於的合力矢量(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(T ñ)和pĴ(T ñ)是對象我的位置 j在時間t n分別和| |是標準的歐幾里得(normal),即兩個物體之間的歐幾里得距離。另外,G是gravitational constant

歐拉方法將仿真分解成離散時間片。它會查看當前狀態,並以您的示例爲例,考慮將所有力集合應用於模擬中的所有對象,然後在時間片期間將這些力作爲常量應用。當使用

ai(tn) = Fi(tn)/mi

一個(噸Ñ)=在時間t的加速度矢量施加Ñ到對象˚F(噸 n)是在時間t施加到對象 i的力矢量Ñ,並且m 是對象的質量),力矢量(和因此加速度向量)被保持在時間片的持續時間是恆定的。就你而言,如果你真的有另一種計算加速度的方法,則不需要計算力,而是直接計算加速度。在任一事件中,利用加速度被保持爲恆定,該位置在時間t n + 1個p(噸 N + 1)和速度在時間t n + 1個v(噸 N + 1),目標將下式給出:

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)

的RK4方法適合您的系統的二次多項式它更加接近於其行爲的驅動程序。詳細信息在上面引用的維基百科網站上,還有許多其他資源您應該可以在網上找到。基本思想是,不是爲特定時間片選取單個力值,而是在特定時間計算四個力矢量,然後將力矢量擬合至二次多項式。這很好,如果你的力場向量在時間片之間沒有變化。如果您使用重力導出矢量場,並且引力源的物體移動,那麼您需要計算它們在四個子區間中的每一個的位置,以便計算力矢量。它可以完成,但是你的表現會比使用歐拉方法差得多。從好的一面來看,你可以獲得物體相對於彼此更準確的運動。因此,這是一個挑戰,因爲它在計算上花費很大,而且在迭代的時間片內找出所有對象應該用於四個樣本的位置是一件很痛苦的事情。

+0

感謝andand,但通過「挑戰」,你的意思是難以準確或難以理解/使代碼工作?另外,我仍然不確定如何學習如何學習使用歐拉方法來整合矢量場,特別是由每個物體投射的多個場組成的「全局場」。最重要的是,我如何考慮由於「全球領域」引起的加速而導致物體不斷變化的速度。 – Griffin

+0

@格里芬:看上面編輯 – andand

+0

哇,真的很感謝解釋!是的,矢量領域正在發生變化,這是否意味着提高準確性的唯一方法是通過更多的迭代/估計,在時間片期間場將如何變化?我試圖避免在時間片中將力矢量保持爲常量。 – Griffin

1

處理計算機時沒有「連續」這樣的事情,所以你必須以非常小的時間間隔來近似連續性。

這就是說,你爲什麼使用矢量場?牛頓怎麼了?

enter image description here

enter image description here

而一個物體上的力的總和是上述公式。等於兩個,並解決a

所以你只需要循環遍歷所有的對象,並找到它的加速度。

+0

嗯,我發現矢量字段更靈活,更容易可視化。我打算最終在這個模擬中使用重力編碼來進行遊戲,我可能想通過編輯矢量場方程來「彎曲或扭曲」引力。另外,我知道計算機不是「連續的」,但我最近了解到自然指數「e」,它解決了計算連續複合問題......這使我認爲有必要做一些類似的工作一顆行星在重力場中移動......你怎麼看? – Griffin

+0

你似乎有點與重力混在一起。上面的等式是如何計算由重力引起的物體上的力。如果你使用其他任何東西,那麼你不會計算重力,而是計算其他力量。牛頓物理學中沒有「e」,因爲複合興趣只是帶有一個極限,在這種情況下它沒有什麼用處。 – Blender

+0

除此之外,你打算如何使用矢量場?你會整合它,這將是絕對的3D地獄,並且不斷變化的領域(因爲你必須將所有的領域加在一起)。 – Blender

相關問題