资源描述:
《元胞自动机与Matlab.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、元胞自动机与MATLAB引言元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其(4或8)邻居的状态。元胞自动机已被应用于物理模拟,生物模拟等领域。本文就一些有趣的规则,考虑如何编写有效的MATLAB的程序来实现这些元胞自动机。MATLAB的编程考虑元胞自动机需要考虑到下列因素,下面分别说明如何用MATLAB实现这些部分。并以Conway的生命游戏机的程序为例,说明怎样实现
2、一个元胞自动机。l矩阵和图像可以相互转化,所以矩阵的显示是可以真接实现的。如果矩阵cells的所有元素只包含两种状态且矩阵Z含有零,那么用image函数来显示cat命令建的RGB图像,并且能够返回句柄。imh=image(cat(3,cells,z,z));set(imh,'erasemode','none')axisequalaxistightl矩阵和图像可以相互转化,所以初始条件可以是矩阵,也可以是图形。以下代码生成一个零矩阵,初始化元胞状态为零,然后使得中心十字形的元胞状态=1。z=zeros(n,n);cells=z;cell
3、s(n/2,.25*n:.75*n)=1;cells(.25*n:.75*n,n/2)=1;lMatlab的代码应尽量简洁以减小运算量。以下程序计算了最近邻居总和,并按照CA规则进行了计算。本段Matlab代码非常灵活的表示了相邻邻居。x=2:n-1;y=2:n-1;sum(x,y)=cells(x,y-1)+cells(x,y+1)+...cells(x-1,y)+cells(x+1,y)+...cells(x-1,y-1)+cells(x-1,y+1)+...cells(x+1,y-1)+cells(x+1,y+1);cells=
4、(sum==3)
5、(sum==2&cells);l加入一个简单的图形用户界面是很容易的。在下面这个例子中,应用了三个按钮和一个文本框。三个按钮,作用分别是运行,停止,程序退出按钮。文框是用来显示的仿真运算的次数。%buildtheGUI%definetheplotbuttonplotbutton=uicontrol('style','pushbutton',...'string','Run',...'fontsize',12,...'position',[100,400,50,20],...'callback','run=1;');%
6、definethestopbuttonerasebutton=uicontrol('style','pushbutton',...'string','Stop',...'fontsize',12,...'position',[200,400,50,20],...'callback','freeze=1;');%definetheQuitbuttonquitbutton=uicontrol('style','pushbutton',...'string','Quit',...'fontsize',12,...'position',[30
7、0,400,50,20],...'callback','stop=1;close;');number=uicontrol('style','text',...'string','1',...'fontsize',12,...'position',[20,400,50,20]);经过对控件(和CA)初始化,程序进入一个循环,该循环测试由回调函数的每个按钮控制的变量。刚开始运行时,只在嵌套的while循环和if语句中运行。直到退出按钮按下时,循环停止。另外两个按钮按下时执行相应的if语句。stop=0;%waitforaquitbutto
8、npushrun=0;%waitforadrawfreeze=0;%waitforafreezewhile(stop==0)if(run==1)%nearestneighborsumsum(x,y)=cells(x,y-1)+cells(x,y+1)+...cells(x-1,y)+cells(x+1,y)+...cells(x-1,y-1)+cells(x-1,y+1)+...cells(3:n,y-1)+cells(x+1,y+1);%TheCArulecells=(sum==3)
9、(sum==2&cells);%drawthen
10、ewimageset(imh,'cdata',cat(3,cells,z,z))%updatethestepnumberdiaplaystepnumber=1+str2num(get(number,'string'));