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) 设置。

另请参见

odeint

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

quad

用于查找曲线下的面积

注释

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

“vode”

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

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

警告

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

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

  • atol : float 或序列,解的绝对容差

  • rtol : float 或序列,解的相对容差

  • lband : None 或 int

  • uband : None 或 int 雅可比矩阵带宽,jac[i,j] != 0 for i-lband <= j <= i+uband。设置这些需要您的 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 为 <= 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 或序列,解的绝对容差

  • rtol : float 或序列,解的相对容差

  • lband : None 或 int

  • uband : None 或 int 雅可比矩阵带宽,jac[i,j] != 0 for i-lband <= j <= i+uband。设置这些需要您的 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 和 G. Wanner Universite de Geneve, Dept. de Mathematiques CH-1211 Geneve 24, Switzerland 电子邮件: ernst.hairer@math.unige.ch, gerhard.wanner@math.unige.ch

此代码在 [HNW93] 中描述。

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

  • atol : float 或序列,解的绝对容差

  • rtol : float 或序列,解的相对容差

  • 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) 阶显式龙格-库塔方法 (具有步长控制和密集输出)。

选项和参考资料与 “dopri5” 相同。

参考资料

[HNW93]

E. Hairer, S.P. Norsett 和 G. Wanner,《求解常微分方程 i. 非刚性问题》。第 2 版。Springer 计算数学系列,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        ]
属性:
tfloat

当前时间。

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()

检查积分是否成功。