6

我有一個大學項目,我們被要求使用ODE和SciPy的odeint函數來模擬火星的衛星方法。解決ODE的python時的錯誤

我設法通過將二階ODE分解爲兩個一階ODE來模擬2D。然而,由於我的代碼使用SI單元,因此我停留在時間限制內,因此在幾秒鐘內運行,而Python的內部空間限制甚至不能模擬一個完整的軌道。

我試着將變量和常量轉換成小時和公里,但現在代碼不斷給出錯誤。

我跟着這個方法:

http://bulldog2.redlands.edu/facultyfolder/deweerd/tutorials/Tutorial-ODEs.pdf

而且代碼:

import numpy 

import scipy 

from scipy.integrate import odeint 

def deriv_x(x,t): 
    return array([ x[1], -55.3E10/(x[0])**2 ]) #55.3E10 is the value for G*M in km and hours 

xinit = array([0,5251]) # this is the velocity for an orbit of period 24 hours 

t=linspace(0,24.0,100) 

x=odeint(deriv_x, xinit, t) 

def deriv_y(y,t): 
    return array([ y[1], -55.3E10/(y[0])**2 ]) 

yinit = array([20056,0]) # this is the radius for an orbit of period 24 hours 

t=linspace(0,24.0,100) 

y=odeint(deriv_y, yinit, t) 

我不知道如何複製/粘貼PyLab錯誤代碼,所以我花了PRINTSCREEN的錯誤:

Error when running odeint for x

第二誤差具有t = linspace(0.01,24.0,100)和xinit的=陣列([0.001,5251):

Second type of error

如果任何人有關於如何提高代碼任何建議我會很感激。

非常感謝!

+1

您將需要顯示您所得到的確切錯誤。 – BrenBarn

+0

我剛編輯原帖。謝謝! – user1937000

+2

是否重要 deriv_x(xinit,0) 未定義。 –

回答

5
odeint(deriv_x, xinit, t) 

使用xinit作爲其x初始猜測。評估deriv_x時使用x的此值。

deriv_x(xinit, t) 

提出了一個除以零錯誤,因爲x[0] = xinit[0]等於0,和deriv_x除以x[0]


看起來你正在試圖解決的二階ODE

r'' = - C rhat 
     --------- 
     |r|**2 

其中RHAT是在徑向方向上的單位向量。

您似乎分離xy座標轉換爲單獨的二階ODES:

x'' = - C    y'' = - C 
     ----- and   ----- 
     x**2     y**2 

初始條件X0 = 0和Y0 = 20056.

這是非常成問題的。其中的問題是,當x0 = 0x''爆炸。 r''的原始二階ODE不存在此問題 - 因爲y0 = 20056,因此r0 = (x**2+y**2)**(1/2)遠離零,因此分母不會爆炸x0 = 0

結論:將r'' ODE劃分爲x''y''的兩個ODE的方法不正確。

嘗試搜索以不同方式解決r'' ODE。

提示:

  • ,如果你的 「狀態」 向量是什麼z = [x, y, x', y']
  • 你能寫下的xyx'y'條款z'一階微分方程?
  • 你能解決嗎一個打電話給integrate.odeint
+0

非常感謝您的回覆! 我相信這正是錯誤的來源。不過,我修改了t和xinit,如原始帖子中的第二張圖片所示,但仍然出現錯誤。 你有什麼建議如何解決這個問題? 對於相當明顯的問題抱歉,我對Python和編程一般都很陌生,而且我的課程教學也不是很好...... 再次感謝! – user1937000