2013-01-01 60 views
2

我想使用scipy.integrate.ode求解器。我可以将可调用函数f仅定义为离散点阵列(因为它取决于先前迭代的积分结果)。但从文档看来,集成商希望可调用函数是一个连续函数。我想有些内插需要完成。求解器可以自行处理,还是需要编写一些插值程序?是否有一些scipy文档/教程解释它?带离散化值的ODE积分

+0

所以你的意思是[scipy.integrate.ode](http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html#scipy.integrate.ode)? – unutbu

+0

例如,如果您的ODE系统混乱,如[Lorenz系统](http://en.wikipedia.org/wiki/Lorenz_system),则插值导数可能会导致严重依赖于插值的结果。 – unutbu

+0

是的,我的意思是'scipy.integrate.ode' –

回答

1

是的,可调用需要是一个函数,它返回提供给函数的任何值的导数。如果你有一个函数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在评论中指出的那样,如果插值,您将在混沌系统中得到足够长时间的错误解决方案。但是,由于任何数值求解算法都是如此,所以很难对此做任何事情。