Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 离散化值的常微分方程积分_Python_Scipy_Ode - Fatal编程技术网

Python 离散化值的常微分方程积分

Python 离散化值的常微分方程积分,python,scipy,ode,Python,Scipy,Ode,我想使用scipy.integrate.odesolver。我只能将可调用函数f定义为一个离散点数组(因为它取决于以前迭代的积分结果)。但是,从文档中可以看出,集成器希望可调用函数是一个连续函数。我想需要做一些插值。解算器可以自己处理这个问题吗,或者我需要编写一些插值例程吗?是否有一些scipy文档/教程对此进行了解释?是的,可调用函数需要是一个函数,它返回提供给该函数的任何值的导数。如果您有一个执行插值的函数interp,则可以如下定义可调用函数: f = lambda t,y: interp

我想使用
scipy.integrate.ode
solver。我只能将可调用函数
f
定义为一个离散点数组(因为它取决于以前迭代的积分结果)。但是,从文档中可以看出,集成器希望可调用函数是一个连续函数。我想需要做一些插值。解算器可以自己处理这个问题吗,或者我需要编写一些插值例程吗?是否有一些scipy文档/教程对此进行了解释?

是的,可调用函数需要是一个函数,它返回提供给该函数的任何值的导数。如果您有一个执行插值的函数
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
导入numpy
从scipy导入集成
Y值=numpy.arange(-2,3,0.1)
fvalues=-numpy.sin(yvalues)
f=lambda t,y:numpy.interp(y,y值,f值)
r=积分。ode(f)
r、 设置初始值(1)
t1=10
dt=0.1
当r.successful()和r.t
对于多维系统,插值是非常复杂的。如果有任何方法可以计算给定点的导数,那么它可能比使用插值更容易实现


正如unutbu在评论中指出的,如果你插值,你将在足够长的时间内得到一个混沌系统的错误解。然而,由于任何数值解算法都是如此,因此很难对此采取任何措施。

你的意思是?如果你的ODE系统是混沌的,那么插值导数可能会导致严重依赖于插值方式的结果,例如。是的,我的意思是
scipy.integrate.ODE