Python建模与NLP程序员工具癖

Python数学建模极简入门之(四)动力系统的蝴蝶效应

2016-11-22  本文已影响534人  dalalaa

这一期我们回到与第二期中的例子有点相似的模型:
看过我上一期给大家提供的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))
a = 1.5 a= 2.5 a=3 a= 3.4 a=3.5 a=3.8

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

散点图看起来比折线图好一些:

a=1.5 a=2.5 a=3 a=3.5 a=3.8

这样有几个平衡点就看的比较明显了。

那么我们再用频率分布图来看看:

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))
a=1.5 a=2.5 a=3.5 a=3.8

这样看的话,确实跟唐云教授的ppt里面讲的一致。

这篇文章只是借动力系统的蝴蝶效应展示了一下matplotlib库的一些作用,对于不同的模型我们应该使用不同的图表使数据得到更好的展示。

有兴趣转行机器学习的朋友可以加群:


机器学习-菜鸡互啄群
上一篇下一篇

猜你喜欢

热点阅读