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 >=0mu >=0 。中的数据 jac 必须以这样的方式存储: jac[i - j + mu, j] 持有 i 关于 j 此状态变量。如果 col_deriv 是真的吗,这个的转置 jac 必须归还。

RTOL,ATOL浮动,可选

输入参数 rtolatol 确定求解器执行的错误控制。求解器将根据以下形式的不等式控制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)方法允许的最大顺序。

参见

solve_ivp

求解常微分方程组的一个初值问题

ode

一种基于VODE的更面向对象的积分器

quad

用于查找曲线下的面积

示例

角度的二阶微分方程 theta 受重力和摩擦作用的钟摆可以写成::

theta''(t) + b*theta'(t) + c*sin(theta(t)) = 0

哪里 bc 是正常数,素数(‘)表示导数。要用来解此方程,请执行以下操作 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 以生成解决方案。要传递参数,请执行以下操作 bcpend ,我们把它们交给 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()
../../_images/scipy-integrate-odeint-1.png