《Organization and identification of solutions in the time-delayed Mackey-Glass model》仿真实现

《Organization and identification of solutions in the time-delayed Mackey-Glass model》是一篇关于MG混沌系统的文章,主要介绍的是用计算机仿真和电路实现MG混沌系统周期性表现对比的研究。这里主要利用离散方法对文章中的几个仿真图进行简单的复现,通过与作者沟通,也可以使用龙格库塔法完成。
第一段程序是画出文中图三的a1和b1,初始条件为文中公式(11)。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#画出FIG.3中数值仿真图a1和b1,初始条件为文中方程11
#--------------------------------------------------------------

#导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt

#参数初始化
n=4;N=396;alpha=4.9;
#dt是一个很小的时间片
dt=0.001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=100000-N;
#方程(5)中的e(-dt/RC),也可以直接用e(-TAU/N)代替
E=np.exp(-15.7/N)

#MG系统实现并画图
def Mackey_Glass_Evolution_and_Plot():
    #初始化一个列表v_list用来存放每个时刻的v值
    v_list=[]
    for i in range(-N,iteration):
        #先把-tau至0之间的初始值v_initial加入列表v_list中
        if i<0:
            t=i*dt
            v_initial=(v2-v1)*t/tau+v2
            v_list.append(v_initial)
        #0时刻后,再进行新的v值计算,并存入列表v_list
        else:
            v=v_list[-1]*E+(1-E)*alpha*v_list[i]/(1+v_list[i]**n)#y,用龙格库塔法
            v_list.append(v)#ys
    #画图
    plt.plot(np.arange(0,10,10/4000),v_list[96000:])
    # 设置X轴标签
    plt.xlabel(r'$t$'+r'$\ (units\ of\ \tau)$',fontsize=10)
    # 设置Y轴标签
    plt.ylabel(r'$v$'+r'$\ (units\ of\ \theta)$',fontsize=10)
    #设置标题
    plt.title("Temporal evolution of "+r"$v$ ("+r'$v1={}$'.format(v1)+" and "+r'$v2={}$'.format(v2)+")")
    #显示网格线
    plt.grid(True)
    #显示图片
    plt.show()

if __name__ == '__main__':
    #设置不同的方程11中v1和v2的值得到不同的图像,这里设置了两组
    #对应FIG-3中的a1
    v1=1;v2=1
    Mackey_Glass_Evolution_and_Plot()
    #对应FIG-3中的b1
    v1=0.5;v2=2
    Mackey_Glass_Evolution_and_Plot()

效果图如下:


1.png
2.png

第二段程序画出FIG.4中数值仿真图a-d,初始条件为文中方程(12)。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#画出FIG.4中数值仿真图a-d,初始条件为文中方程12
#--------------------------------------------------------------

#导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt

#参数初始化
n=4;N=396;alpha=3.71;
#dt是一个很小的时间片
dt=0.0001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=100000-N;
#方程(5)中的e(-dt/RC),也可以直接用e(-TAU/N)代替
E=np.exp(-40/N)

#MG系统实现并画图
def Mackey_Glass_Evolution_and_Plot():
    #初始化一个列表v_list用来存放每个时刻的v值
    v_list=[]
    for i in range(-N,iteration):
        #先把-tau至0之间的初始值加入列表中,tau是396个dt
        if i<0:
            t=i*dt
            v_initial=(1/40)*math.sin(7*math.pi*t/(2*tau)+(phi/180*math.pi))*math.sin(7*math.pi*t/tau+(2*phi/180*math.pi))+v_off
            # v_initial=(1/40)*math.sin(7*math.pi*t/(2*tau)+(phi))*math.sin(7*math.pi*t/tau+(2*phi))+v_off

            v_list.append(v_initial)
        #0时刻后,再进行新的v值计算,并存入列表v_list
        else:
            v=v_list[-1]*E+(1-E)*alpha*v_list[i]/(1+v_list[i]**n)
            v_list.append(v)
    #取最后4000组数据进行展示
    plt.plot(np.arange(0,10,10/8000),v_list[iteration+N-8000:])
    #设置X轴标签
    plt.xlabel(r'$t$'+r'$\ (units\ of\ \tau)$',fontsize=10)
    #设置Y轴标签
    plt.ylabel(r'$v$'+r'$\ (units\ of\ \theta)$',fontsize=10)
    #设置标题
    plt.title("Temporal evolution of "+r"$v$ ("+r'$\phi={}$'.format(phi)+" and "+r'$V_{{off}}={}$'.format(v_off)+")")
    #显示网格线
    plt.grid(True)
    #显示图片
    plt.show()

if __name__ == '__main__':
    #设置不同的方程12中phi和alpha的值得到不同的图像,这里需要找到八组对应a-h
    #前六组的区别在于每个周期对应的波峰波谷数不同
    #后两组表现出非周期性
    #对于周期表现,找到的两组还不错的参数
    phi=170;v_off=0.345
    Mackey_Glass_Evolution_and_Plot()
    phi=170;v_off=0.40
    Mackey_Glass_Evolution_and_Plot()
    #对于非周期表现,随便找两组
    phi=60;v_off=0.31
    Mackey_Glass_Evolution_and_Plot()
    phi=120;v_off=0.39
    Mackey_Glass_Evolution_and_Plot()

    #为了得到具有周期性的MG系统图,参数的寻找用的是笨方法——网格搜索法,可以将上面的固定参数注释后,进行网格搜嗦
    #phi的取值范围为(0,360),根据FIG-10中a图可知,alpha取值范围可能为(0.32,0.39)
    #谨慎设置间隔大小,否则跑起来会很耗时间,另外注意iteration的选择,太小不行
    # for phi in np.arange(190,190.1,0.1):
    #   for v_off in np.arange(0.40,0.41,0.01):
    #       print(phi,v_off)
    #       v_list=[]
    #       Mackey_Glass_Evolution_and_Plot()

结果如下:


3.png

4.png

5.png

6.png

第三段程序画出FIG.6,初始条件为文中方程11。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#画出FIG.6,初始条件为文中方程11
#--------------------------------------------------------------

#导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt

#参数初始化
n=4;N=1194;alpha=3.73;v1=1;v2=1
#dt是一个很小的时间片
dt=0.001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=100000-N;

#MG系统实现
def Mackey_Glass_Peak():
    #初始化一个列表v_list用来存放每个时刻的v值
    v_list=[]
    for i in range(-N,iteration):
        #先把-tau至0之间的初始值加入列表中,tau是396个dt
        if i<0:
            t=i*dt
            v_initial=(v2-v1)*t/tau+v2
            v_list.append(v_initial)
        #0时刻后,再进行新的v值计算,并存入列表v_list
        else:
            v=v_list[-1]*E+(1-E)*alpha*v_list[i]/(1+v_list[i]**n)
            v_list.append(v)

    #定义一个新的列表v_peak_list用来保存一个周期中的极大值和极小值
    v_peak_list=[]
    for i in range(len(v_list)-4000,len(v_list)-1):
        #保存极大值
        if v_list[i]>v_list[i-1] and v_list[i]>v_list[i+1]:
            v_peak_list.append(v_list[i])
        #保存极小值
        if v_list[i]

结果如下:


7.jpg

第四段程序画出FIG.8,初始条件为文中方程11。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#画出FIG.8,初始条件为文中方程11
#--------------------------------------------------------------

#导入相关库
import matplotlib.pyplot as plt
import numpy as np
import math
from matplotlib.colors import ListedColormap
from PIL import Image
#参数初始化
n=4;N=396;v1=0.5;v2=2
#dt是一个很小的时间片
dt=0.001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=50000-N;

#MG系统实现并画图
def Mackey_Glass_Peak_Number():
   #初始化一个列表v_list用来存放每个时刻的v值
   v_list=[]
   for i in range(-N,iteration):
       #先把-tau至0之间的初始值加入列表中,tau是396个dt
       if i<0:
           t=i*dt
           v_initial=(v2-v1)*t/tau+v2
           v_list.append(v_initial)
       #0时刻后,再进行新的v值计算,并存入列表v_list
       else:
           v=v_list[-1]*E+(1-E)*alpha*v_list[i]/(1+v_list[i]**n)
           v_list.append(v)
   #定义一个新的列表v_peak_list用来保存一个周期中的极大值和极小值
   v_peak_list=[]
   for i in range(45000,len(v_list)-1):
       #保存极大值
       if v_list[i]>v_list[i-1] and v_list[i]>v_list[i+1]:
           #精确到小数点后两位
           v_peak_list.append(round(v_list[i],3))
       #保存极小值
       if v_list[i]=18'))  

   # 设置X轴标签
   plt.xlabel(r'$T$',fontsize=10)
   # 设置Y轴标签
   plt.ylabel(r'$\alpha$',fontsize=10)
   # 设置标题
   plt.title("Number of maxima by different combination of "+r'$T$'+" and "+r'$\alpha$')
   # 显示网格线
   plt.grid(True)
   # 显示图片
   plt.show()

结果如下:


8.png

第五段程序画出FIG.9,初始条件为文中方程11。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#图10未实现,理解如下:

# 1.图9是要画出不同的初始条件下(方程11对应不同的v1,v2组合),MG混沌系统对应的周期情况
# 可以看出图9中存在两种周期情形。

# 2.图10则是对应不同的初始条件下(方程12对应不同的phi,alpha组合),MG混沌系统对应的周期情况
# 可以看出图10中存在六种周期情形。
#--------------------------------------------------------------

#导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

#参数初始化
n=4;N=396;alpha=4.9;
#dt是一个很小的时间片
dt=0.001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=100000-N;
#方程(5)中的e(-dt/RC),也可以直接用e(-TAU/N)代替
E=np.exp(-15.7/N)

#MG系统实现并画图
def Mackey_Glass_Evolution_and_Plot():
    #初始化一个列表v_list用来存放每个时刻的v值
    v_list=[]
    for i in range(-N,iteration):
        #先把-tau至0之间的初始值v_initial加入列表v_list中
        if i<0:
            t=i*dt
            v_initial=(v2-v1)*t/tau+v2
            v_list.append(v_initial)
        #0时刻后,再进行新的v值计算,并存入列表v_list
        else:
            v=v_list[-1]*E+(1-E)*alpha*v_list[i]/(1+v_list[i]**n)
            v_list.append(v)
        #定义一个新的列表v_peak_list用来保存一个周期中的极大值和极小值
    
    v_peak_list=[]
    for i in range(len(v_list)-4000,len(v_list)-1):
        #保存极大值
        if v_list[i]>v_list[i-1] and v_list[i]>v_list[i+1]:
            v_peak_list.append(round(v_list[i],1))
    # print(v_list)
    max_peak=max(v_peak_list)
    r=[]
    for i in range(len(v_peak_list)):
        if len(r)==2:
            break
        elif round(v_peak_list[i],1)==max_peak:
            r.append(i)
    if len(r)<2:
        return 0
    # print(r)
    if r[1]-r[0]>=4:
        return 0
    else:
        return 1

if __name__ == '__main__':
    #如果想生成论文中的图,将step改成0.01或更小,就是耗时
    step=0.1
    #生成序列
    v1 = np.arange(0.1,2,step)
    v2 = np.arange(0.1,2,step)
    X, Y = np.meshgrid(v1, v2)

    #根据step大小,生成相应的大小的数组R
    R = np.zeros((int(1.91/step),int(1.91/step)))
    # print(1.91/step)
    #循环调用Mackey_Glass_Peak_Number(),得到每组TAU和alpha对应的peak值
    for v1 in np.arange(0.1,2,step):
        #对于不同的TAU,存在不同的E值
        for v2 in np.arange(0.1,2,step):
            #计算peak_number
            peak_number=Mackey_Glass_Evolution_and_Plot()
            #得到R对应下标

            r=int((v1-0.1)*(1/step))
            c=int((v2-0.1)*(1/step))
            R[r,c]=peak_number
    Colors=("blue","lime")
    cmap=ListedColormap(Colors[:2])
    a=plt.contourf(X,Y,R,cmap=cmap)
    cbar=plt.colorbar(a)
    cbar.set_ticks(np.linspace(0,1,2))  
    # cbar.set_ticklabels(('0', '1')) 
    # 设置X轴标签
    plt.xlabel(r'$v1\ (units\ of\ \theta)$',fontsize=10)
    # 设置Y轴标签
    plt.ylabel(r'$v2\ (units\ of\ \theta)$',fontsize=10)
    # 设置标题
    plt.title("Map of parameters "+r'$\ (v1,v2)$')
    # 显示网格线
    plt.grid(True)
    # 显示图片
    plt.show()

结果如下:


9.png

另附龙格库塔法求解画图3的程序。

#Organization and identification of solutions in the time-delayed Mackey-Glass model
#Pablo Amil, Cecilia Cabeza, Cristina Masoller, and Arturo C. Martí
#Datetime:2020-02-07

#--------------------------------------------------------------
#尝试使用龙格库塔法,画出FIG.3中数值仿真图a1和b1,初始条件为文中方程11
#--------------------------------------------------------------

#导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt

#参数初始化
n=4;N=396;alpha=4.9;
#dt是一个很小的时间片
dt=0.001;
#文中给出的tau延迟即为N个时间片
tau=N*dt
#为了方便v_list取整,iteration为大整数减去N值
iteration=100000;
#方程(5)中的e(-dt/RC),也可以直接用e(-TAU/N)代替
E=np.exp(-15.7/N)
print(E)
#runge-kutta法求解,没有成功
def runge_kutta(v,t,dt,f):
    k1 = dt * f(v,t)
    k2 = dt * f(v + 0.5 * k1, t + 0.5 * dt)
    k3 = dt * f(v + 0.5 * k2, t + 0.5 * dt)
    k4 = dt * f(v + k3, t + dt)
    return v + (k1 + 2 * k2 + 2 * k3 + k4) / 6.

#MG系统实现并画图
def Mackey_Glass_Evolution_and_Plot():
    #初始化一个列表v_list用来存放每个时刻的v值
    v_list=[]
    def func(v,t):
        if i

你可能感兴趣的:(《Organization and identification of solutions in the time-delayed Mackey-Glass model》仿真实现)