scipy库中的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)

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

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

主要参量

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

y0 数组
y的初始条件(可以是向量)。

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

args 元组,可选
传递给函数的额外参数。

例子:
摆锤的重力角在摩擦力作用下的角度θ的二阶微分方程可以写成:
theta’’(t) + btheta’(t) + csin(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()

在这里插入图片描述
参考Scipy.org
https://docs.scipy.org/doc/scipy/reference/index.html
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值