2016-04-26 37 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