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]
。 通过调用set_jac_params(*args)
设置jac_args
。
- f可调用的
说明
可用的积分器如下所示。可以使用
set_integrator
方法选择它们。“vode”
实值变系数常微分方程求解器,具有固定先导系数实现。它提供隐式 Adams 方法(用于非刚性问题)和基于后向差分公式 (BDF) 的方法(用于刚性问题)。
来源:http://www.netlib.org/ode/vode.f
警告
此积分器非可重入。不能同时使用两个
ode
实例使用“vode”积分器。此积分器接受
set_integrator
方法中的以下参数,该方法属于ode
类atol :解的浮点或序列绝对容差
rtol :解的浮点或序列相对容差
lband : None 或 int
uband : None 或 int 雅可比矩阵带宽,jac[i,j] != 0,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 :当用户未提供雅可比函数,也未指示(通过设置一个数据带)雅可比矩阵为带状矩阵时,此选项才被考虑。在这种情况下,with_jacobian 指定 ODE 求解器的校正步骤的迭代方法是使用内部生成的完整雅可比矩阵的弦迭代,还是不使用雅可比矩阵的功能迭代。
nsteps :在对求解器进行一次调用期间允许的最大(内部定义)步骤数。
first_step : float
min_step : float
max_step : float 积分器使用的步长的限制。
order : int 积分器使用最大阶数,order <= 12(用于 Adams),<= 5(用于 BDF)。
“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
实例。此积分器接受
set_integrator
方法中的以下参数,该方法属于ode
类atol :解的浮点或序列绝对容差
rtol :解的浮点或序列相对容差
lband : None 或 int
uband : 无或整数 雅可比带宽度,jac[i,j] != 0 对于 i-lband <= j <= I+uband。此设置要求你的 jac 例程以打包格式返回雅可比,jac_packed[i-j+uband, j] = jac[i,j]。
with_jacobian : 布尔值 未使用。
nsteps :在对求解器进行一次调用期间允许的最大(内部定义)步骤数。
first_step : float
min_step : float
max_step : float 积分器使用的步长的限制。
max_order_ns : 整数 非刚性情况下使用的最大次数(默认 12)。
max_order_s : 整数 刚性情况下使用的最大次数(默认 5)。
max_hnil : 整数 报告步长太小(t + h = t)的最大消息数(默认 0)
ixpr : 整数 是否在方法切换时生成额外的打印(默认 False)。
“dopri5”
这是 Dormand 及 Prince 开发的(具有步长控制和密集输出)阶为 (4)5 的显式 Runge-Kutta 方法。
作者
E. Hairer,G. Wanner 教授,日内瓦大学数学系,瑞士日内瓦,邮编 1211 24,电子邮件地址:ernst.hairer@math.unige.ch,gerhard.wanner@math.unige.ch
此代码在[HNW93]中进行了描述。
此积分器接受 ode 类中的 set_integrator() 方法中的以下参数
atol :解的浮点或序列绝对容差
rtol :解的浮点或序列相对容差
nsteps :在对求解器进行一次调用期间允许的最大(内部定义)步骤数。
first_step : float
max_step: 浮点数
safety: 为新步长选择的安全系数(默认 0.9)
ifactor: 浮点数
dfactor: 可在一步之内增加/减少步长的最大因数
beta: 用于稳定步长控制的 beta 参数。
verbosity: 用于打印消息的开关(小于 0 表示没有消息)。
“dop853”
这是 Dormand 和 Prince(带有步长控制和密集输出)提出的一个 8(5,3) 级的显式龙格-库塔方法。
选项和引用与“dopri5”相同。
参考
[HNW93]E. Hairer、S.P. Norsett 和 G. Wanner,求解常微分方程一。非刚性问题。第二版。施普林格计算数学丛书,施普林格出版社 (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
当前变量值。
方法
提取用于更好的积分失败控制的积分返回代码。
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)设置回调函数,在每次积分成功时调用。
检查积分是否成功。