我想使用scipy.integrate.ode
求解器。我可以将可调用函数f
仅定义为离散点数组(因为它取决于先前迭代的积分结果)。但是从文档中可以看出,集成商希望可调用函数是一个连续函数。我想某种插值需要做。求解器可以单独处理这个问题,还是需要编写一些插值程序?是否有一些scipy文档/教程解释它?
答案 0 :(得分:1)
是的,callable需要是一个函数,它返回提供给函数的任何值的导数。如果你有一个函数interp
进行插值,你可以按如下方式定义callable:
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在评论中指出的那样,如果你进行插值,你将得到一个错误的解决方案,足够长时间使用混乱系统。但是,由于任何数值求解算法都是如此,因此很难对此做任何事情。