【2018年整理】Matlab编写元胞自动机程序

上传人:ji****72 文档编号:35263855 上传时间:2018-03-13 格式:PDF 页数:23 大小:282.07KB
返回 下载 相关 举报
【2018年整理】Matlab编写元胞自动机程序_第1页
第1页 / 共23页
【2018年整理】Matlab编写元胞自动机程序_第2页
第2页 / 共23页
【2018年整理】Matlab编写元胞自动机程序_第3页
第3页 / 共23页
【2018年整理】Matlab编写元胞自动机程序_第4页
第4页 / 共23页
【2018年整理】Matlab编写元胞自动机程序_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《【2018年整理】Matlab编写元胞自动机程序》由会员分享,可在线阅读,更多相关《【2018年整理】Matlab编写元胞自动机程序(23页珍藏版)》请在金锄头文库上搜索。

1、元胞自动机与 MATLAB 引言 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状 态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的 状态,以及其( 4或 8 )邻居的状态。元胞自动机已被应用于物理模拟,生物 模拟等领域。本文就一些有趣的规则,考虑如何编写有效的 MATLAB的程序来 实现这些元胞自动机。 MATLAB 的编程考虑 元胞自动机需要考虑到下列因素, 下面分别说明如何用 MATLAB 实现这些部分。 并以 Conway 的生命游戏机的程序为例,说明怎样实现一个元胞自动机。

2、矩阵和图像可以相互转化,所以矩阵的显示是可以真接实现的。如果矩阵 cells 的所有元素只包含两种状态且矩阵 Z含有零, 那么用 image函数来显示 cat 命令建的 RGB 图像,并且能够返回句柄。 imh = image(cat(3,cells,z,z); set(imh, erasemode, none) axis equal axis tight 矩阵和图像可以相互转化,所以初始条件可以是矩阵,也可以是图形。以下 代码生成一个零矩阵,初始化元胞状态为零,然后使得中心十字形的元胞状 态= 1。 z = zeros(n,n); cells = z; cells(n/2,.25*n:.75

3、*n) = 1; cells(.25*n:.75*n,n/2) = 1; Matlab的代码应尽量简洁以减小运算量。以下程序计算了最近邻居总和,并 按照 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) + . c ells ( x+1 , y - 1) + c ells ( x+1 , y +1) ; cells =

4、 (sum=3) | (sum=2 加入一个简单的图形用户界面是很容易的。在下面这个例子中,应用了三个 按钮和一个文本框。三个按钮,作用分别是运行,停止,程序退出按钮。文 框是用来显示的仿真运算的次数。 %build the GUI %define the plot button plotbutton=uicontrol(style,pushbutton,. string,Run, . fontsize,12, . position,100,400,50,20, . callback, run=1;); %define the stop button erasebutton=uicontrol

5、(style,pushbutton,. string,Stop, . fontsize,12, . position,200,400,50,20, . callback,freeze=1;); %define the Quit button quitbutton=uicontrol(style,pushbutton,. string,Quit, . fontsize,12, . position,300,400,50,20, . callback,stop=1;close;); number = uicontrol(style,text, . string,1, . fontsize,12,

6、. position,20,400,50,20); 经过对控件(和CA)初始化,程序进入一个循环,该循环测试由回调函数的每 个按钮控制的变量。刚开始运行时,只在嵌套的while 循环和if 语句中运行。 直到退出按钮按下时,循环停止。另外两个按钮按下时执行相应的if 语句。 stop= 0; %wait for a quit button push run = 0; %wait for a draw freeze = 0; %wait for a freeze while (stop=0) if (run=1) %nearest neighbor sum sum(x,y) = cells(x,

7、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); % T h e CA r ule cells = (sum=3) | (sum=2 % dr aw the n ew im age set(imh, cdata, cat(3,cells,z,z) ) %update the step number diaplay stepnumber = 1 + str2num(get(number,strin

8、g); set(number,string,num2str(stepnumber) e nd if (freeze=1) r un = 0; freeze = 0; end drawnow %need this in the loop for controls to work end 例子 1 .Conway 的生命游戏机。 规则是: 对周围的 8个近邻的元胞状态求和 如果总和为 2的话,则下一时刻的状态不改变 如果总和为 3 ,则下一时刻的状态为 1 否则状态= 0 核心代码: x = 2:n-1; y = 2:n-1; %nearest neighbor sum sum(x,y) = ce

9、lls(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); % The CA rule cells = (sum=3) | (sum=2 2 .表面张力 规则是: 对周围的 8近邻的元胞以及自身的状态求和 如果总和 0 (至少一个邻居)并且 r 阈值,或者元胞从未有过一个邻居, 则元胞= 1 。 如果总和 0则设置“记录“的标志,记录这些元胞有一个非零的邻居。 核心代码: sum(2:a-1,

10、2:b-1) = cells(2:a-1,1:b-2) + cells(2:a-1,3:b) + . cells(1:a-2, 2:b-1) + cells(3:a,2:b-1) + . ce l ls( 1:a- 2 ,1 :b- 2) + ce lls( 1 :a- 2 , 3:b) + . . ce l ls( 3:a, 1: b- 2) + cel ls( 3: a,3 :b) ; pick = rand(a,b); cells = cells | (sum=1) visit = (sum=1) ; 变量 a 和 b是图像的尺寸。最初的图形是由图形操作决定的。以下程序设定坐标 系为一个

11、固定的尺寸,在坐标系里写入文本,然后获得并返回坐标内的内容,并 用 getframe 函数把它们写入一个矩阵 ax = axes(units,pixels,position,1 1 500 400,color,k); text(units, pixels, position, 130,255,0,. string,MCM,color,w,fontname,helvetica,fontsize,100) text(units, pixels, position, 10,120,0,. string,Cellular Automata,color,w,fontname,helvetica,font

12、size,50) initial = getframe(gca); a,b,c=size(initial.cdata); z=zeros(a,b); cells = double(initial.cdata(:,:,1)=255); visit = z ; sum = z; 经过几十个时间间隔(从 MCM Cellular Automata这个图像开始) ,我们可以得 到以下的图像。 4 .激发介质( BZ reaction or heart) 规则: 元胞有 10个不同的状态。状态 0是体眠。1-5为活跃状态, 、6-9为是极活跃 状态。 计算每一个处于活跃的状态的元胞近邻的 8个元胞。 如果和大于或等于 3 (至少有三个活跃的邻居) ,则下一时刻该元胞= 1 。 不需要其它输入, 1至 9种状态依次出现。如果该时刻状态= 1那么下一时刻 状态= 2 。如果该时刻状态= 2 ,然后下一时刻状态= 3 ,对于其它的状态 依次类推,直到第 9种状态。如果状态= 9 ,然后下一状态= 0并且元胞回 到休息状态。 核心代码:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号