如何使用scipy.integrate.ode找到方程的一阶导数等于0的点?
我设置了这个函数,它得到了答案,但是我不确定它的准确性,而且它不是最有效的方法。
基本上,我用这个函数来计算初始速度的弹丸停止运动的时间。对于ODEs系统,有没有更好的方法来解决这个问题?
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)
最佳答案
一般来说,解决这类问题的一个好方法是重写方程,使速度为自变量,时间和距离为因变量。然后,你只需要把方程从v=v0积分到v=0。
然而,在您给出的示例中,根本不需要使用scipy.integrate
。方程可以很容易地用铅笔和纸求解(变量分离后用标准积分)。结果是
t=(m/(2 Cp))阿卡坦(v0/2)
其中v0是初始速度,arctan的结果必须以弧度为单位。
对于100 m/s的初始速度,答案是15.5079899282秒。
关于python - 用odeint查找零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5267261/