我怎么能用scipy库来获取距离?

时间:2016-04-26 22:21:33

标签: python

我刚开始学习python,我的老师要我模拟发动机推力的模型火箭轨迹。

我已经使用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()

1 个答案:

答案 0 :(得分:0)

假设其他一切都是正确的,您只需手动整合速度。

(我无法轻易检查整体正确性的原因是你在速度部分使用非正统(给定)表达式,而不是解决包含质量损失F = ma的摇摆方程式 - &gt; 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表达式进行集成以使其易于阅读,因为执行速度对于这种情况并不重要。