(CA学习资料)美国康奈尔大学BioNB441在Matlab中的元胞自动机_第1页
(CA学习资料)美国康奈尔大学BioNB441在Matlab中的元胞自动机_第2页
(CA学习资料)美国康奈尔大学BioNB441在Matlab中的元胞自动机_第3页
(CA学习资料)美国康奈尔大学BioNB441在Matlab中的元胞自动机_第4页
(CA学习资料)美国康奈尔大学BioNB441在Matlab中的元胞自动机_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网站翻译内容美国康奈尔大学BioNB441在Matlab中的元胞自动机介绍元胞自动机(CA)是用于计算计划利用当地的规则和本地通信。普遍CA定义一个网格,网格上的每个点代表一个有限数量的状态中的细胞。过渡规则同时应用到每一个细胞。典型的转换规则依赖于细胞和它的(4个或8个)近邻的状态,虽然临近的细胞也同样使用。 CA的应用在并行计算研究,物理模拟和生物模拟。这个页面将考虑如何写出高效的MATLAB代码的CA的实施和看一些有趣的规则。Matlab代码注意事项以下注意事项将说明使用Matlab程序计算康威的生命。部分的代码的解释如下。矩阵和图像可以被转换为一个另一个,所以显示是为straighforward的的。如果阵列细胞包含二进制的每一个电池单体的状态和数组Z含有零,那么cat命令建立一个RGB图像,显示图像命令。图像命令也返回一个句柄。imh = image(cat(3,cells,z,z);set(imh, erasemode, none)axis equalaxis tight矩阵和图像可以被转换为一个另一个,那么初始条件,可以计算矩阵或图形命令。下面的代码生成一个元素为零的数组,细胞状态初始化为零,然后使细胞的交叉状态=1的数组的中心。使用(渗流群集)下面的例子中的一个图形命令来初始化CA阵列。z = zeros(n,n);cells = z;cells(n/2,.25*n:.75*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) + . cells(x+1,y-1) + cells(x+1,y+1);cells = (sum=3) | (sum=2 & cells); 添加一个简单的GUI是很容易的。在这个例子中,三个按钮和一个文本字段implmented。三个按钮允许用户运行,停止,或选择退出。文本字段中显示模拟执行的步骤数。%build the GUI%define the plot buttonplotbutton=uicontrol(style,pushbutton,. string,Run, . fontsize,12, . position,100,400,50,20, . callback, run=1;);%define the stop buttonerasebutton=uicontrol(style,pushbutton,. string,Stop, . fontsize,12, . position,200,400,50,20, . callback,freeze=1;);%define the Quit buttonquitbutton=uicontrol(style,pushbutton,. string,Quit, . fontsize,12, . position,300,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; %wait for a quit button pushrun = 0; %wait for a draw freeze = 0; %wait for a freezewhile (stop=0) if (run=1) %nearest neighbor sum 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(3:n,y-1) + cells(x+1,y+1); % The CA rule cells = (sum=3) | (sum=2 & cells); %draw the new image set(imh, cdata, cat(3,cells,z,z) ) %update the step number diaplay stepnumber = 1 + str2num(get(number,string); set(number,string,num2str(stepnumber) end if (freeze=1) run = 0; freeze = 0; end drawnow %need this in the loop for controls to work End例子1.康威的生命。其规则是:总结8近邻如果总和=2 那么状态不改变如果总和=3,然后在状态= 1否则状态= 0代码:x = 2:n-1;y = 2:n-1; %nearest neighbor sumsum(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);% The CA rulecells = (sum=3) | (sum=2 & cells); 2.表面张力其规则是:总结8近邻和细胞本身如果总和4或总和= 5,则状态= 0否则状态= 1代码: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(3:n,y-1) + cells(x+1,y+1)+. cells(x,y); % The CA rule cells = (sum 0(至少一个相邻)的r阈值,和小区从未有过的邻居小区= 1。如果总和0记录细胞,该细胞具有非零邻居“访问”的标志。更新代码:The update code:sum(2:a-1,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) + . cells(1:a-2,1:b-2) + cells(1:a-2,3:b) + . cells(3:a,1:b-2) + cells(3:a,3:b); pick = rand(a,b); cells = cells | (sum=1) & (pick=threshold) & (visit=0) ; visit = (sum=1) ;变量a和b的图像的大小。 初始的图像是由图形操作。设立轴大小是固定的,下面的语句写文字转换成轴,然后抢轴的内容,并把它们放回一个数组,用的getFrame功能.ax = axes(units,pixels,position,1 1 500 400,color,k);text(units, pixels, position, 50,255,0,. string,BioNB,color,w,fontname,helvetica,fontsize,100)text(units, pixels, position, 120,120,0,. string,441,color,w,fontname,helvetica,fontsize,100)initial = getframe(gca);a,b,c=size(initial.cdata);z=zeros(a,b);cells = double(initial.cdata(:,:,1)=255);visit = z ;sum = z;4.激发介质(BZ反应或心脏)规则:细胞可以在10个不同的状态。休息状态0。国家1-5活跃,状态6-9难治。计数8个最近邻的每个单元格是在一个激活状态。如果总和大于或等于3(至少三个活性邻居的),那么细胞=1。状态19中,没有更多的输入逐步发生。如果状态=1,那么下一个状态=2。如果状态= 2那么下一状态= 3,同样的所有的州多达9个。如果状态= 9,那么下一个状态=0和细胞是在休息。更新代码:x = 2:n-1;y = 2:n-1; sum(x,y) = (cells(x,y-1) 0)&(cells(x,y-1) 0)&(cells(x,y+1) 0)&(cells(x-1, y) 0)&(cells(x+1,y) 0)&(cells(x-1,y-1) 0)&(cells(x-1,y+1) 0)&(cells(x+1,y-1) 0)&(cells(x+1,y+1)=t1) + . 2*(cells=1) + . 3*(cells=2) + . 4*(cells=3) + . 5*(cells=4) + . 6*(cells=5) +. 7*(cells=6) +. 8*(cells=7) +. 9*(cells=8) +. 0*(cells=9);5.森林火灾规则:细胞可以在3个不同的状态。状态= 0是空的,state = 1时燃烧,状态=2是森林。如果一个或更多的4个邻居,如果细胞在燃烧,这是森林(状态= 2),那么新的状态(状态 = 1时)燃烧。有森林细胞(状态=2),开始自身的燃烧(闪电)(0.000005)是一种低概率。燃烧(state = 1时)后一个细胞变成空的(状态= 0)。有一个空单元格成为森林模拟增长是一种低概率(比如说,0.01)。该阵列被视为toroidly连接的,使燃烧的火焰,以左侧将启动火灾在右边。类似地连接的顶部和底部。更新代码:sum = (veg(1:n,n 1:n-1)=1) + (veg(1:n,2:n 1)=1) + . (veg(n 1:n-1, 1:n)=1) + (veg(2:n 1,1:n)=1) ; veg = . 2*(veg=2) - (veg=2) & (sum 0 | (rand(n,n) Plightning) + . 2*(veg=0) & rand(n,n) Pgrowth) ;请注意的是,环形连接的顺序实施的下标。6.气体动力学此CA(及之后的两个)被用来计算粒子的运动。此应用程序需要不同种类的邻里。瓦里斯的小区附近的每一个时间步长,使运动在一定的方向上,将继续在同一方向。换句话说,规则节省势头,这是根据动力计算。所用的邻域被称为一个的马戈利斯附近,由重叠的22块的细胞。在下面的图中,左上角的4细胞是邻近地区的偶数时间步长期间,在奇数时间步长,右下4个细胞分数。一个给定的单元有3个邻居在每个时间步长,但具体的细胞构成的邻居来回翻转。eveneven evencellodd oddodd规则:这就是所谓的HPP-GAS规则。见参考文献1第12章.细胞有2个状态。状态= 0是空的,状态=1表示运动中的粒子。在任何一个步骤中,粒子被假设刚才输入的2x2块对角线路径。通过它的中心,因此,它必须跨块。因此,在任何时间步长,每个单元的内容交换与细胞斜对面。对块如下所示。左边的一个是前一段时间后步的权利。六例示,但他们每个人的所有旋转版本相同的方式处理。两种特殊的情况,颗粒与颗粒的碰撞和粒子壁被认为是如下。00goes0000to0010goes0000to0110goes1001to0110goes0110to0111goes0110to1111goes1111to11为了使粒子碰撞(节省动量和能量),治疗的情况下,如果他们正好一个对角线上的两个粒子击中对方90度偏转。这是通过将一条对角线上的其他时间步长。您可以实现由一个细胞的细胞逆时针旋转。上述第三条规则变为:10goes0101to10为了使粒子碰撞与墙,只需将其状态不变。这导致的一种体现。更新代码:p=mod(i,2); %margolis neighborhood, where i is the time step %upper left cell update xind = 1+p:2:nx-2+p; yind = 1+p:2:ny-2+p; %See if exactly one diagonal is ones %only (at most) one of the following can be true! diag1(xind,yind) = (sand(xind,yind)=1) & (sand(xind+1,yind+1)=1) & . (sand(xind+1,yind)=0) & (sand(xind,yind+1)=0); diag2(xind,yind) = (sand(xind+1,yind)=1) & (sand(xind,yind+1)=1) & . (sand(xind,yind)=0) & (sand(xind+1,yind+1)=0); %The diagonals both not occupied by two particles and12(xind,yind) = (diag1(xind,yind)=0) & (diag2(xind,yind)=0); %One diagonal is occupied by two particles or12(xind,yind) = diag1(xind,yind) | diag2(xind,yind); %for every gas particle see if it near the boundary sums(xind,yind) = gnd(xind,yind) | gnd(xind+1,yind) | . gnd(xind,yind+1) | gnd(xind+1,yind+1) ; % cell layout: % x,y x+1,y % x,y+1 x+1,y+1 %If (no walls) and (diagonals are both not occupied) %then there is no collision, so move opposite cell to current cell %If (no walls) and (only one diagonal is occupied) %then there is a collision so move ccw cell to the current cell %If (a wall) %then dont change the cell (causes a reflection) sandNew(xind,yind) = . (and12(xind,yind) & sums(xind,yind) & sand(xind+1,yind+1) + . (or12(xind,yind) & sums(xind,yind) & sand(xind,yind+1) + . (sums(xind,yind) & sand(xind,yind); sandNew(xind+1,yind) = . (and12(xind,yind) & sums(xind,yind) & sand(xind,yind+1) + . (or12(xind,yind) & sums(xind,yind) & sand(xind,yind)+ . (sums(xind,yind) & sand(xind+1,yind); sandNew(xind,yind+1) = . (and12(xind,yind) & sums(xind,yind) & sand(xind+1,yind) + . (or12(xind,yind) & sums(xind,yind) & sand(xind+1,yind+1)+ . (sums(xind,yind) & sand(xind,yind+1); sandNew(xind+1,yind+1) = . (and12(xind,yind) & sums(xind,yind) & sand(xind,yind) + . (or12(xind,yind) & sums(xind,yind) & sand(xind+1,yind)+ . (sums(xind,yind) & sand(xind+1,yind+1); sand = sandNew;7.扩散限制聚集该系统模拟粘性颗粒聚集形成的分形结构的。粒子的运动发生,例如6 HPP-气体规则类似的规则。所不同的是该颗粒被认为是在某些致密的(但不可见)的液体蹦跳着。其效果是随机的每一个粒子的运动方向在每个时间步长。换句话说,每一个时间步长的碰撞的步骤。仿真也接种与固定在阵列中心的粒子。任何接触它的散射粒子粘到它,本身成为一个不可移动,粘性颗粒。规则:使用附近Margolus。在每一个时间步长,旋转4顺时针或逆时针以相等的概率由一个细胞的细胞。旋转随机速度。移动后,如果一个或多个的八个最接近的neighboors的是一个固定的,粘性颗粒,然后冻结粒子,并使其粘。更新代码:p=mod(i,2); %margolis neighborhood %upper left cell update xind = 1+p:2:nx-2+p; yind = 1+p:2:ny-2+p; %random velocity choice vary = rand(nx,ny) 0) & (sand=1) | gnd ; %and eliminate the moving particle sand(find(gnd=1) = 0;8.砂桩一堆沙子的横截面可以仿照使用一个Margolus的邻里传播细胞,但具有不同的运动规律规则:见参考文献2第2.2.6章.细胞有2个状态。状态= 0是空的,状态=1表示沙agrain。在任何步骤中,粒子可以落在朝下方的22的块。可能的转换如下所示。墙壁和地板停止运动。为了使议案略有随机,我添加了一个规则,有时反转的两个较低的细胞状态,所有的动作都完成后。00goes0000to0010goes0000to1001goes0000to0110goes0010to1110goes0001to1101goes0010to1101goes0001to1111goes1010to1111goes0101to11 更新代码:p=mod(i,2); %margolis neighborhood sand(nx/2,ny/2) = 1; %add a grain at the top %upper left cell update xind = 1+p:2:nx-2+p; yind = 1+p:2:ny-2+p; %randomize the flow - 10% of the time vary = rand(nx,ny) .9 ; vary1 = 1-vary; sandNew(xind,yind) = . gnd(xind,yind).*sand(xind,yind) + . (1-gnd(xind,yind).*sand(xind,yind).*sand(xind,yind+1) .* . (sand(xind+1,yind+1)+(1-sand(xind+1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论