前言
混沌是系统在微小的外界扰动下产生的无序的非线性动态。在基础理论的学习中,一个参数已经确定的系统在给定条件下会得到确定的解,求出系统的解后就可以确定系统过去、现在以及未来的状态,因此,求解系统等同于进行预测系统状态。随着KAM定理等理论的出现,研究系统不再局限于光滑的、确定的解,而是开始考虑混沌解,尤其是在天气播报、地震预测等描述长期行为的系统。一、逻辑斯蒂映射(logistic map)
logistics映射的形式很简单,系统的下一个状态 x ( n + 1 ) x(n+1) x(n+1)的状态由当前状态 x ( n ) x(n) x(n)得出,形式如下: x n + 1 = μ x n ( 1 − x n ) x_{n+1}=\mu\ x_n(1-x_n) xn+1=μ xn(1−xn)用于描述三种因素对系统的影响,分别是驱动因素 μ x n \mu x_n μxn、耗散因素 − μ x n 2 -\mu x_n^2 −μxn2和非线性因素 x n 2 x_n^2 xn2,其中 μ \mu μ是系统控制参量。这样一个确定形式的映射,在 μ \mu μ的不同取值下有常数解、周期解和混沌解,出现了倍周期分岔。
二、Python仿真
首先考虑最简单的仿真固定参数的结果,考虑 μ = 2.9 \mu=2.9 μ=2.9,输出它的波形图。
def plot1():
x = 0.2 # 初值
mu = 2.9
y = np.array([])
for i in range(25):
x = mu * x * (1 - x)
y = np.append(y, x)
xp = np.array(signal.argrelextrema(y, np.greater))
xn = np.array(signal.argrelextrema(-y, np.greater))
plt.scatter(xp,y[xp], c='black')
plt.scatter(xn,y[xn], c='black')
plt.plot(y)
主要使用matplotlib库画图,用scipy.signal寻找极大值,加粗显示比较美观。
在这个暴力迭代的基础上,生成一个numpy数组表示 μ \mu μ,即可以绘制分岔图。实际上每一位即是1,因此无需做过多处理。
mu = np.arange(2.9, 3.7, 0.0001)
x = 0.2 # 初值
front = 1000 # 舍去单周期前面一段,如上图
iters = 100 # 最后画出结果的迭代次数
for i in range(front+iters):
x = mu * x * (1 - x)
if i >= front:
plt.plot(mu, x, ',k')
最终输出这样的结果。