我刚开始学习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()
答案 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()
我没有使用numpy或lambda表达式进行集成以使其易于阅读,因为执行速度对于这种情况并不重要。