2015-12-27 29 views
0

首先,我對java很陌生,道歉。我試圖模擬地球繞太陽轉。在繪製結果之後,它看起來地球在一次旋轉之後螺旋離開軌道!地球在java模擬中走出軌道

我檢查並重新檢查常量,如太陽和地球的質量以及初始速度和位置。我不確定我要出錯的地方,同事和講師也正確地確認了方程式。

代碼由4個類組成:

找到。

+0

最後一類是矢量類我確定這裏沒有錯誤。 – IamThankful

+3

問問你自己,每當你做'時間步'或每次模擬接近數值計算時會發生什麼。 – pvg

+0

您正在使用離散步驟估計未來位置,並且在數學上,當您需要更高階逼近(泰勒或MacLaurin系列)時,您可以使用一階近似來執行此操作。但我不確定在代碼中執行此操作的最有效方法。 –

回答

3

壞:

y += yVelocity * timeStep;  
x += xVelocity * timeStep; 

當你正在使用離散時間步長,你不僅要速度添加到您的位置,而且還加速將對在此期間,你的速度的影響。

更好:

yAccel = Sun.componentY();  
xAccel = Sun.componentX(); 

y += (yVelocity + yAccel * timeStep * 0.5) * timeStep; 
x += (xVelocity + xAccel * timeStep * 0.5) * timeStep; 

yVelocity += yAccel * timeStep; 
xVelocity += xAccel * timeStep; 

這是假設加速整個時間步長,這在現實中是不持續時間保持不變。不過,它應該更接近你想達到的目標。

最佳:

使用積分,你應該能夠完全模擬真實的行爲(忽略浮點問題)。

加速度,速度和位置都可以使用積分來表示,那麼您應該能夠解決t到t + dt的每幀模擬範圍。我發現Mathematica的試用許可可以在這種情況下非常有用。

+0

謝謝,。我剛剛嘗試過這種方式,但它的確如此接近,但地球仍然退出軌道。你的意思是y + =(yVelocity +(yAccel * timestep * 0.5))* timestep? – IamThankful

+0

是的,這就是我的意思。但應該來到同一件事情。 –

+0

這種計算方法假定在時間步長期間加速度保持不變,實際上,加速度沒有。因此結果不能準確,但會以較小的時間步長變好。你可以嘗試在時間步中模擬加速度變化,這會讓你更加接近,但它不會是完美的。 –