Você está na página 1de 10

Asignación 4.

Simulación de Autómatas Celulares


Sergio Nicolás Chaves Ortiz. Código: 314516
Fisicoquímica Computacional, mayo 30 de 2018

Comenzamos creando una matriz de 55x55 en Tabla 1. Valores de la Joining y la probabilidad de


donde se ubicarán los 2100 autómatas al azar Breaking.
por medio de las funciones externas 𝑃𝐵 𝐽
presentadas en el Anexo C y sacando en un W-L 0.1-0.9 1
vector con las coordenadas de cada autómata W-W 0.25 1
en esa matriz. L-L 0.1 1

Una vez obtenida la malla se pasa a identificar En donde el valor de 𝑃𝐵 (𝑊𝐿) varia desde 0.1
los vecinos ubicados a la izquierda, derecha, hasta 0.9 durante la simulación.
arriba y debajo de cada autómata (Casillas j de
la Figura 1) por medio del código presente en Debido a que el parámetro de Joining es igual
el Anexo D. a 1 cuando el vecino en la posición k es vacío y
también es igual a 1 en los tres casos
k presentados en la tabla 1, se puede hacer la
siguiente simplificación de la ecuación 1.
j
k j i j k (𝑃𝐵 )𝑛
𝑝𝑚 (𝑑) = (𝐸𝑐. 3)
4−𝑛
j
k Obteniendo de esta manera que la
probabilidad de que se mueva el autómata
Figura 1. Esquema del vecindario extendido de von
será:
Neumann. 4−𝑛
(𝑃𝐵 )𝑛
Luego se paso a realizar el movimiento de un 𝑝 = ∑( ) (𝐸𝑐. 4)
4−𝑛 𝑑
autómata al azar, calculando la probabilidad 𝑑=1
de que el autómata se mueva a uno de sus En donde la probabilidad obtenida con la
vecinos inmediatos vacíos con la ecuación 1. ecuación 4 se compara con un número
4−𝑛 aleatorio (𝜉) y si se cumple que 𝜉 ≤ 𝑝 el
𝑝 = ∑ 𝑝𝑚 (𝑑) (𝐸𝑐. 1) autómata se mueve a uno de los vecinos vacíos
𝑑=1 y se actualiza la malla donde se ubican los
autómatas y el vector de coordenadas para
1
𝑝𝑚 (𝑑) = (𝐸𝑐. 2) cada autómata.
4−𝑛 1
1+( − 1) ×
(𝑃𝐵 )𝑛 𝐽(𝑑) Después se pasa a realizar el cálculo de
numero de enlaces de hidrogeno presentes en
la malla, con lo cual se cuenta únicamente el
Y teniendo los parámetros de 𝑃𝐵 y 𝐽 numero de paredes en común entre dos
presentados en la tabla 1. autómatas tipo W.
Este procedimiento se llevo a cabo 1 millón de
veces, con el fin de asegurar 476 jugadas, una
vez terminado el numero de jugadas se paso a
calcular la fracción de autómatas tipo W que
estaban rodeadas por 4 autómatas tipo W (𝑓4 )
y se realizo el promedio del número de enlaces
de hidrogeno (𝑛̅𝐻𝐵 ). Los resultados de 𝑓4 y de
(𝑛̅𝐻𝐵 ) se presentan a continuación en la tabla
2.
Tabla 2. Valores de 𝑓4 y de 𝑛̅𝐻𝐵 .
Calculados Teórico
𝑃𝐵 (𝑊𝐿) 𝑓4 (𝑊) 𝑛̅𝐻𝐵 𝑓4 (𝑊) 𝑛̅𝐻𝐵
0.1 0.269 2.816 0.28 2.90
0.2 0.274 2.854 0.29 2.91
0.3 0.274 2.863 0.29 2.92
0.4 0.270 2.870 0.30 2.93
0.5 0.280 2.889 0.32 2.96
0.6 0.289 2.893 0.31 2.97
0.7 0.296 2.926 0.32 2.97
0.8 0.310 2.918 0.34 3.00
0.9 0.338 2.946 0.33 3.00

Como se puede observar en la Tabla 2, los


valores de 𝑓4 y de 𝑛̅𝐻𝐵 calculados presentan una
desviación con respecto a los valores teóricos
presentados en el artículo, esto se debe a que el
articulo propone 10000 jugadas con 500 jugadas
de calentamiento, lo cual daría un resultado
aproximado de 31 millones de iteraciones, por lo
tanto, al realizar la simulación con 1 millón de
iteraciones, no se tiene la certeza de que el sistema
se haya estabilizado, a pesar de esto los valores
encontrados en la simulación si siguen la tendencia
encontrada en el artículo, donde al aumentar el
valor de 𝑃𝐵 (𝑊𝐿) los valores de 𝑓4 y de 𝑛̅𝐻𝐵
aumentan.
Anexo A. Graficas de la posición final de los autómatas para cada PB(WL).
A continuación se presentan las posiciones finales de los autómatas de tipo W (Azul oscuro) y tipo L
(Amarillo) después de realizar 1 millón de iteraciones para cada valor de 𝑃𝐵 (𝑊𝐿) propuesto por el
artículo.

Figura 1. Simulación de autómatas celulares Figura 4. Simulación de autómatas celulares


para 𝑃𝐵 (𝑊𝐿) = 0.1. para 𝑃𝐵 (𝑊𝐿) = 0.4.

Figura 2. Simulación de autómatas celulares Figura 5. Simulación de autómatas celulares


para 𝑃𝐵 (𝑊𝐿) = 0.2. para 𝑃𝐵 (𝑊𝐿) = 0.5.

Figura 3. Simulación de autómatas celulares Figura 6. Simulación de autómatas celulares


para 𝑃𝐵 (𝑊𝐿) = 0.3. para 𝑃𝐵 (𝑊𝐿) = 0.6.
Figura 7. Simulación de autómatas celulares
para 𝑃𝐵 (𝑊𝐿) = 0.7.

Figura 8. Simulación de autómatas celulares


para 𝑃𝐵 (𝑊𝐿) = 0.8.

Figura 9. Simulación de autómatas celulares


para 𝑃𝐵 (𝑊𝐿) = 0.9.
Anexo B. Código principal en Matlab.
%Asignación 4. Autómatas Celulares: Efecto hidrofóbico
%Sergio Nicolas Chaves Ortiz -- Cod: 314516
close all; clear all; clc
%% Determinación de las variables globales del programa
global malla coordenadasW coordenadasL vecinosMalla coordenadas

%% Datos del ejercicio


numcol=55; %Numero de columnas
numfil=55; %Numero de filas
AutW=2000; %Numero de autómatas del tipo agua
AutL=100; %Numero de autómatas del tipo lípido
numAutomatas=AutW+AutL; %Numero de autómatas totales en la
simulación

%% Probabilidad de Breaking
PbW=0.25; %PB Agua-Agua
PbL=0.10; %PB Lípido-Lípido
PbWL=0.1; %[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]; %PB Agua-Lípido

%% Parámetro de Joining
JW=1; %J Agua-Agua
JWL=1; %J Agua-Lípido
JL=1; %J Lípido-Lípido

malla=zeros(numfil,numcol); %Matriz de ubicación de los autómatas


coordenadasW=zeros(AutW,2); %Matriz de coordenadas de W
coordenadasL=zeros(AutL,2); %Matriz de coordenadas de L
coordenadas=zeros(numAutomatas,2); %Matriz de coordenadas de los autómatas
vecinosMalla=zeros(numfil,numcol,4); %Matriz de vecinos inmediatos

%% Asignación de los autómatas a la malla


Nasig1=posAzarAutomataW(AutW,numfil,numcol); %Asignación de W a la malla
Nasig2=posAzarAutomataL(AutL,numfil,numcol); %Asignación de L a la malla

%% Vector total de coordenadas para los Autómatas


coordenadas(1:AutW,:)=coordenadasW(1:end,:);
coordenadas(AutW+1:end,:)=coordenadasL(1:end,:);

salida = idVecinos(numfil,numcol); %Identificación de los Vecinos

numIter=1000000; %Número total de iteraciones


nHB=zeros(numIter,1); %Número de enlaces de hidrogeno

for iter=1:numIter
i_mueve=fix(rand()*numAutomatas)+1; %Selección del autómata al azar
f_s=coordenadas(i_mueve,1); %Fila del Autómata seleccionado
c_s=coordenadas(i_mueve,2); %Columna del Autómata seleccionado

i_llega=trataMover(f_s,c_s,PbW,PbL,PbWL); %Vecino al cual llega el


autómata seleccionado

%% Recalculo de las coordenadas, la malla y los vecinos


if i_llega>0
pos_llega=vecinosMalla(f_s,c_s,i_llega);
malla(f_s,c_s)=0;

[f1,c1]=ind2sub([numfil,numcol], pos_llega);
coordenadas(i_mueve,:)=[f1 c1];
if i_mueve<=2000
Am=1;
else
Am=2;
end
malla(f1,c1)=Am;
end

%% Determinación de los puentes de hidrogeno


for i=1:55
for j=1:55
if malla(i,j)==1
for k=1:4
if malla(vecinosMalla(i,j,k))==1
nHB(iter)=nHB(iter)+1;
end
end
end
end
end
end
nHB1=mean(nHB)/AutW;

%% Calculo de la fracción de Autómatas tipo W que están rodeados por 4


autómatas tipo W
f4=0;
for i=1:55
for j=1:55
if malla(i,j)==1
if malla(vecinosMalla(i,j,1))==1 && malla(vecinosMalla(i,j,2))==1
&& malla(vecinosMalla(i,j,3))==1 && malla(vecinosMalla(i,j,4))==1
f4=f4+1;
end
end
end
end
f41=f4/AutW;

%% Resultados
pcolor(malla)
disp(['f4= ',num2str(f41)])
disp(['nHB= ',num2str(nHB1)])
Anexo C. Funciones de posicionamiento a azar de los autómatas.
function Salida= posAzarAutomataW(numAutomatas,numFilas,numCols)
global malla coordenadasW
nAsig=0;

while (nAsig<numAutomatas)
pos_x=fix(rand()*numFilas)+1;
pos_y=fix(rand()*numCols)+1;

if (malla(pos_x,pos_y)==0)
malla(pos_x,pos_y)=1;
nAsig=nAsig+1;
coordenadasW(nAsig,1)=pos_x;
coordenadasW(nAsig,2)=pos_y;
end
end
Salida=nAsig;
end

function Salida= posAzarAutomataL(numAutomatas,numFilas,numCols)


global malla coordenadasL
nAsig=0;

while (nAsig<numAutomatas)
pos_x=fix(rand*numFilas)+1;
pos_y=fix(rand*numCols)+1;

if (malla(pos_x,pos_y)==0)
malla(pos_x,pos_y)=2;
nAsig=nAsig+1;
coordenadasL(nAsig,1)=pos_x;
coordenadasL(nAsig,2)=pos_y;
end
end
Salida=nAsig;
end
Anexo D. Funcion de identificación de los vecinos de cada autómata.
function salida = idVecinos(numfil,numcol)
global vecinosMalla

for i=1:numfil
for j=1:numcol
switch i

case 1
i_v_sup=numfil;
i_v_inf=2;

case 2
i_v_sup=1;
i_v_inf=3;

case numfil-1
i_v_sup=numfil-2;
i_v_inf=numfil;

case numfil
i_v_sup=numfil-1;
i_v_inf=1;

otherwise
i_v_sup=i-1;
i_v_inf=i+1;
end

switch j

case 1
j_v_izq=numcol;
j_v_der=2;

case 2
j_v_izq=1;
j_v_der=3;

case numcol-1
j_v_izq=numcol-2;
j_v_der=numcol;

case numfil
j_v_izq=numcol-1;
j_v_der=1;

otherwise
j_v_izq=j-1;
j_v_der=j+1;
end

vecinosMalla(i,j,1)=sub2ind([numfil,numcol],i,j_v_izq);
vecinosMalla(i,j,2)=sub2ind([numfil,numcol],i,j_v_der);
vecinosMalla(i,j,3)=sub2ind([numfil,numcol],i_v_sup,j);
vecinosMalla(i,j,4)=sub2ind([numfil,numcol],i_v_inf,j);
end
end
salida=4;
end
Anexo E. Funcion de movimiento para los autómatas.
function salida= trataMover( fila_sale, col_sale,PbW,PbL,PbWL)
global vecinosMalla malla

%% Condición 0 vecinos libres


nVecOcup=0; %Numero de vecinos ocupados

%% Identificación del número de vecinos libres


for ivm=1:4
ilivec=vecinosMalla(fila_sale,col_sale,ivm);
if malla(ilivec)~=0
nVecOcup=nVecOcup+1;
end
end

nVecLibres=4-nVecOcup; %Numero de vecinos libres


salida=0;
numAzar=rand;

%% Condición 4 vecinos libres


if nVecLibres==4
salida=fix(4*numAzar)+1;
end

%% Condición de 1 a 3 vecinos libres


if 1<=nVecLibres && nVecLibres<=3
A=malla(fila_sale,col_sale);
PB=1;
Pb=0;

%% Identificación del tipo de vecino


for ivm=1:4
ilivec=vecinosMalla(fila_sale,col_sale,ivm);
if malla(ilivec)==0
Av(ivm)=0;
elseif malla(ilivec)==1
Av(ivm)=1;
else
Av(ivm)=2;
end
end

%% Calculo de la probabilidad de moverse


for i=1:4
if A==1 && Av(i)==1
Pb(i)=PbW;
elseif A==1 && Av(i)==2
Pb(i)=PbWL;
elseif A==2 && Av(i)==1
Pb(i)=PbWL;
elseif A==2 && Av(i)==2
Pb(i)=PbL;
else
Pb(i)=1;
end
end

PB=Pb(1)*Pb(2)*Pb(3)*Pb(4);
probMover=PB./(nVecLibres);
acumMover=0;
%% Calculo de la probabilidad acumulada según el vecino encontrado
for k=1:4
if Av(k)==0
acumMover=acumMover+probMover;
if numAzar<=acumMover
salida=k;
break
end
end
end

end
end

Você também pode gostar