如何使用scipy.integrate.ode找到我方程的一阶导数等于0的点?
我设置了这个功能,它得到了答案,但我不确定准确性,也不是最有效的方法。
基本上我使用此功能来查找初始速度停止移动的射弹的时间。对于ODE系统,有没有更好的方法来解决这个问题?
import numpy as np
from scipy import integrate
def find_nearest(array,value):
idx=(np.abs(array-value)).argmin()
return array[idx], idx
def deriv(x,t):
# This function sets up the following relations
# dx/dt = v , dv/dt = -(Cp/m)*(4+v^2)
return np.array([ x[1], -(0.005/0.1) * (4+ (x[1]**2)) ])
def findzero(start, stop, v0):
time = np.linspace(start, stop, 100000)
#xinit are initial vaules of equation
xinit = np.array([0.0,v0])
x = integrate.odeint(deriv,xinit,time)
# find nearest velocity value nearest to 0
value, num = find_nearest(x[:,1],0.0001)
print 'closest value ',
print value
print 'reaches zero at time ',
print time[num]
return time[num]
# from 0 to 20 seconds with initial velocity of 100 m/s
b = findzero(0.0,20.0,100.0)
答案 0 :(得分:4)
一般来说,解决此类问题的一个好方法是重写方程式,使速度成为自变量,时间和距离是因变量。然后,您只需要将v = v0到v = 0的方程式进行积分。
但是,在您给出的示例中,甚至根本不需要诉诸scipy.integrate
。用铅笔和纸可以很容易地求解方程(变量分离后跟标准积分)。结果是
t =(m /(2 Cp))arctan(v0 / 2)
其中v0是初始速度,arctan的结果必须以弧度为单位。
对于100 m / s的初始速度,答案是15.5079899282秒。
答案 1 :(得分:0)
我会使用类似scipy.optimize.fsolve()
的东西来找到衍生物的根。使用它,可以向后工作以找到到达根的时间。