文章目录
一、Lorenz系统
参考我之前的文章MATLAB混沌系统仿真其一:Lorenz系统和Rossler系统。Lorenz系统包含3个微分方程。Lorenz在1963年证明了这个系统中存在混沌(Lorenz认为由三变量非线性耦合微分方程描述的系统都能产生chaos,1975)。变量X、Y、Z分别表示循环流体的流速、上升和下降流体的温差和垂直温度剖面的畸变。其微分形式如下:
d
x
=
−
σ
(
x
−
y
)
dx\mathrm{=}-\sigma\left(x-y\right)
dx=−σ(x−y)
d
y
=
r
x
−
y
−
x
z
dy\mathrm{=}rx-y-xz
dy=rx−y−xz
d
z
=
−
β
z
+
x
y
dz\mathrm{=}-\beta\ z+xy
dz=−β z+xy其中控制参数
σ
=
10
\sigma\mathrm{=}10
σ=10、
r
=
28
r\mathrm{=}28
r=28、
β
=
8
/
3
\beta\mathrm{=}8/3
β=8/3时也叫经典Lorenz系统,本次展示也是用这些参数。有关吸收于和李指数的部分可阅读MATLAB混沌系统仿真其一:Lorenz系统和Rossler系统。
二、代码和仿真
与MATLAB的ode函数类似,Python提供响应的求解函数,是scipy库内的odeint,用法也跟MATLAB相差不大。首先需要定义一个函数,y0传入上一个 x 、 y 和 z x、y和z x、y和z的值, t t t没有使用, p a r a para para用于传入三个控制参数,此处使用默认参数形式,可以不需要在odeint函数中使用args。
def Lorenz(y0, t, para=[10,28,8/3]):
# 设置默认参数可以不使用odeint的args参数
p, r, b = para
x, y, z = y0
dx = -p*(x-y)
dy = r*x-y-x*z
dz = -b*z+x*y
return np.array([dx,dy,dz])
函数的调用和绘图也是怎么简单怎么来,甚至可以一行代码解决:
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
t = np.arange(0, 50, 0.01)
y0 = [1,0,-1]
sol = odeint(Lorenz, y0, t)
# sol = odeint(Lorenz,y0,t,args=([10,28,8/3],)) # 定义函数时不使用默认参数则需要使用这个方法传参
plt.figure()
plt.axes(projection='3d')
plt.plot(sol[:, 0], sol[:, 1], sol[:, 2])
plt.figure(2)
plt.plot(t,sol)
plt.legend(['x','y','z'])
plt.xlabel('time')
plt.title('Lorenz')
plt.show()
仿真的三个变量的波形图如下:
系统的吸引子图形,为了好看,这里同样也绘制成了动图。