这一期我们回到与第二期中的例子有点相似的模型:
看过我上一期给大家提供的ppt的简友们应该知道,这次我们将要讲的动力系统说这样的:
xn+1 = a xn (1 - xn)
对于这个动力系统有这样的规律:
当 0<a<1时,由于0≤ xn+1 ≤axn;
当1<a<3时,任何(0,1)中初始值的轨道趋于一个平衡点x = 1 - 1/a;
当3<a<1+√6 时,xn会围绕两个数振动,它们满足x = f2(x),且 x≠f(x);
当1+√6<a<3.5440903506...时,从任意点出发的轨道将逐渐沿着四个数值振动,它们满足 x = f4(x),称为周期四点。
当a 继续增大,又会出现周期八点,周期16点,稳定当极限值为3.569945557391...,当a介于极限值与4之间时,系统将进入混沌区域,系统将会表现出对初始数值当强烈敏感性,对于不同的初始值,即使它们离的非常近,它们当轨道也终将以某种方式分离,这也就是所谓的蝴蝶效应了。
Logistic 映射
import matplotlib.pyplot as plt
def drawCurve(a,CurrentLevel):#a即前文中的系数a,CurrentLevel即Xn
RegentLevel = []
for i in range(30):
RegentLevel.append(CurrentLevel)
CurrentLevel = (a*CurrentLevel-a*(CurrentLevel**2) )
Time = [i for i in range(30)]
plt.plot(Time, RegentLevel)
for i in range(1,100):
drawCurve(1.5,i/100)
plt.annotate('a = 1.5',xy = (5, 0.4),xytext = (6,0.9),arrowprops = dict(facecolor = 'black',shrink = 0.1))






这样也能看到平衡点个数的变化,但是看不明显,如果使用plt.scatter()函数来绘制散点图的话,结果更加明显。
散点图看起来比折线图好一些:





这样有几个平衡点就看的比较明显了。
那么我们再用频率分布图来看看:
import matplotlib.pyplot as plt
def drawCurve(a,CurrentLevel):
RegentLevel = []
for i in range(30):
RegentLevel.append(CurrentLevel)
CurrentLevel = (a*CurrentLevel-a*(CurrentLevel**2) )
Time = [i for i in range(30)]
plt.hist(RegentLevel,bins = 100)
for i in range(1,100):
drawCurve(1.5,i/100)
plt.annotate('a = 1.5',xy = ( 0.15,5),xytext = (0.25,6),arrowprops = dict(facecolor = 'black',shrink = 0.1))




这样看的话,确实跟唐云教授的ppt里面讲的一致。
这篇文章只是借动力系统的蝴蝶效应展示了一下matplotlib库的一些作用,对于不同的模型我们应该使用不同的图表使数据得到更好的展示。
有兴趣转行机器学习的朋友可以加群:

网友评论
为何我运行了你的代码后图像是一条直线呢?