Python 我如何使用scipy library获得距离?

Python 我如何使用scipy library获得距离?,python,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

我刚开始学习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()
def getforce(t):

如果0假设其他一切都是正确的,您只需手动积分速度

(我无法轻松检查整体正确性的原因是,在速度部分使用了一个非正统(给定)表达式,而不是求解包含质量损失F=ma-->d(m*v)/dt=dm/dt*v+m*dv/dt的摇摆方程。)

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入scipy.integrate作为si
%matplotlib内联
def getforce(t):

如果0假设其他一切都是正确的,您只需手动积分速度

(我无法轻松检查整体正确性的原因是,在速度部分使用了一个非正统(给定)表达式,而不是求解包含质量损失F=ma-->d(m*v)/dt=dm/dt*v+m*dv/dt的摇摆方程。)

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入scipy.integrate作为si
%matplotlib内联
def getforce(t):

如果0,您可以将距离与速度积分。v(t)=dx/dt。要进行数值积分,第一个简单的方法(对于这个相对平滑的问题来说已经足够好了)是从零开始,然后在每一步添加v*deltat。谢谢您的回复。我知道我应该积分距离和速度,但我不知道如何使用速度(一个numpy数组)来加入另一个函数。如果可能的话,你能详细说明或写下代码吗?没有必要,我想我已经知道了。谢谢你可以把距离和速度积分。v(t)=dx/dt。要进行数值积分,第一个简单的方法(对于这个相对平滑的问题来说已经足够好了)是从零开始,然后在每一步添加v*deltat。谢谢您的回复。我知道我应该积分距离和速度,但我不知道如何使用速度(一个numpy数组)来加入另一个函数。如果可能的话,你能详细说明或写下代码吗?没有必要,我想我已经知道了。谢谢哦,太谢谢你了!!我想我必须再次使用scipy函数来获得距离,但我认为实际上这种方法更容易理解。再次感谢!即使您使用的是scipy或numpy的高级函数,在数值计算中,您也应该始终将其与您可以轻松计算的其他数字进行比较,无论是信封背面计算中的特殊情况还是您自己的代码。哦,非常感谢!!我想我必须再次使用scipy函数来获得距离,但我认为实际上这种方法更容易理解。再次感谢!即使您使用scipy或numpy的更高级别函数,在数值计算中,您也应该始终将其与您可以轻松计算的其他数字进行比较,无论是信封背面计算中的特殊情况还是您自己的代码。
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()