离散数值ODE积分

3
我想使用scipy.integrate.ode求解器。我只能将可调用函数f定义为离散点的数组(因为它依赖于前几次迭代的积分结果)。但从文档中得知,积分器期望可调用函数是一个连续函数。我想这需要进行某种插值处理。求解器能否自己处理这个问题,还是我需要编写一些插值例程?是否有一些关于scipy的文档/教程可以解释这个问题?

你的意思是 scipy.integrate.ode 吗? - unutbu
如果你的ODE系统是混沌的,比如Lorenz系统,那么插值导数可能会导致结果严重依赖于你如何插值。 - unutbu
是的,我指的是 scipy.integrate.ode - John Newman
1个回答

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在评论中指出的那样,如果进行插值,对于混沌系统,随着时间足够长,您将得到错误的解决方案。然而,由于任何数值解算法都是如此,因此很难采取任何措施。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接