scipy.integrate.

ode#

class scipy.integrate.ode(f, jac=None)[source]#

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

求解方程系统 \(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)

设置在每个成功积分步骤中被调用的可调用对象。

成功()

检查积分是否成功。

另请参阅

odeint

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

quad

用于计算曲线下面积

备注

可用的积分器列在下面。可以使用 set_integrator 方法选择它们。

“vode”

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

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

警告

此积分器不可重入。您不能同时使用两个采用“vode”积分器的 ode 实例。

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

  • atol : 浮点数或序列 解决方案的绝对容差

  • rtol : 浮点数或序列 解决方案的相对容差

  • lband : 无或整数

  • uband : 无或整数 雅可比带宽度,对于 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 : 布尔值 仅当用户未提供雅可比函数且未指示(通过设置任一带)雅可比矩阵为带状时,才考虑此选项。在这种情况下,with_jacobian 指定 ODE 求解器修正步骤的迭代方法是带有内部生成的完整雅可比矩阵的弦迭代,还是不带雅可比矩阵的函数迭代。

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

  • first_step : 浮点数

  • min_step : 浮点数

  • max_step : 浮点数 积分器使用的步长限制。

  • order : 整数 积分器使用的最大阶数,Adams 方法 <= 12 阶,BDF 方法 <= 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 可能会出现收敛失败,对于此问题,应转而对等效的实数系统(在 y 的实部和虚部中)使用 DVODE。

“lsoda”

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

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

警告

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

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

  • atol : 浮点数或序列 解决方案的绝对容差

  • rtol : 浮点数或序列 解决方案的相对容差

  • lband : 无或整数

  • uband : 无或整数 雅可比带宽度,对于 i-lband <= j <= i+uband,jac[i,j] != 0。设置这些参数要求您的 jac 例程以紧凑格式返回雅可比矩阵,即 jac_packed[i-j+uband, j] = jac[i,j]。

  • with_jacobian : 布尔值 未使用。

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

  • first_step : 浮点数

  • min_step : 浮点数

  • max_step : 浮点数 积分器使用的步长限制。

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

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

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

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

“dopri5”

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

作者

E. Hairer 和 G. Wanner 日内瓦大学,数学系 瑞士 CH-1211 日内瓦 24 电子邮件:ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch

此代码在 [HNW93] 中有描述。

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

  • atol : 浮点数或序列 解决方案的绝对容差

  • rtol : 浮点数或序列 解决方案的相对容差

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

  • first_step : 浮点数

  • max_step : 浮点数

  • safety : 浮点数 新步长选择的安全因子(默认值 0.9)

  • ifactor : 浮点数

  • dfactor : 浮点数 单步中增大/减小步长的最大因子

  • beta : 浮点数 用于稳定步长控制的 Beta 参数。

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

“dop853”

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

选项和参考文献与“dopri5”相同。

参考文献

[HNW93]

E. Hairer, S.P. Norsett 和 G. Wanner,《常微分方程求解 i. 非刚性问题》。第二版。计算数学施普林格丛书,施普林格出版社 (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        ]