scipy.integrate.

ode#

class scipy.integrate.ode(f, jac=None)[源代码][源代码]#

一个通用的数值积分器接口类。

求解方程组 \(y'(t) = f(t,y)\) ,可选参数 jac = df/dy

注意f(t, y, ...) 的前两个参数与 scipy.integrate.odeint 使用的系统定义函数的参数顺序相反。

参数:
f : 可调用函数 f(t, y, *f_args)可调用

微分方程的右侧。t 是一个标量,y.shape == (n,)f_args 通过调用 set_f_params(*args) 设置。f 应返回一个标量、数组或列表(而不是元组)。

jac : 可调用的 jac(t, y, *jac_args), 可选可调用

右侧的雅可比矩阵,jac[i,j] = d f[i] / d y[j]jac_args 是通过调用 set_jac_params(*args) 设置的。

属性:
t浮动

当前时间。

yndarray

当前变量值。

方法

get_return_code()

提取集成返回代码,以便在集成失败时实现更好的控制。

integrate(t[, step, relax])

找到 y=y(t),将 y 设为初始条件,并返回 y。

set_f_params(*args)

为用户提供的函数 f 设置额外参数。

set_initial_value(y[, t])

设置初始条件 y(t) = y。

set_integrator(name, **integrator_params)

按名称设置积分器。

set_jac_params(*args)

为用户提供的函数 jac 设置额外参数。

set_solout(solout)

设置在每次成功积分步骤时调用的可调用对象。

successful()

检查集成是否成功。

参见

odeint

一个基于 ODEPACK 中 lsoda 的、接口更简单的积分器

quad

用于求曲线下的面积

注释

可用的积分器如下所列。它们可以通过 set_integrator 方法进行选择。

vode

实值变系数常微分方程求解器,具有固定前导系数的实现。它提供了隐式Adams方法(用于非刚性问题)和基于向后差分公式(BDF)的方法(用于刚性问题)。

源代码: http://www.netlib.org/ode/vode.f

警告

这个积分器不是可重入的。你不能同时有两个使用“vode”积分器的 ode 实例。

该积分器在 ode 类的 set_integrator 方法中接受以下参数:

  • atol : float 或 sequence 解的绝对容差

  • rtol : float 或 sequence 解的相对容差

  • lband : 无或整数

  • uband : None 或 int 雅可比带宽,对于 i-lband <= j <= i+uband,jac[i,j] != 0。设置这些需要你的 jac 例程以压缩格式返回雅可比矩阵,jac_packed[i-j+uband, j] = jac[i,j]。矩阵的维度必须是 (lband+uband+1, len(y))。

  • method: ‘adams’ 或 ‘bdf’ 使用哪个求解器,Adams(非刚性)或 BDF(刚性)

  • with_jacobian : bool 当用户没有提供雅可比函数且没有通过设置任一频带指示雅可比矩阵是带状时,此选项才会被考虑。在这种情况下,with_jacobian 指定 ODE 求解器的校正步骤的迭代方法是使用内部生成的完整雅可比矩阵的弦迭代,还是不使用雅可比矩阵的功能迭代。

  • nsteps : int 在一次求解器调用期间允许的最大(内部定义的)步数。

  • first_step : float

  • min_step : float

  • max_step : float 积分器使用的步长限制。

  • order : int 积分器使用的最大阶数,Adams 方法中 order <= 12,BDF 方法中 order <= 5。

zvode

复值变系数常微分方程求解器,具有固定首系数的实现。它提供了隐式Adams方法(用于非刚性问题)和基于向后差分公式(BDF)的方法(用于刚性问题)。

来源: http://www.netlib.org/ode/zvode.f

警告

此积分器不是可重入的。你不能同时有两个使用“zvode”积分器的 ode 实例。

这个积分器在 set_integrator 中接受的参数与“vode”求解器相同。

备注

在使用 ZVODE 求解刚性系统时,应仅用于函数 f 是解析函数的情况,即每个 f(i) 是每个 y(j) 的解析函数。解析性意味着偏导数 df(i)/dy(j) 是一个唯一的复数,这一事实在 ZVODE 求解刚性情况下出现的稠密或带状线性系统的方式中至关重要。对于 f 不是解析函数的复刚性 ODE 系统,ZVODE 可能会出现收敛失败,对于此类问题,应改为使用 DVODE 求解等效的实数系统(在 y 的实部和虚部中)。

lsoda

实值变系数常微分方程求解器,具有固定首系数的实现。它提供自动方法切换,介于隐式Adams方法(用于非刚性问题)和基于向后微分公式(BDF)的方法(用于刚性问题)之间。

来源: http://www.netlib.org/odepack

警告

此积分器不是可重入的。你不能同时有两个使用“lsoda”积分器的 ode 实例。

该积分器在 ode 类的 set_integrator 方法中接受以下参数:

  • atol : float 或 sequence 解的绝对容差

  • rtol : float 或 sequence 解的相对容差

  • lband : 无或整数

  • uband : None 或 int 雅可比带宽,对于 i-lband <= j <= i+uband,jac[i,j] != 0。设置这些需要你的 jac 例程以打包格式返回雅可比矩阵,jac_packed[i-j+uband, j] = jac[i,j]。

  • with_jacobian : bool 未使用。

  • nsteps : int 在一次求解器调用期间允许的最大(内部定义的)步数。

  • first_step : float

  • min_step : float

  • max_step : float 积分器使用的步长限制。

  • max_order_ns : int 非刚性情况下使用的最大阶数(默认值为12)。

  • max_order_s : int 在刚性情况下使用的最大阶数(默认值为5)。

  • max_hnil : int 报告步长过小的消息的最大数量(t + h = t)(默认 0)

  • ixpr : int 是否在方法切换时生成额外的打印(默认 False)。

dopri5

这是一个由于Dormand & Prince提出的显式龙格-库塔方法,阶数为(4)5(带有步长控制和密集输出)。

作者:

E. Hairer and G. Wanner Universite de Geneve, Dept. de Mathematiques CH-1211 Geneve 24, Switzerland e-mail: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch

此代码在 [HNW93] 中描述。

此积分器在 ode 类的 set_integrator() 方法中接受以下参数:

  • atol : float 或 sequence 解的绝对容差

  • rtol : float 或 sequence 解的相对容差

  • nsteps : int 在一次求解器调用期间允许的最大(内部定义的)步数。

  • first_step : float

  • max_step : float

  • safety : float 新步长选择的安全系数(默认值为0.9)

  • ifactor : float

  • dfactor : float 在一次步长调整中,步长增加/减少的最大因子

  • beta : float 稳定步长控制的Beta参数。

  • verbosity : int 打印消息的开关(< 0 表示不打印消息)。

dop853

这是一个由Dormand & Prince提出的8(5,3)阶显式Runge-Kutta方法(带有步长控制和密集输出)。

选项和引用与“dopri5”相同。

参考文献

[HNW93]

E. Hairer, S.P. Norsett and G. Wanner, Solving Ordinary Differential Equations i. Nonstiff Problems. 2nd edition. Springer Series in Computational Mathematics, Springer-Verlag (1993)

示例

一个需要整合的问题及其对应的雅可比矩阵:

>>> from scipy.integrate import ode
>>>
>>> y0, t0 = [1.0j, 2.0], 0
>>>
>>> def f(t, y, arg1):
...     return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
>>> def jac(t, y, arg1):
...     return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

集成:

>>> r = ode(f, jac).set_integrator('zvode', method='bdf')
>>> r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
>>> t1 = 10
>>> dt = 1
>>> while r.successful() and r.t < t1:
...     print(r.t+dt, r.integrate(r.t+dt))
1 [-0.71038232+0.23749653j  0.40000271+0.j        ]
2.0 [0.19098503-0.52359246j 0.22222356+0.j        ]
3.0 [0.47153208+0.52701229j 0.15384681+0.j        ]
4.0 [-0.61905937+0.30726255j  0.11764744+0.j        ]
5.0 [0.02340997-0.61418799j 0.09523835+0.j        ]
6.0 [0.58643071+0.339819j 0.08000018+0.j      ]
7.0 [-0.52070105+0.44525141j  0.06896565+0.j        ]
8.0 [-0.15986733-0.61234476j  0.06060616+0.j        ]
9.0 [0.64850462+0.15048982j 0.05405414+0.j        ]
10.0 [-0.38404699+0.56382299j  0.04878055+0.j        ]