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) + 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;
linspace函数pythonb =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.show()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论