scipy.integrate.ode¶
- class scipy.integrate.ode(f, jac=None)[源代码]¶
数字积分器的通用接口类。
解方程组 \(y'(t) = f(t,y)\) 带有(可选)
jac = df/dy
。Note :的前两个论点
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)
。
- f :可调用
注意事项
下面列出了可用的积分器。可以使用 set_integrator 方法。
“沃德”
实值变系数常微分方程解算器,具有固定导引系数的实现。它提供了隐式Adams方法(对于非刚性问题)和基于后向微分公式(BDF)的方法(对于刚性问题)。
消息来源:http://www.netlib.org/ode/vode.f
警告
此集成器不能再进入。你不能有两个
ode
实例同时使用“Vode”集成器。此积分器接受以下参数 set_integrator 的方法。
ode
班级:ATOL:解决方案的浮点或序列绝对公差
rtol:解决方案的浮点或顺序相对公差
lband:无或整型
子带:无或整数雅可比带宽,Jac [i,j] !=0表示i-lband<=j<=i+子带。设置这些参数需要JAC例程以打包格式JAC_PACKED返回雅可比 [i-j+uband, j] =JAC [i,j] 。矩阵的维度必须是(lband+uband+1,len(Y))。
方法:要使用的求解器为‘ADAMS’或‘BDF’,ADAMS(非刚性)或BDF(刚性)
with_Jacobian:Bool仅当用户未提供Jacobian函数且未指示(通过设置任何波段)Jacobian为带状时,才会考虑此选项。在这种情况下, with_jacobian 指定ODE解算器校正步骤的迭代方法是使用内部生成的完整Jacobian的弦迭代,还是不使用Jacobian的函数迭代。
nstep:int在一次解算器调用期间允许的(内部定义的)最大步数。
FIRST_STEP:浮点
MIN_STEP:浮点
MAX_STEP:积分器使用的步长的浮动限制。
订单:整合商使用的最大订单,ADAMS的订单<=12,BDF的订单<=5。
“zvode”
复值变系数常微分方程解算器,具有固定导引系数的实现。它提供了隐式Adams方法(对于非刚性问题)和基于后向微分公式(BDF)的方法(对于刚性问题)。
消息来源:http://www.netlib.org/ode/zvode.f
警告
此集成器不能再进入。你不能有两个
ode
实例同时使用“zvode”集成器。此积分器在中接受相同的参数 set_integrator 作为“沃德”解算器。
注解
当对刚性系统使用ZVODE时,它只能用于函数f是解析函数的情况,即每个f(I)都是每个y(J)的解析函数。解析性意味着偏导数df(I)/dy(J)是唯一的复数,这一事实对于ZVODE解决在刚性情况下出现的稠密或带状线性系统的方式至关重要。对于f不是解析的复刚性常微分方程系统,ZVODE很可能会有收敛失败,对于这个问题,人们应该在等价的实系统(在y的实部和虚部)上使用DVODE。
“汽水”
实值变系数常微分方程解算器,具有固定导引系数的实现。它提供了隐式亚当斯方法(对于非刚性问题)和基于后向微分公式(BDF)的方法(对于刚性问题)之间的自动切换。
消息来源:http://www.netlib.org/odepack
警告
此集成器不能再进入。你不能有两个
ode
实例同时使用“lsoda”集成器。此积分器接受以下参数 set_integrator 的方法。
ode
班级:ATOL:解决方案的浮点或序列绝对公差
rtol:解决方案的浮点或顺序相对公差
lband:无或整型
子带:无或整数雅可比带宽,Jac [i,j] !=0表示i-lband<=j<=i+子带。设置这些参数需要JAC例程以打包格式JAC_PACKED返回雅可比 [i-j+uband, j] =JAC [i,j] 。
使用_Jacobian:布尔值 没有用过。
nstep:int在一次解算器调用期间允许的(内部定义的)最大步数。
FIRST_STEP:浮点
MIN_STEP:浮点
MAX_STEP:积分器使用的步长的浮动限制。
max_order_ns:int在非刚性情况下使用的最大顺序(默认值为12)。
max_order_s:int硬性情况下使用的最大顺序(默认值为5)。
max_hnil:int报告步长太小的最大消息数(t+h=t)(默认值0)
ixpr:int是否在方法切换处生成额外打印(默认值为false)。
“兴奋剂5”
这是一个显式的(4)5阶Runge-Kutta方法,这是由于Dormand&Prince方法(具有步长控制和密集输出)。
作者:
首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容电子邮件:ernst.hairer@math.unige.ch,gerhard.wanner@math.unige.ch
有关此代码的说明,请参阅 [HNW93].
此集成器接受ODE类的set_Integrator()方法中的以下参数:
ATOL:解决方案的浮点或序列绝对公差
rtol:解决方案的浮点或顺序相对公差
nstep:int在一次解算器调用期间允许的(内部定义的)最大步数。
FIRST_STEP:浮点
MAX_STEP:浮点
安全性:新台阶选择时的浮动安全系数(默认值0.9)
ifactor:浮点
dfactor:浮动最大因子,一步增加/减少步长
Beta:用于稳定步长控制的浮动Beta参数。
详细程度:用于打印消息的int开关(<0表示无消息)。
“多用853”
这是一个8(5,3)阶的显式Runge-Kutta方法,这是由于Dormand&Prince方法(具有步长控制和稠密输出)。
选项和引用与“dori5”相同。
参考文献
- HNW93
E.海尔,S.P.Norsett和G.Wanner,解常微分方程,即非刚性问题。第二版。计算数学中的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 ]
- 属性
- t浮动
当前时间。
- yndarray
当前变量值。
方法:
get_return_code
\()提取集成的返回代码,以便在集成失败时实现更好的控制。
integrate
\(t[, step, relax] )找到y=y(T),将y设置为初始条件,然后返回y。
set_f_params
\(*参数)为用户提供的函数f设置额外参数。
set_initial_value
\(y[, t] )设置初始条件y(T)=y。
set_integrator
\(名称,** 集成器_参数)按名称设置Integrator。
set_jac_params
\(*参数)为用户提供的函数JAC设置额外参数。
set_solout
\(单点输出)将Callable设置为在每个成功的集成步骤中调用。
successful
\()检查集成是否成功。