2014-02-05 31 views
0

我對Python非常陌生,並且已經生成了下面的代碼,但它不起作用。模擬接近火星的衛星的運動

該代碼試圖將接近火星的衛星的運動映射到變量yx距離(即2維空間)。目前,火星被認爲是靜止的。

import scipy as sp 
import numpy as np 
import pylab as pl 
import scipy.integrate as spi 

G=6.67*(10**-11) 
mm=6.4*(10**23) 
#^mm is the mass of mars and G is the gravitational constant  

def f(b,t): 


    xx=b[0] 
    vx=b[1] 
    yy=b[2] 
    vy=b[3] 

    ax=-(G*mm*b[0])/((b[0]**2) + (b[2]**2))**1.5 
    ay=-(G*mm*b[2])/((b[0]**2) + (b[2]**2))**1.5 


    return [vx,ax,vy,ay] 

t=sp.linspace(0.,10000000.,1000) 

xx0=[800000., 0., 10000, 0] 

soln=spi.odeint(f,xx0,t) 

print soln 

x=soln[:,0] 
v1=soln[:,1] 
y=soln[:,2] 
v2=soln[:,3] 

pl.figure(1) 
pl.plot(x,y) 
pl.xlabel("x displacement") 
pl.ylabel("y displacement") 

pl.show() 

這繪製了一條直線圖...也許我誤解了物理,但是有沒有代碼的問題?

僅供參考 - 我已經使用牛頓萬有引力定律和一些幾何定律計算了加速度方程。我主要問的是代碼中的問題,但是如果有物理學家注意到物理學中的任何問題,那麼我很樂意聽到他們的聲音!

+3

我沒有SciPy的,所以我不能運行的代碼,但你...你確定它不工作?也就是說,你繪製了軌跡,它應該是一條直線,因爲你不給它初始速度,所以它直線下降?嘗試'plot(t,y)'看看它是否在加速,並嘗試給出一個初始的'x'速度。 – tom10

+2

你是不是缺少函數內部? – Martin

+0

歡呼聲是的,我剛剛意識到,更早的數字,這是正確的謝謝。 – tcrules

回答

3

如果它讓你安心,我檢查了方程,它們是正確的(不是你有任何理由懷疑自己)。 :)

我認爲事情會出現問題的原因首先是,如果您需要對初始條件非常小心,那麼初始條件的一個數量級差異可能是衛星軌道火星和太陽系外的一個。其次,即使發現了一個明智的解決方案(我相信你的初始條件是),一旦方程式接近(x=0, y=0),事情會變得非常單一,最終導致巨大的加速度,導致衛星迅速消失。

要解決這個問題,您可以在x,y不接近零的函數中放置合適的檢查,如果它們是,則以某種方式結束頌歌解算器。

其次,當解決這種問題時,使用nondimensionalisation是明智的。這是一種方法,可以在其中重新調整因變量(x->x', y->y'),以使引導版本的順序爲一致。

在你的情況下,我將簡單地忽略該時間座標,並讓 X = X '* L Y = Y' * L

其中L是特徵長度尺度。如果你在你的方程中替代它,你將會得到一個術語G * mm/L**3。設置特徵長度以使該數量爲1:L = (G * mm)**(1/3.0)

這樣做的好處是解算器會更容易處理數字,從而提高速度。現在唯一的困難是設置合適的初始條件,通過簡單地採取合理的值,例如xx = 10km和重新調整xx'= xx/L等。

使用這種方法我可以讓你的代碼做一個很好的軌道。

enter image description here

+0

你能否詳述一下你設置L的意思?我不能完全按照你的意思。例如功率第三。 – tcrules

+0

對不起,我寫這個的時候有點晚了[這裏是推導](http ://imgur.com/P0NJuAe)我認爲這是分享它最簡單的方法,我之前就懶惰了,你可以通過計算L的單位(記住t = t')並得到這是一種常見的技術,對於這些類型的問題 – Greg

+0

謝謝你,不過,我只是在我的代碼中注意到它應該返回[ax,vx,ay,vy],而不是我寫的。它改變了一點 – tcrules