2
我想使用scipy.integrate.ode
求解器。我可以将可调用函数f
仅定义为离散点阵列(因为它取决于先前迭代的积分结果)。但从文档看来,集成商希望可调用函数是一个连续函数。我想有些内插需要完成。求解器可以自行处理,还是需要编写一些插值程序?是否有一些scipy文档/教程解释它?带离散化值的ODE积分
我想使用scipy.integrate.ode
求解器。我可以将可调用函数f
仅定义为离散点阵列(因为它取决于先前迭代的积分结果)。但从文档看来,集成商希望可调用函数是一个连续函数。我想有些内插需要完成。求解器可以自行处理,还是需要编写一些插值程序?是否有一些scipy文档/教程解释它?带离散化值的ODE积分
是的,可调用需要是一个函数,它返回提供给函数的任何值的导数。如果你有一个函数interp
该做插值,可以定义调用如下:
f = lambda t,y: interp(y, yvalues, fvalues)
如果你的系统是标量,你可以在下面的例子中使用numpy.interp
功能,如:
import numpy
from scipy import integrate
yvalues = numpy.arange(-2,3,0.1)
fvalues = - numpy.sin(yvalues)
f = lambda t,y: numpy.interp(y, yvalues, fvalues)
r = integrate.ode(f)
r.set_initial_value(1)
t1 = 10
dt = 0.1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print r.t, r.y
对于多维系统,插值非常复杂。如果有任何方法可以在给定的点上实时计算导数,那么实施起来可能比使用插值更容易。
正如unutbu在评论中指出的那样,如果插值,您将在混沌系统中得到足够长时间的错误解决方案。但是,由于任何数值求解算法都是如此,所以很难对此做任何事情。
所以你的意思是[scipy.integrate.ode](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode)? – unutbu
例如,如果您的ODE系统混乱,如[Lorenz系统](http://en.wikipedia.org/wiki/Lorenz_system),则插值导数可能会导致严重依赖于插值的结果。 – unutbu
是的,我的意思是'scipy.integrate.ode' –