使用odeint查找零值

时间:2011-03-10 23:36:26

标签: python numpy scipy

如何使用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)

2 个答案:

答案 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()的东西来找到衍生物的根。使用它,可以向后工作以找到到达根的时间。