integrate函数python_python scipy integrate.odeint用法及代码示例

整合常微分方程组。

使用FORTRAN库odepack中的lsoda求解常微分方程组。

解决一阶ode-s的刚性或非刚性系统的初值问题:

dy/dt = func(y, t, ...) [or func(t, y, ...)]

y可以是向量。

注意

缺省情况下,func的前两个参数的要求顺序与参数使用的系统定义函数中参数的顺序相反。scipy.integrate.ode类和函数scipy.integrate.solve_ivp。将函数与签名一起使用func(t, y, ...),论点第一必须设置为True。

参数:

func:callable(y, t, …) 或 callable(t, y, …)计算t处y的导数。如果签名是callable(t, y, ...),则必须设置参数tfirstTrue。

y0:arrayy的初始条件(可以是向量)。

t:array求解y的时间点序列。初始值点应该是此序列的第一个元素。此序列必须单调增加或单调减少;允许重复的值。

args:tuple, 可选参数传递给函数的额外参数。

Dfun:callable(y, t, …) 或 callable(t, y, …)func的梯度(雅可比)。如果签名是callable(t, y, ...),然后是第一必须设置True。

col_deriv:bool, 可选参数如果Dfun(向下)更快地定义了导数,则为True,否则Dfun应该跨行定义导数。

full_output:bool, 可选参数如果返回可选输出的字典作为第二个输出,则为True

printmessg:bool, 可选参数是否打印收敛信息

tfirst:bool, optional:如果为True,则func(和Dfun,如果给定)的前两个参数必须t, y而不是默认值y, t。

1.1.0版中的新函数。

返回值:

y:数组,形状(len(t),len(y0))数组,其中包含t中每个期望时间的y值,第一行的初始值为y0。

infodict:dict,仅当full_output == True时返回包含其他输出信息的字典

含义

‘hu’

每个时间步成功使用的步长向量。

‘tcur’

每个时间步长都达到t的向量。 (将始终至少与输入时间一样大)。

‘tolsf’

当检测到对精度的要求过高时,会计算大于1.0的公差比例因子的向量。

‘tsw’

最后一次方法切换时的t值(针对每个时间步)

‘nst’

累计时间步数

‘nfe’

每个时间步的函数评估累计次数

‘nje’

每个时间步的雅各布式评估的累积数量

‘nqu’

每个成功步骤的方法顺序向量。

‘imxer’

错误返回时加权局部误差向量(e /ewt)中最大量级分量的索引,否则为-1。

‘lenrw’

所需的双重工作数组的长度。

‘leniw’

所需的整数工作数组的长度。

‘mused’

每个成功时间步长的方法指标的向量:1:adams(非刚度),2:bdf(stiff)

其他参数:

ml, mu:int, 可选参数如果这些都不是None或non-negative,则假定Jacobian带状。这些给出了该带状矩阵中上下非零对角线的数量。对于带状情况,Dfun应该返回一个矩阵,其行包含非零带(从最低对角线开始)。因此,Dfun的返回矩阵jac应该具有(ml + mu + 1, len(y0))当ml >=0或者mu >=0。数据在江淮必须存储为jac[i - j + mu, j]持有的导数关于状态变量`j`th的第i个方程。如果是col_deriv是真的,这的转置江淮必须返回。

rtol, atol:float, 可选参数输入参数rtol和atol确定求解器执行的错误控制。求解器将根据形式的不等式控制y中估计的局部误差的向量emax-norm of (e / ewt) <= 1,其中ewt是正误差权重的向量,计算公式为ewt = rtol * abs(y) + atol。 rtol和atol可以是长度与y相同的向量,也可以是标量。默认为1.49012e-8

tcrit:ndarray, 可选参数应当注意集成的临界点向量(例如奇点)。

h0:float, (0:solver-determined), 可选参数第一步要尝试的步长。

hmax:float, (0:solver-determined), 可选参数允许的最大绝对步长。

hmin:float, (0:solver-determined), 可选参数允许的最小绝对步长。

ixpr:bool, 可选参数是否在方法切换时生成额外的打印。

mxstep:int, (0:solver-determined), 可选参数t中每个积分点允许的最大(内部定义)步数。

mxhnil:int, (0:solver-determined), 可选参数打印的最大消息数。

mxordn:int, (0:solver-determined), 可选参数非刚度(Adams)方法允许的最大订单数。

mxords:int, (0:solver-determined), 可选参数刚性(BDF)方法允许的最大顺序。

例子:

摆锤的重力角在摩擦力作用下的角度θ的二阶微分方程可以写成:

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为向量θ,ω。我们在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 <= t <= 10的101个均匀间隔的样本生成一个解。因此,我们的时间数组为:

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

你可能感兴趣的:(integrate函数python_python scipy integrate.odeint用法及代码示例)