240 likes | 531 Views
Cellular Automata: Exploring Applications . Erik Aguilar Amelia Yzaguirre Amy Femal. Goal Explore 3 specific types of cellular automata applications and use MATLAB to model them. Types of Cellular Automata. Boolean Excitable Media Lattice Gas Automata. Boolean Cellular Automata.
E N D
Cellular Automata:Exploring Applications Erik Aguilar Amelia Yzaguirre Amy Femal
Goal Explore 3 specific types of cellular automata applications and use MATLAB to model them.
Types of Cellular Automata • Boolean • Excitable Media • Lattice Gas Automata
Boolean Cellular Automata Excitable Media can be seen in The Game of Life
Rules for the Game of Life • Any live cell with fewer than 2 live neighbors dies • Any live cell with more than 3 neighbors dies • Any live cell with 2 or 3 live neighbors lives on to the next generation • Any dead cell with exactly 3 live neighbors becomes a live cell
Writing the code %First we must create an n x n matrix of zeros. n=75; z=zeros(n,n); %Produces random "0" and "1" throughout matrix cells = (rand(n,n))<.12; %Creates an image using the matrix imh = image(cat(3,cells,z,z)); %When the image is replaced, the old image is not erased first set(imh, 'erasemode', 'none') x=(2:n-1); %creates array x which is used for position y=(2:n-1); %creates array y which is used for position %creates matrix for summations sum(x,y)=zeros(n-2,n-2);
a=0; while a==0; %equations for the corner cells to check for infected %neighbors sum(1,1)=cells(1,2)+cells(2,1)+cells(2,2); sum(1,n)=cells(2,n)+cells(2,n-1)+cells(1,n-1); sum(n,1)=cells(n,2)+cells(n-1,1)+cells(n-1,2); sum(n,n)=cells(n,n-1)+cells(n-1,n)+cells(n-1,n-1); %equations for the edge rows/columns to check for infected %neighbors sum(1,y)=cells(1,y-1)+cells(1,y+1)+cells(2,y)+cells(2,y+1)+... cells(2,y-1); sum(n,y)=cells(n,y+1)+cells(n,y-1)+cells(n-1,y)+cells(n-1,y+1)+... cells(n-1,y-1); sum(x,1)=cells(x-1,1)+cells(x+1,1)+cells(x,2)+cells(x+1,2)+... cells(x-1,2); sum(x,n)=cells(x-1,n)+cells(x+1,n)+cells(x,n-1)+cells(x+1,n-1)+... cells(x-1,n-1);
%equations for the interior cells to check for infected %neighbors 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); %updating the cells matrix cells = (sum(1:n,1:n)==3)|(sum(1:n,1:n)==2 & cells); %draw the new image set(imh, 'CData', cat(3,cells,z,z)) drawnow%displaying the updated image waitforbuttonpress end
Excitable Media can be observed in the BZ reaction Belousov-Zhabotinsky reaction
What is the BZ reaction? It is a chemical reaction caused by the mixture of Sulfuric Acid Sodium Bromate Malonic Acid Sodium Bromide Phenanthroline Ferrous Sulfate Triton X-100 Surfactant
Rules for the BZ Reaction • Cells can be in 10 different states. • State 0 = resting • States 1 – 5 = active • States 6 – 9 = refractory • Like LIFE, each cell of the BZ reaction is dependent on its 8 surrounding neighbors. • If 3 or more neighbors are active, cell = 1 • A cell in State 1 will change to State 2. • A cell in State 2 will change to State 3 and so on. • A cell in State 9 will change to State 0.
Code for the BZ Reaction clear all n=200; %size M=zeros(n); %this will give us an n by n matrix grid=M; %the grid will be made up of the n by n matrix grid=(rand(n))<.06; sum=M; bz=image(cat(3,grid,M,M)); x=[2:n-1]; y=[2:n-1]; axis tight
t = 6; % when t is in active state for i=1:1000 %duration of loop sum(x,y) = ((grid(x,y-1)>0)&(grid(x,y-1)<t)) + ... ((grid(x,y+1)>0)&(grid(x,y+1)<t)) + ... ((grid(x-1, y)>0)&(grid(x-1, y)<t)) + ... ((grid(x+1,y)>0)&(grid(x+1,y)<t)) + ... ((grid(x-1,y-1)>0)&(grid(x-1,y-1)<t)) + ... ((grid(x-1,y+1)>0)&(grid(x-1,y+1)<t)) + ... ((grid(x+1,y-1)>0)&(grid(x+1,y-1)<t)) + ... ((grid(x+1,y+1)>0)&(grid(x+1,y+1)<t)); %the sum of each cell in active state of the 8 surrounding neighbors grid = ((grid==0) & (sum>=3)) + 2*(grid==1) + 3*(grid==2) + ... 4*(grid==3) + 5*(grid==4) + 6*(grid==5) +... 7*(grid==6) + 8*(grid==7) + 9*(grid==8) +... 0*(grid==9); %when state=1, next state=2... set(bz,'cdata', cat(3,M,grid/10,M) ) %bz is the image, cdata contains %data array drawnow%creates image end
Lattice Gas Automata Evolution of Gas Particles
Lattice Gas Automata Rules Cells have 2 states 0 = empty 1 = moving gas particle Each cell has 3 neighbors for a given time step where a block rule is applied to a 2 x 2 block of cells.
Code for Lattice Gas Automata %Cellular Automata model of gas particles in a box with a partition %This will make use of a Margolus neighborhood to create motion of an HPP %(Hardy, Pazzis, Pomeau) lattice gas... Curious if we meet Gibbs' paradox! clear all clf%clears any frames being used. %--------------We must first create our grid---------- %These variables will be used to define the dimension of the matrix in our %grid nx=52; %must be divisible by 4, since each cell will be divided into groups of four ny=100; z=zeros(nx,ny); %Creates an nx by ny matrix of zeros called z o=ones(nx,ny); %Creates an nx by ny matrix of ones called o
%Initialize each of the matrices to be used later cells = z ; cellsNew = z; ground = z ; diag1 = z; diag2 = z; and12 = z; or12 = z; sums = z; orsum = z; %create the box ground(1:nx,ny-3)=1 ; % right ground line ground(1:nx,3)=1 ; % left ground line ground(nx/4:nx/2-2,ny/2)=1; % the hole in the middle of the partition ground(nx/2+2:nx,ny/2)=1; %the hole in the middle of the partition ground(nx/4, 1:ny) = 1; %top line ground(3*nx/4, 1:ny) = 1; %bottom line %We now want to "fill" the left side of the container with "gas particles" r = rand(nx,ny); cells(nx/4+1:3*nx/4-1, 4:ny/2-1) = r(nx/4+1:3*nx/4-1, 4:ny/2-1)<0.3;
%Define the image of the gas particles in the container! imh = image(cat(3,z,cells,ground)); set(imh, 'erasemode', 'none') axis equal axis tight %This is where we define the motion of the particles for i=1:1000 p=mod(i,2); %Margolus neighborhood defined %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 %We can only have one of the following to hold: diag1(xind,yind) = (cells(xind,yind)==1) & (cells(xind+1,yind+1)==1) & ... (cells(xind+1,yind)==0) & (cells(xind,yind+1)==0); diag2(xind,yind) = (cells(xind+1,yind)==1) & (cells(xind,yind+1)==1) & ... (cells(xind,yind)==0) & (cells(xind+1,yind+1)==0);
%This gives the diagonals both not occupied by two particles andboth(xind,yind) = (diag1(xind,yind)==0) & (diag2(xind,yind)==0); %This gives one diagonal occupied by two particles orone(xind,yind) = diag1(xind,yind) | diag2(xind,yind); %For a given gas particle, check if it is near the boundary sums(xind,yind) = ground(xind,yind) | ground(xind+1,yind) | ... ground(xind,yind+1) | ground(xind+1,yind+1) ; %Rules: %If (no walls) and (diagonals are both empty) %then there are no particles to swap, so the block stays the same cellsNew(xind,yind) = ... (andboth(xind,yind) & ~sums(xind,yind) & cells(xind+1,yind+1)) + ... (orone(xind,yind) & ~sums(xind,yind) & cells(xind,yind+1)) + ... (sums(xind,yind) & cells(xind,yind));
cellsNew(xind+1,yind) = (andboth(xind,yind) & ~sums(xind,yind) & cells(xind,yind+1)) + (orone(xind,yind) & ~sums(xind,yind) & cells(xind,yind))+ ... (sums(xind,yind) & cells(xind+1,yind)); %If (no walls) and (only one diagonal occupied) %then this is representative of a collision--- treat as though the %particles hit and deflect each other at 90 degrees, i.e. one diagonal %is converted to the other on the time step. cellsNew(xind,yind+1) = ... (andboth(xind,yind) & ~sums(xind,yind) & cells(xind+1,yind)) + ... (orone(xind,yind) & ~sums(xind,yind) & cells(xind+1,yind+1))+ ... (sums(xind,yind) & cells(xind,yind+1)); %If (wall) %then the cell stays the same in the block (causes a reflection) cellsNew(xind+1,yind+1) = ... (andboth(xind,yind) & ~sums(xind,yind) & cells(xind,yind)) + ... (orone(xind,yind) & ~sums(xind,yind) & cells(xind+1,yind))+ ... (sums(xind,yind) & cells(xind+1,yind+1));
cells = cellsNew; set(imh, 'cdata', cat(3,z,cells,ground) ) drawnow waitforbuttonpress; end