《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()
效果图如下:
第二段程序画出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()
结果如下:
第三段程序画出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]
结果如下:
第四段程序画出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()
结果如下:
第五段程序画出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()
结果如下:
另附龙格库塔法求解画图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