scipy.integrate.odeint¶
- scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0, tfirst=False)[源代码]¶
积分一组常微分方程组。
注解
对于新代码,请使用
scipy.integrate.solve_ivp
去解一个微分方程。用FORTRAN库ODEPACK中的ISODA解常微分方程组。
解决了一阶ODE-s::刚性或非刚性系统的初值问题
dy/dt = func(y, t, ...) [or func(t, y, ...)]
其中y可以是一个矢量。
注解
默认情况下,前两个参数的所需顺序为 func 属性使用的系统定义函数中的参数顺序相反。
scipy.integrate.ode
类和函数scipy.integrate.solve_ivp
。要将函数与签名一起使用,请执行以下操作func(t, y, ...)
,这个论点 tfirst 必须设置为True
。- 参数
- func可催缴(y,t,.)或可调用(t,y,.)
计算y在t的导数。如果签名为
callable(t, y, ...)
,然后这个论点 tfirst 必须设置True
。- y0阵列
y上的初始条件(可以是向量)。
- t阵列
要为y求解的时间点序列。初始值点应该是该序列的第一个元素。此序列必须是单调递增或单调递减;允许重复值。
- args元组,可选
要传递给函数的额外参数。
- Dfun可催缴(y,t,.)或可调用(t,y,.)
的梯度(雅可比) func 。如果签名是
callable(t, y, ...)
,然后这个论点 tfirst 必须设置True
。- col_deriv布尔值,可选
如果满足以下条件,则为真 Dfun 定义派生向下列(更快),否则 Dfun 应该定义跨行的派生函数。
- full_output布尔值,可选
如果要将可选输出的字典作为第二个输出返回,则为true
- printmessg布尔值,可选
是否打印收敛消息
- tfirst:布尔值,可选
如果为True,则 func (及 Dfun ,如果给定)必须
t, y
而不是默认设置y, t
。1.1.0 新版功能.
- 退货
- y数组,形状(len(T),len(Y0))
数组,该数组包含t中每个所需时间的y值,具有初始值 y0 在第一排。
- infodictDICT,仅当FULL_OUTPUT==True时返回
包含附加输出信息的字典
钥匙
含义
“胡”
成功用于每个时间步长的步长矢量
“tcur”
每个时间步长达到t值的向量(将始终至少与输入时间一样大)
“Tolsf”
检测到过高精度请求时计算的容差比例因子矢量,大于1.0
“TSW”
最后一次方法切换时的t值(为每个时间步长指定)
“nst”
累计时间步数
“nfe”
每个时间步的函数求值累计次数
“nje”
每个时间步长的雅可比求值累计次数
“NQUE”
每个成功步骤的方法顺序向量
“imxer”
错误返回时加权局部误差向量(e/ewt)中最大幅度分量的索引,否则为-1
“lenrw”
所需的双功数组的长度
“leniw”
所需整数工作数组的长度
“沉思”
每个成功时间步长的方法指示符向量:1:ADAMS(非刚性),2:BDF(刚性)
- 其他参数
- Ml,Mu整型,可选
如果这两个不是无或非负的,则假定雅可比是带状的。这给出了带状矩阵中非零下对角线和上对角线的数量。对于带状案件, Dfun 应返回其行包含非零带(从最低对角线开始)的矩阵。因此,返回矩阵 jac 从… Dfun 应该有形状
(ml + mu + 1, len(y0))
什么时候ml >=0
或mu >=0
。中的数据 jac 必须以这样的方式存储:jac[i - j + mu, j]
持有 i 关于 j 此状态变量。如果 col_deriv 是真的吗,这个的转置 jac 必须归还。- RTOL,ATOL浮动,可选
输入参数 rtol 和 atol 确定求解器执行的错误控制。求解器将根据以下形式的不等式控制y中估计的局部误差的向量e
max-norm of (e / ewt) <= 1
,其中ewt是正误差权重的向量,计算公式为ewt = rtol * abs(y) + atol
。RTOL和ATOL可以是长度与y相同的矢量,也可以是标量。默认为1.49012e-8。- tcritndarray,可选
应注意积分的临界点(例如奇点)的向量。
- h0浮点,(0:求解器确定),可选
要在第一步尝试的步长。
- hmax浮点,(0:求解器确定),可选
允许的最大绝对步长。
- hmin浮点,(0:求解器确定),可选
允许的最小绝对步长。
- ixpr布尔值,可选
是否在方法切换处生成额外打印。
- mxstepint,(0:求解器确定),可选
t中每个集成点允许的(内部定义的)最大步数。
- mxhnilint,(0:求解器确定),可选
打印的最大消息数。
- mxordnint,(0:求解器确定),可选
非刚性(亚当斯)方法允许的最大阶数。
- mxordsint,(0:求解器确定),可选
刚性(BDF)方法允许的最大顺序。
示例
角度的二阶微分方程 theta 受重力和摩擦作用的钟摆可以写成::
theta''(t) + b*theta'(t) + c*sin(theta(t)) = 0
哪里 b 和 c 是正常数,素数(‘)表示导数。要用来解此方程,请执行以下操作
odeint
首先,我们必须把它转化为一阶方程组。通过定义角速度omega(t) = theta'(t)
,我们获得系统::theta'(t) = omega(t) omega'(t) = -b*omega(t) - c*sin(theta(t))
让我们 y 做一个载体 [theta, omega] 。我们在Python中将此系统实现为:
>>> def pend(y, t, b, c): ... theta, omega = y ... dydt = [omega, -b*omega - c*np.sin(theta)] ... return dydt ...
我们假设常量是 b =0.25和 c =5.0:
>>> b = 0.25 >>> c = 5.0
对于初始条件,我们假设摆几乎垂直于 theta(0) = pi -0.1%,最初在睡觉,因此 omega(0) =0。那么初始条件的向量是
>>> y0 = [np.pi - 0.1, 0.0]
我们将在间隔0<=中的101个均匀间隔的样本上生成一个解 t <=10。所以我们的时间数组是:
>>> t = np.linspace(0, 10, 101)
打电话
odeint
以生成解决方案。要传递参数,请执行以下操作 b 和 c 至 pend ,我们把它们交给odeint
使用 args 论点。>>> from scipy.integrate import odeint >>> sol = odeint(pend, y0, t, args=(b, c))
解是一个形状为(101,2)的数组。第一列是 theta(t) ,第二个是 omega(t) 。下面的代码绘制这两个组件。
>>> import matplotlib.pyplot as plt >>> plt.plot(t, sol[:, 0], 'b', label='theta(t)') >>> plt.plot(t, sol[:, 1], 'g', label='omega(t)') >>> plt.legend(loc='best') >>> plt.xlabel('t') >>> plt.grid() >>> plt.show()