2012-03-01 54 views
2

我們有兩個質量相等的質量爲0.1kg的硬質彈簧連接,k = 10^5N/m。彈簧的剩餘長度(以及兩個質量之間的初始距離)爲d0 = 0.15m質量1具有初始速度(2.77,1.25,0)m/s,而質量2具有初始速度(1.25,4 ,0)m/s。兩個質量通過彈簧連接...試圖模擬飛行,但有困難

我想寫一個代碼,模擬重力下這個系統的飛行,而忽略空氣阻力。我也想放置位於系統質量中心的第三個球體。

這是我到目前爲止已經寫的:

from visual import * 

mass1 = sphere(radius = 0.01) 
mass2 = sphere(pos = (0.15, 0, 0), radius = 0.01) 
COM = sphere(pos = (0.15/2, 0, 0), radius = 0.01) 

mass1.m = 0.1 
mass2.m = 0.1 

k = 1*10**5 

mass1.v = vector(2.77, 1.25, 0) 
mass2.v = vector(1.25, 4, 0) 

mass1.p = mass1.v*mass1.m 
mass2.p = mass2.v*mass2.m 

dt = 0.0001 
t = 0 

while 1: 
    g = 9.8 
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos) 

    Ft12 = mass1.m*d*k*0.15 
    Ft21 = mass2.m*d*k*0.15 

    Fnet = Ft12 + Ft21 

    mass1.p += Fnet*dt 
    mass2.p += Fnet*dt 

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m)) 
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m)) 

    mass1.pos += mass1.vA*dt 
    mass2.pos += mass2.vA*dt 
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos 

    t += dt 

FT12是緊張的,從球1的力球2,Ft21從2到1。當然,我也不會發布如果我得到準確的結果,但我甚至沒有得到我可以隨時觀察的結果。屏幕很快變得空白,我沒有機會看到發生了什麼。我基本上希望這個系統在重力的作用下被「拋出」,在這個系統中你可以想象投影機的軌跡將是拋物線的軌跡。任何幫助將不勝感激。如果我的部隊錯了,或者我需要在某些地方添加一些,請告訴我!

謝謝大家!

回答

3

我對此行十分懷疑:

dt += 1 

我猜dt是時間步長。每循環一次,您的時間步長就會增加一秒。通常你會增加時間:

t += dt 

但你還沒有時間變量呢。一旦你的時間步長變大,所有的地獄都會崩潰。現在我只想刪除dt += 1這一行。

至於其餘的代碼,我沒有詳細看過它,我無法猜測你的符號是什麼意思。代碼中可能存在更多問題。

+0

謝謝你指出。現在我想到了,它確實沒有任何意義。 – 2012-03-01 21:06:27

2

你沒有'睡眠'時間,你在延遲你的動畫。隨着時間的推移球體從屏幕上消失(我沒有真正看過它的物理特性,所以我不知道你是否想要這樣做),並且因爲你在時間步長之間沒有任何延遲 - 它們似乎立即消失。

如果

from time import sleep 

,那麼你可以運行下面的循環,而不是

dt = 0.0001 
for step in range(1000): 
    g = 9.8 
    d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos) 

    Ft12 = mass1.m*d*k*0.15 
    Ft21 = mass2.m*d*k*0.15 

    Fnet = Ft12 + Ft21 

    mass1.p += Fnet*(dt*step) 
    mass2.p += Fnet*(dt*step) 

    mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m)) 
    mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m)) 

    mass1.pos += mass1.vA*(dt*step) 
    mass2.pos += mass2.vA*(dt*step) 
    COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos 
    sleep(0.5) 

我只取出,而(1),因爲我不喜歡無限循環= P

這至少可以讓你看到三個球體在做什麼,所以你可以檢查它們是否按照你的期望行事。

+0

「費率」不會以同樣的方式工作嗎? – 2012-03-01 21:24:33

+1

是的,如果你願意使用它,費率也會以同樣的方式工作。我不經常使用vpython,所以不知道它存在。 – MDT 2012-03-01 23:04:42