2016-04-26 67 views
1

我剛開始學python,我的老師讓我模擬知道發動機推力的模型火箭彈道。我怎樣才能使用scipy庫來獲得距離?

我已經使用odeint函數獲得了火箭的速度和加速度。但是,我不知道如何使用速度和時間。

我已經得到了距離火箭旅行的距離,因爲速度是由odeint函數解決的。

這裏是我寫的,以獲得速度的代碼:

def getforce(t): 
    if 0<=t<0.15: 
     F = 40*t 
    elif 0.15<=t<0.7: 
     F = -9.09*t+7.36 
    elif 0.7<=t<1.25: 
     F = 1 
    elif 1.25<=t<1.65: 
     F = 7.5*t-8.375 
    elif 1.65<=t<1.8:   
     F = -26.6*t+48 
    else: 
     F = 0 
    return F 

def getspeed(x,t): 
    Ft = getforce(t) 
    y0,y1 = x 
    dy0 = y1 
    dy1 = (Ft-0.0001277422*y1**2*np.sign(y1)-0.174)/0.0177 
    return dy0,dy1 

t = np.linspace(0,10,100) 
sol = si.odeint(getspeed,(0,0),t) 
plt.plot(t,sol[:,0]) 
plt.show() 
+0

您可以整合與速度的距離。 v(t)= dx/dt。爲了在數值上整合第一個幼稚(對於這個相對平滑的問題來說足夠好),方法是從零開始,然後在每一步添加v * deltat。 – roadrunner66

+0

謝謝你的回覆。我知道我應該整合與速度的距離,但我不知道我應該如何使用速度(這是一個numpy數組)來放入另一個函數。如果可能,你可以詳細說明或寫下代碼嗎? –

+0

沒有必要,我想我已經得到了它。謝謝! –

回答

0

假設一切是正確的,你只要用手整合的速度。 (我之所以不能很容易地檢查整體正確性,是因爲你在速度部分使用非正統(給定)表達式,而不是求解包含質量損失的搖擺方程F = ma - > d(M * v)/ dt的= DM/dt的* v + M * dv/dt的。)

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.integrate as si 
%matplotlib inline 

def getforce(t): 
    if 0<=t<0.15: 
     F = 40*t 
    elif 0.15<=t<0.7: 
     F = -9.09*t+7.36 
    elif 0.7<=t<1.25: 
     F = 1 
    elif 1.25<=t<1.65: 
     F = 7.5*t-8.375 
    elif 1.65<=t<1.8:   
     F = -26.6*t+48 
    else: 
     F = 0 
    return F 

def getspeed(x,t): 
    Ft = getforce(t) 
    y0,y1 = x 
    dy0 = y1 
    dy1 = (Ft-0.0001277422*y1**2*np.sign(y1)-0.174)/0.0177 
    return dy0,dy1 

t = np.linspace(0,10,100) 
sol = si.odeint(getspeed,(0,0),t) 
v=sol[:,0] 

x=0 
xs=[] 
dt=t[1]-t[0] # use linspace with 101 to get the sample distance you'd normally expect 
for i in range(len(v)): 
    x=x+v[i]*dt 
    xs.append(x) 
plt.subplot(121) 
plt.plot(t,v) 
plt.subplot(122) 
plt.plot(t,xs) 
plt.show() 

enter image description here

我沒有使用numpy的或lambda表達式進行整合,以保持它易於閱讀並且因爲這種情況下執行的速度並不重要。

+0

哦,非常感謝你!我認爲我將不得不再次使用scipy函數來獲得距離,但我認爲實際上這種方法更容易理解。再次感謝! –

+0

即使您使用scipy或numpy的更高級別的函數,在數值計算中,也應該始終將其與您可以輕鬆計算的其他數字進行比較,這是計算後計算中的特例或您自己的代碼。 – roadrunner66