Autómatos celulares em GNU/Octave

Códigos em GNU/Octave para desenhar autómatos celulares.

Definição da regra do autómato celular:

function retval=carulen (x,r)
  xin= [1 1 1;1 1 0;1 0 1;1 0 0;0 1 1;0 1 0;0 0 1;0 0 0];
  maxl=round(log(r)/log(2))+1;
  power = ones (length (r), 1) * (2 .^ (maxl-1 : -1 : 0));
  r = r * ones (1, maxl);
  digits = floor (rem (r, 2*power) ./ power);
  if (length(digits)>8 && digits(1)==0)
    xout=digits(2:length(digits));
  else
    xout=cat(2, zeros(1,8-length(digits)),digits);
  endif;
  for i=1:8
    if (x==xin(i,:))
      x(2)=xout(i);
      retval=x(2);
      return;
    else
    endif;
  endfor;
endfunction

Desenha l iterações do autómato celular com regra r com comprimento 2n+1 com condições iniciais [... 0 0 1 0 0 ...]

function caplot(r,n,l)
  n=n+1;
  y=zeros(1,n);
  y(floor(n/2+1))=1;
  z=[];
  yn=[];
  z=cat(1,z,y);
  for j=1:l
    yn(1)=carulen([y(n) y(1) y(2)],r);
    for i=2:n-1
      yn(i)=carulen(y(i-1:i+1),r);
    endfor;
    yn(n)=carulen([y(n-1) y(n) y(1)],r);
    z=cat(1,z,yn);
    y=yn;
  endfor;
  zplot=cat(2,ones(l+3,1),cat(1, ones(1,n), ones(l+1,n)-z,ones(1,n)),ones(l+3,1));
  imshow(zplot)
endfunction

Desenha l iterações do autómato celular com regra r com comprimento 2n+1 com condições iniciais aleatórias

function caplot_rand(r,n,l)
  n=n+1;
  y=floor(2*rand(1,n));
  z=[];
  yn=[];
  z=cat(1,z,y);
  for j=1:l
    yn(1)=carulen([y(n) y(1) y(2)],r);
    for i=2:n-1
      yn(i)=carulen(y(i-1:i+1),r);
    endfor;
    yn(n)=carulen([y(n-1) y(n) y(1)],r);
    z=cat(1,z,yn);
    y=yn;
  endfor;
  zplot=cat(2,ones(l+3,1),cat(1, ones(1,n), ones(l+1,n)-z,ones(1,n)),ones(l+3,1));
  imshow(zplot)
endfunction
Palavras chave/keywords: autómato celular, GNU/Octave

Criado/Created: NaN

Última actualização/Last updated: 10-10-2022 [14:25]


Voltar à página inicial.


GNU/Emacs Creative Commons License

(c) Tiago Charters de Azevedo