Sie sind auf Seite 1von 46

Simulacin de Monte Carlo

del Modelo de Ising


Trabajo en grupo de Fsica computacional


[Seleccione la fecha]









Puyuelo Valds, Pilar
Salillas Martnez, Ricardo
Simn Colomar, Daniel
Vzquez Martn, Irene
Yus Dez, Jess
05/05/2014
1

ndice
Introduccin .......................................................................................................................................... 2
Explicacin del cdigo. ........................................................................................................................... 4
Determinacin de parmetros de entrada: ............................................................................................ 7
Beta inicial y beta final ............................................................................................................................. 7
Delta de beta ............................................................................................................................................ 7
Pasos de termalizacin ............................................................................................................................. 8
Nmero de medidas ............................................................................................................................... 13
Pasos de Monte Carlo ............................................................................................................................ 14
Resumen de parmetros ........................................................................................................................ 15
Configuraciones tpicas a distintos valores de beta: ............................................................................. 16
Temperaturas altas (fase desordenada) ................................................................................................ 16
Temperaturas intermedias (transicin de fase) ..................................................................................... 19
Temperaturas bajas (fase ordenada) ..................................................................................................... 21
Resultados de la simulacin ................................................................................................................. 24
Energa ................................................................................................................................................... 24
Error de la energa .................................................................................................................................. 25
Magnetizacin ....................................................................................................................................... 26
Error de la magnetizacin ...................................................................................................................... 28
Calor especfico ...................................................................................................................................... 29
Susceptibilidad magntica ..................................................................................................................... 31
Conclusin ........................................................................................................................................... 33
ANEXO I: Cdigo utilizado para la simulacin de Monte Carlo del modelo de Ising .............................. 34
ANEXO II: Cdigo utilizado para la simulacin con un valor fijo de beta............................................... 41

2

Introduccin
El objetivo de este trabajo es dual: en primer lugar el desarrollo de un programa que
reproduzca el modelo de Ising a travs de la simulacin de Monte Carlo y ms tarde el anlisis
de los datos obtenidos con dicho programa.
El modelo de Ising es un modelo fsico que nos permite estudiar el comportamiento de los
materiales ferromagnticos. En esta simulacin consideramos una red bidimensional
constituida por un retculo cuadrado con geometra toroidal en cuanto a las condiciones de
contorno se refiere. El retculo est discretizado, a cada punto de la malla se le denomina nodo
y posee un valor de spin (1 o -1). Este modelo nos posibilita estudiar el cambio de algunas
magnitudes bsicas de los ferromagnticos como son la energa (E o e), la magnetizacin (m),
la susceptibilidad () y el calor especfico (C
v
) conforme vara la temperatura (T) o en su defecto
(se corresponden segn =
1

siendo la constante de Boltzman).


Con la energa asociamos la agitacin trmica entre los espines, los que interaccionan entre s
tendiendo a alinearse. Dada una malla de tomos de dimensin V, distinguiremos entre
energa extensiva: =

+ =0

,1

1
=0
(siendo n el entero que recorre el volumen de la
malla y las dos dimensiones (x e y) existentes); y energa intensiva: =
1

+ ,

siendo esta ltima independiente del tamao del sistema. Es decir, a un nivel ms intuitivo, la
energa se obtiene sumando todos los links existentes entre los tomos del sistema; y estos
links toman valor -1 si los spines de los tomos que une son iguales, y +1 si son distintos. Por
tanto, configuraciones aleatorias tendrn una energa mayor que aquellas en las que existan
grandes regiones con un mismo spin.
Dado un beta, el valor medio terico de las energas intensivas viene dado por
< > =
1


1
2

+ ,

+ ,

.
La Z a la que nos referimos en la anterior definicin es la funcin de particin. Segn la ley de
Boltzman, la definimos como =

siendo d la medida sobre el espacio de


configuraciones C. En el caso de un espacio de configuracin discreto la definimos como
=
1

+ ,

. Posteriormente definiremos =1/kT, donde k es la constante de


Boltzmann y T la temperatura. La solucin de esta funcin de particin nos es desconocida, y
no resulta nada trivial. Por tanto, para estimar los valores medios se realizar mediante la
repeticin de medidas y estimadores estadsticos.
Al estar tratando con materiales magnticos conviene tratar su magnetizacin, producida por
la alineacin de los spines. La cantidad intensiva se define como: =
1

1
=0
=
1

siendo
M la magnetizacin extensiva. Si para calcular la energa sumbamos links, para calcular la
magnetizacin sumamos directamente spines. Por tanto, en una configuracin con una
cantidad equilibrada de spines de uno y otro tipo, se agrupen como se agrupen la
magnetizacin ser cercana a 0, y cuando predominen los de un tipo sobre los de otro tomar
otros valores distintos.
3

El valor terico medio de la magnetizacin dado un valor de beta viene dado por
< > =
1

+ ,

, pero de nuevo recordemos que desconocemos el


valor de Z, y por tanto se estimar <m> por la realizacin de mltiples medidas. En concreto,
nosotros tomaremos <|m|> en las medidas que realicemos, por razones que posteriormente
veremos.
Definiremos tambin la derivada de la energa intensiva con respecto a beta como el calor
especfico (excluyendo constantes) obteniendo que

= 2 (<
2
> < >
2
) manteniendo
la variable como una cantidad intensiva al igual que su primitiva.
Derivando la magnetizacin de una manera anloga al calor especfico obtenemos la
susceptibilidad magntica del sistema, que la estimaremos de la siguiente manera: = V(<

2
> < >
2
).
Las magnitudes antes sealadas tal y como hemos visto se derivan en ltima instancia de los
valores del conjunto de spines del retculo, y para calcularlas llevaremos a cabo una extensa
estadstica de las distintas configuraciones de spines en la malla a distintas betas, dichas
configuraciones sern obtenidas mediante la simulacin de Monte Carlo con nuestro
programa. Si el programa es correcto, la evolucin de las configuraciones de spines, y por lo
tanto de las magnitudes derivadas de ellas, debera actuar conforme al modelo terico
conocido que explica el comportamiento de los ferromagnticos, el cual se caracteriza por, que
al bajar la temperatura por debajo de una dada, adquieren magnetizacin espontnea,
sufriendo una transicin de fase.
En resumen: partiendo de una determinada configuracin de spines simularemos su evolucin
con la temperatura; de las distintas configuraciones obtendremos las magnitudes que las
caracterizan (energa, magnetizacin) y finalmente analizaremos el valor de dichas
magnitudes (explicacin de su comportamiento as como del anlisis estadstico llevado acabo
y verificacin con los valores que predice el modelo terico). Este anlisis constituir el eje
central del trabajo.


4

Explicacin del cdigo.
El programa desarrollado sobre el cual gira nuestro trabajo se basa en el modelo de Ising a
travs de la simulacin de Monte Carlo. Resumiendo su funcionamiento, en este programa se
genera una malla, y se realizan varias iteraciones en las que se la malla vara segn la ley de
Boltzmann, y se realizan medidas de las energa y magnetizacin para cada valor de beta,
recorriendo todo beta desde un beta inicial hasta un beta final leidos por archivo. A partir de
esas medidas se realiza estadstica para hallar medias, errores, y magnitudes derivadas, y
finalmente sacar por archivo los valores de todos esos parmetros junto a su beta.
Para realizar todo este procedimiento se han desarrollado numerosos subalgoritmos que
faciliten la implementacin del cdigo y el desarrollo a posteriori de la parte principal del
mismo (int main()). Se trata del programa incluido en el Anexo I. A continuacin procederemos
a explicar su funcionamiento en detalle.
Subalgoritmos empleados:
- Para generar nmeros aleatorios hemos hecho uso del generador de Parisi-Rapuano, el cual
inicializbamos en void ini_ran(int SEMILLA), y se generaban los nmeros aleatorios, entre
cero y uno, en la funcin float Random(). Matizar que para la generacin de nmeros
aleatorios no siga una misma secuencia la semilla (int SEMILLA) ir cambiando con la
funcin time(NULL), (hora del ordenador en el momento en que se compila el programa,
siempre diferente).

- Se ha desarrollado un subalgoritmo que lee de un fichero de texto los valores de los
parmetros que usaremos en el programa, void LeeInput (), cmo: beta inicial, beta final,
delta de beta, el nmero de pasos de termalizacin, el nmero de medidas, y el nmero de
pasos de Monte Carlo adecuado entre medidas.

- Con el procedimiento void GeneraConfiguracion () se genera una primera configuracin
inicial aleatoria, en el que cada spin se elige al azar, y tiene la misma probabilidad de
aparecer 1 o -1. Se hace uso de float Random().

Adems en este subalgoritmo se pedir al usuario que indique la dimensin del lado de la
malla.

- En el subalgoritmo void InicializaOffset () se inicializan los valores del offset, o
direccionamientos, que nos permitirn desplazarnos en la malla a lo largo de los ejes x e y.
Para el desarrollo de este subalgoritmo se han tenido en cuenta condiciones de contorno
peridicas que preserven la invariancia por traslacin del modelo.

- La funcin void Sweep() hace uso del algoritmo de Metrpolis para, partiendo de una
configuracin inicial, realizar cambios tentativos, aceptando o no el cambio de acuerdo con
el cociente de probabilidad entre ambas configuraciones. Si lo acepta, entonces el spin se
flipa.

5

Dado que la probabilidad de que aparezca una configuracin es proporcional al exponente
de (-Beta) por la energa E(C), para aligerar clculos realizaremos el cociente de
probabilidades restando los exponentes.

As mismo realizaremos un subalgoritmo void CalculaProb() que calcula las probabilidades
en un subalgoritmo aparte segn la beta que nos encontremos, puesto que la resta de los
exponentes va a tener unos valores en concreto segn el spin sea positivo o negativo.
- La funcin void CalculaEM () se encarga de calcular la energa y magnetizacin, intensivas,
para una configuracin dada para una malla con una dimensin L determinada. void
ConstruirVectorMedidas() guarda dicha energa y magnetizacin en un array para su futuro
manejo.

- El subalgoritmo void CalculaValoresMedios() calcula todos los valores relacionados con la
energa y la magnetizacin (media de la energa y de la magnetizacin, errores de las
mismas, y media de la energa al cuadrado y de la magnetizacin al cuadrado) que van a ser
necesarios para el posterior anlisis del modelo de Ising. Dichos valores los guarda en un
vector results[dimensin]. La dimensin de este vector es 7 veces el nmero mximo de
pasos de beta posibles, hemos credo conveniente guardar los datos en un vector y no en
una matriz por ser ms eficiente y consumir menos tiempo de CPU.

- Para guardar los datos que tenemos almacenados en el vector results[] en un fichero de
texto hemos creado la funcin void EscribeValoresMedios(), adems los sacar por pantalla.

Algoritmo principal del cdigo o Int main(), en el que se va a realizar la simulacin de Monte
Carlo.
Primero se lee de un archivo entrantes los parmetros con LeeInput (), se inicializa la primera
configuracin random con GeneraConfiguracion (), e inicializamos los direccionamientos con
InicializaOffset (). Con los datos ledos del input calcularemos el nmero de pasos que vamos a
realizar para cada beta.
A continuacin entramos en un bucle que va a realizar el ciclo de Histresis, que consiste en
realizar la simulacin de Monte Carlo en las dos direcciones, de beta inicial a beta final, y de
beta final a inicial, una vez comprobado que nuestro programa se aproxima bien al modelo de
Ising, y los valores obtenidos son coherentes, eliminaremos el proceso de vuelta.
Entrando en lo que es el bucle principal, realizando un nmero de pasos determinado. Es aqu
donde llamamos a la funcin CalculaProb() y calculamos las probabilidades para la beta. Se
realiza el proceso de termalizacin de la malla para cada nueva beta (uso de Sweep() ), que
significa una nueva temperatura, as nos aproximamos a la temperatura crtica. Y tras
termalizar, realizaremos las medidas de la magnetizacin y la energa, guardndolas en su
vector correspondiente; observar aqu que entre cada medida se realizaran un nmero de
pasos tentativos en el que se generarn nuevas configuraciones (uso de Sweep() ), hasta que
lleguemos a cualquier otra configuracin, resaltar que para una beta nula el proceso de
iteraciones de Monte Carlo no va a ser vlido puesto que aunque el algoritmo es correcto, la
6

trayectoria no es ergdica, como solucin, en este caso se generar una configuracin
aleatoria.
Una vez obtenidos todos los datos para una beta se procede a calcular los valores medios,
guardarlos en modo append en un fichero de texto, y se avanza en beta con delta de beta
hasta llegar a beta final.





















7

Determinacin de parmetros de entrada:
Como se ha comentado anteriormente, nuestro programa de simulacin del modelo de Ising
requiere una serie de parmetros de entrada ledos de un archivo externo que regirn su
funcionamiento. Estos datos son beta inicial, beta final, delta de beta, pasos de termalizacin,
nmero de medidas y pasos de Monte Carlo.
A continuacin trataremos con profundidad la determinacin del valor de cada uno de ellos
para que el programa se ajuste a lo que convenga y as realice las medidas correctas y
adecuadas.
Beta inicial y beta final
Estos dos parmetros han sido los ms sencillos de determinar al verse de manera explcita a la
hora de realizar las grficas. Son precisamente tanto el valor de beta con el que empezamos
(beta inicial) y el valor mximo (beta final) para el que tomaremos las medidas.
Se ha tomado una beta inicial de 0.0 y una final de 1.5 para realizar una observacin inicial de
cmo se comporta el sistema, y posteriormente se han acotado los intervalos en el entorno de
beta crtica.
Se ha decidido tomar esos valores ya que es interesante apreciar la grfica desde temperaturas
muy altas (beta inicial 0.0, equivalente a temperatura infinita) hasta un valor de beta
suficientemente alto para que encima del mismo no existan prcticamente cambios en el
comportamiento de las grficas, por lo que no resultaba interesante tomar ms valores.
Adems tomar un beta final mayor implica ms operaciones realizadas por el ordenador, lo
que se traduce en mayor tiempo de ejecucin. De forma que finalmente el valor de beta final
elegido ha sido de 1.5.
Por otro lado, se han tomado intervalos menores en el entorno de beta crtica para poder
obtener una mayor resolucin en un tiempo de ejecucin similar porque es en esta zona
donde las grficas presentan un comportamiento ms brusco, existiendo diversos anlisis a
realizar en este entorno. Entre ellos, el de beta crtica, que requiere de una gran resolucin
para poder diferenciar los valores que adquiere en mallas grandes.
Delta de beta
Este parmetro es la resolucin a la que nos referamos en el prrafo anterior. Es el intervalo
con el que vamos recorriendo beta y cada el cual tomamos los valores de energa,
magnetizacin, y sus derivadas.
Un delta de beta ms pequea implica un mayor nmero de puntos en nuestra grfica, pero a
su vez si se toma un valor demasiado pequeo puede dificultar ciertas medidas. Por ejemplo la
de beta crtica, ya que para valores de beta muy similares en el entorno de la beta crtica
(donde se produce la mayor variabilidad de energas y magnetizaciones), stos pueden tomar
valores dispersos creando una grfica que no es suave, que dificultara encontrar los mximos
exactos de las grficas, y el haber tomado una mayor resolucin habra sido en vano. Aunque
esto a su vez puede ser solucionado mediante la realizacin de una mayor estadstica, ligado
un mayor tiempo de ejecucin.
8

Hemos otorgado un valor de delta de beta de 0.01 para las simulaciones de intervalo de 0.0 a
1.5, ya que nos otorga 150 puntos para ver las grficas con resolucin suficiente para apreciar
el comportamiento general; y un valor de 0.002 para las simulaciones en el entorno de beta
crtica, que nos da una resolucin 5 veces mayor para apreciar el comportamiento de las
grficas en torno a la beta crtica.
En caso de necesitar una resolucin an mayor para determinar la beta crtica se acotara an
ms el intervalo para tambin utilizar un delta de beta menor (y tambin se aumentara el
nmero de medidas).
Pasos de termalizacin
Este es el nmero de sweeps que se realizan antes de tomar medidas tras variar el valor de
beta, porque existen un cierto nmero de iteraciones necesario para que tanto la energa
como la magnetizacin alcancen valores estables (la malla se termalice), y no se deben
considerar los valores previos a esta termalizacin.
Debido a la ausencia de una referencia de cuntos deberan ser los pasos de termalizacin, y a
la dificultad que supone apreciar la influencia de la termalizacin observando las grficas a
simple vista ya que este efecto se ve en parte camuflado mientras se realiza la estadstica, se
ha utilizado un programa a parte del que realiza la simulacin del modelo de Ising. (El cdigo
del programa se encuentra recogido en el anexo II)
El funcionamiento de este programa es sencillo; a partir de una configuracin inicial tomada de
un archivo, o bien aleatoria, realiza tantos sweeps como se deseen con una beta fijada, y toma
los datos de energa y magnetizacin para cada sweep realizado. Guarda en un archivo estos
datos indexados con el nmero de iteraciones realizado para poder graficarlos, y tambin la
configuracin final en otro archivo diferente para poder ser leda por el mismo programa.
El procedimiento para determinar los pasos de termalizacin ha sido pues el siguiente:
A partir de una configuracin aleatoria generamos una configuracin fijando un beta dado.
Esta configuracin (termalizada a dicho valor de beta, ya que sus valores de energa y
magnetizacin son estables) se guarda en un archivo y se lee en una posterior ejecucin a un
beta superior.
Posteriormente, en una grfica se representa la magnetizacin con respecto al nmero de
sweeps realizado para ver el tiempo que tarda en estabilizarse en un nuevo valor de
magnetizacin. Es decir, estaramos simulando el paso del primer beta al segundo y
observando las iteraciones necesarias para termalizar.
Pero con un intervalo arbitrario esto no sera correcto; estamos tomando un intervalo que
contiene a la beta crtica, a la mayor variacin que sufren los parmetros energa y
magnetizacin, es decir, el intervalo en el que ms cuesta termalizar (y en el que mejor se
observa la diferencia entre la magnetizacin inicial y la final, lo cual nos facilitar la
observacin de cuando se han estabilizado los valores en el nuevo beta). Adems, el intervalo
considerado es mayor al de delta beta.

9

Se analiza el valor de magnetizacin ya que termaliza ms lentamente que la energa, e
interesa que se hayan termalizado todos los parmetros. Por ltimo, se repite este proceso 10
veces ya que el nmero de pasos requerido para termalizar no es fijo.

Posteriormente vemos la grfica comentada anteriormente para la configuracin de L=128. Se
ha tomado un valor de beta inicial de 0.42 y uno final de 0.47, que como he indicado
anteriormente, contiene a la beta de corte y a la regin de mayor variacin tanto de
magnetizacin como de energa.

Cada una de las lneas de diferente color (que en realidad son un cmulo de puntos, cada uno
de los cuales es el valor de la magnetizacin tras cierto nmero de iteraciones) corresponden a
una simulacin.
Se observa que para la beta inicial los valores de magnetizacin son cercanos a 0, mientras que
tras la simulacin se estabilizan entre 0.8 y 1.0 (o bien entre -0.8 y -1.0).
La simulacin que ms iteraciones ha tardado en termalizarse ha sido la de color verde, con un
nmero comprendido entre 3000 y 3500. Por ello, y para asegurar que la malla ha termalizado
en nuestra simulacin, para L=128 tomaremos 4000 pasos de termalizacin.
Como adems el delta de beta mximo que utilizamos es 0.01, 5 veces menor al intervalo
considerado en este caso de 0.05, ese nmero de pasos de termalizacin ser ms que
suficiente para nuestra simulacin. No nos importa haber tomado un valor excesivo de pasos
de termalizacin, ya que esta no es la mayor fuente de complejidad computacional de la
simulacin, y no existe ningn inconveniente en realizar un mayor nmero de pasos de
termalizacin del necesario.
Repitamos el mismo proceso, ahora para una malla de L=64, con unos valor de beta inicial de
0.41 y uno final de 0.48 (cuanto menor es la L de la malla, menos brusco es el cambio de la
10

energa y la magnetizacin, como posteriormente analizaremos en otras secciones; y por ello
tomamos un intervalo mayor al anterior para que englobe una variacin similar a la anterior).

En este caso, tras 10 simulaciones, el mayor nmero de sweeps necesario para termalizar la
malla ha sido cercano a 800. Tomaremos pues 1000 pasos de termalizacin para la malla de
L=64, recordando que el intervalo analizado (0.07) es 7 veces mayor al mximo delta de beta
que utilizamos (0.01).
Repitamos una vez ms el proceso para L=32, con un intervalo de 0.35 a 0.55:


11


En este caso el mayor nmero necesario de pasos ha sido cercano a 130. Tomaremos pues 200
pasos de termalizacin. Utilizaremos estos mismos pasos de termalizacin para las mallas de
menor tamao a esta, ya que como hemos visto, el nmero de pasos necesario para termalizar
disminuye cuanto menor es la malla, y 200 pasos no suponen una cantidad de tiempo de
ejecucin importante, y menos an para estos tamaos de malla.
Otro aspecto a comentar es que los pasos de termalizacin considerados son ms que
suficientes para termalizar directamente desde beta=0 (temperatura infinita) hasta cualquier
beta menor a la beta inferior del intervalo que hemos analizado en cada caso para determinar
el nmero de pasos de termalizacin. Es decir, en nuestro programa principal podremos
realizar simulaciones tomando una beta inicial menor o igual a 0.35 en el caso de mallas de
L 32, 0.41 en L=64 y 0.42 en L=128 sin necesidad de realizar una termalizacin inicial
adicional.
Un buen mtodo para reconocer si los pasos de termalizacin son suficientes es observar si se
produce un falso proceso de histresis al recorrer beta en ambos sentidos, es decir, observar si
se recogen datos superiores a otros dependiendo del sentido de recorrido. Que ocurriera este
fenmeno precisamente querra decir que las configuraciones utilizadas "recuerdan" las
anteriores en la cadena de Markov, y tienen un valor ms similar a ellas; fenmeno el cual
pretendemos evitar utilizando el proceso de termalizacin, por el que las medidas realizadas
para una temperatura dada son independientes de la temperatura anterior. Decimos falso
proceso de histresis porque no sera el producido por una transicin de primer orden (la
transicin que analizamos es de segundo orden), sino por la falta de termalizacin.
Realizamos una grfica con L=128 (la malla que ms tiempo tarda en termalizar) para observar
el fenmeno ms claramente, en la que representamos la magnetizacin segn beta. No se ha
realizado demasiada estadstica ya que la malla termaliza tambin en el mismo proceso de
medida, lo que suavizara este efecto, y pretendemos que aqu se vea claramente. Se ha
realizado la grfica con lneas y no con puntos ya que de esta manera es ms fcil de visualizar.
12


Se observa en efecto que al provenir de valores de magnetizacin ms altos las medidas en
sentido negativo son superiores en el entorno de la beta crtica (cercano a 0.44 para este
tamao de malla). Para valores ms alejados de la beta crtica la diferencia no se aprecia salvo
por pequeas divergencias de carcter estadstico.
Realicemos una grfica ahora en la que se realizan los 4000 pasos de termalizacin estimados
para esta dimensin de malla:
Ahora se puede observar cmo el camino de vuelta no tiene por qu tener un valor superior al
de ida en el entorno de beta crtico (aunque podra tomarlo, ya que es aleatorio), tal y como se
ha dado en este caso. Las diferencias entre ambos caminos ahora son causadas por
divergencias estadsticas, que mediante la realizacin de una mayor estadstica sern
13

reducidas, ya que como se haba indicado, aqu se ha realizado una estadstica ms reducida
para apreciar mejor el efecto de la termalizacin.
Nmero de medidas
Este es el nmero de valores de energa y de magnetizacin que se toman para un valor de
beta dado, sobre el cual posteriormente se hallar la media.
Esto no tiene gran influencia ni en las grficas de energa ni las de magnetizacin, pero s en las
del calor especfico y susceptibilidad, ya que para un bajo nmero de medidas existen zonas en
las que aparecen datos ms dispersos y menos definidos que para un alto nmero de medidas.
El tener datos poco definidos puede ser crucial a la hora de determinar la beta de corte, ya que
va a ser a partir de estas grficas de donde la determinemos.
Por otro lado, recordemos que la definicin de calor especfico y susceptibilidad es anloga a la
de varianza, y el error de la media de la energa es precisamente la raz de esa varianza dividida
entre el nmero de medidas. Es decir, a parte de las zonas donde aparecen datos ms
dispersos, el error va dividido entre la raz del nmero de medidas, lo que hace que tenga una
fuerte dependencia del nmero de medidas realizado.
Observemos la siguiente grfica, que compara el calor especfico entre una malla de L=8
habiendo tomado 1000 medidas (rojo) y habiendo tomado 10000 medidas (verde). Se ha
realizado la simulacin en ambos sentidos, no porque vaya a haber una diferencia entre el
camino de ida y de vuelta debido a la "histresis" (que ha sido controlada en la determinacin
de los pasos de termalizacin, y se ha comprobado que en efecto no hay) sino para tener dos
datos para cada valor de beta con lo que poder apreciar mejor si se dispersan o son similares.

Podemos ver que para los betas ms cercanos a 0 y en la regin de la beta de corte es donde
ms difieren las grficas, siendo la representacin verde mucho ms suave, la cual nos
permitir hacer una determinacin de la beta de corte.
14

Otro aspecto en el que se puede observar la mejora de la grfica es la diferencia entre la
medida realizada en un sentido y en otro para el mismo valor de beta, siendo que para la
grfica con mayor nmero de medidas es bastante menor.
Tras realizar este anlisis, observamos que realmente cuanto mayor nmero de medidas
vayamos a tomar, mejor ser la simulacin, con errores ms bajos y grficas mejor definidas.
Lo ideal entonces sera tomar un nmero que tienda a infinito de medidas. Pero esto no va a
ser posible, ya que el nmero de medidas que tomemos va a estar limitado por el tiempo de
ejecucin del programa. Por tanto, seleccionaremos aqul nmero que proporcionar la
suficiente claridad en las grficas para que se vean correctamente, y as podamos determinar
correctamente la beta de corte; pero que no sea un nmero excesivamente alto que haga
nuestro programa inviable a nivel computacional.
Finalmente, el nmero de pasos para medir va a ser 10000, que mantendremos para todas las
simulaciones que realicemos, ya que tomar valores superiores comienza a suponer tiempos de
ejecucin excesivamente largos, y este valor ya nos otorga grficas suficientemente buenas
para nuestros objetivos.
Pasos de Monte Carlo
Se trata del nmero de sweeps que se realiza entre cada medida, de forma que las
configuraciones de las cuales tomemos medidas sean independientes y entonces la frmula
mediante la cual se halla el error sea correcta.
Existen diversos mtodos destinados a hallar este nmero de pasos, pero son de un nivel ms
avanzado, por lo cual no los utilizaremos. En su lugar, lo determinaremos de una manera
emprica, con la que nos podremos hacer a la idea de la cantidad que necesitaremos, pero en
ningn caso supondr un dato correcto, sino un dato que hemos considerado adecuado.
El proceso seguido consiste en la realizacin de diversas simulaciones con distintos pasos de
Monte Carlo entre las medidas. Reproducimos una primera simulacin con slo 1 paso de
Montecarlo, una segunda con un nmero de pasos de Monte Carlo tentativo, y una ltima con
ese valor multiplicado por 4 5. Nos hemos percatado realizando las grficas de los errores de
energa y magnetizacin que s existan diferencias entre la simulacin con el nmero tentativo
de pasos de Monte Carlo entre medidas y la de un slo paso, pero hemos visto como la de este
valor tentativo se ajustaba bastante bien a la del valor multiplicado por 5. Con lo cual se ha
dado ese valor como el correcto; al observar que no haba cambios relevantes en la grfica del
error se ha considerado que el valor tentativo ya consegua el objetivo de la independencia
entre las configuraciones medidas.
Ms concretamente, hemos tomado 5 pasos de Monte Carlo para las configuraciones de L=32
o menores, 15 pasos de Monte Carlo para la configuracin de L=64 y 40 pasos de Monte Carlo
para la de L=128. Para este ltimo tamao de malla no se ha realizado ninguna comprobacin,
ya que una comparacin con otro valor de pasos de Monte Carlo muy superior supone una
extraordinaria complejidad computacional, con un tiempo de ejecucin muy alto.
Como hemos indicado, no son datos obtenidos rigurosamente, por lo que podran ser
errneos, pero tampoco era nuestro objetivo su determinacin exacta. El aspecto de las
15

grficas es algo con cierto grado de subjetividad, adems de que su forma puede variar
ligeramente en la realizacin de diferentes simulaciones por mera estadstica. Se espera que al
realizar una gran cantidad de medidas como las 10000 que se han elegido anteriormente
ayude a compensar el error generado en caso de haber utilizado un nmero de pasos de
Monte Carlo menor al necesario.
Resumen de parmetros
A continuacin quedan resumidos los parmetros utilizados para las diferentes simulaciones,
realizando algunas simulaciones adicionales con distintos valores para obtener mayor
resolucin en un intervalo menor al hallar la beta crtica.
L 8 12 16 24 32 64 128
Pasos de
termalizacin
200 1000 4000
Nmero de
medidas
10000
Pasos de Monte
Carlo
5 15 40

beta inicial 0.0
beta final 1.5
delta beta 0.01

beta inicial 0.3 0.35
beta final 0.6 0.5
delta beta 0.002


16

Configuraciones tpicas a distintos valores de beta:
Antes de entrar en el anlisis de la evolucin de los observables como la energa o la
magnetizacin con beta, es interesante ver cmo se comportan los sistemas a diferentes
valores fijos de beta (diferentes temperaturas) para luego comprender mejor ciertos
resultados que obtengamos.
Temperaturas altas (fase desordenada)
En estas temperaturas la probabilidad de encontrar cualquier configuracin es similar, con lo
cual las energas con entropa alta (energas cercanas a 0) son mucho ms probables en este
rango. Es decir, las configuraciones que obtengamos sern configuraciones desordenadas,
generndose spines prcticamente aleatorios independientemente de los que tengan
alrededor (conforme vayan subiendo las temperaturas esta dependencia aumentar,
comenzndose a generar zonas en las cuales los spines sean iguales). Que estos spines sean
aleatorios o prcticamente aleatorios har que la energa obtenida para temperaturas muy
altas tenga un valor central de cero, como posteriormente podremos ver en las grficas. La
magnetizacin tambin tendr un valor central de 0, pero nosotros estaremos midiendo la
observable del valor absoluto de la magnetizacin, con lo cual no se obtendr ese valor en las
grficas, como tambin se ver en la seccin correspondiente.
Vamos a observar cmo es una configuracin termalizada a un beta de 0.1. A esta
temperatura ya se comienzan a formar regiones donde dominan spines de un tipo u otro, pero
son de pequeo tamao, con lo que igualmente se considera una configuracin desordenada.

En concreto, en esta configuracin se obtiene una energa de 0.040 y una magnetizacin de
0.035, valores cercanos a 0 tal y como era esperable.
Por otro lado, tambin es interesante ver cmo evoluciona un sistema a esta temperatura,
para ver si en efecto la temperatura y magnetizacin van alrededor del valor central de 0, y ver
cunto se dispersan de este valor central, lo que nos dar una idea de cunto vale el calor
especfico y la susceptibilidad a estas temperaturas (y tambin el error de la media de la
energa y la magnetizacin).
17

Para ello utilizaremos el mismo programa que ya hemos utilizado anteriormente en la
determinacin de los pasos de termalizacin. Es el incluido en el Anexo II. Recordemos
igualmente su sencillo funcionamiento. El programa genera una configuracin random o bien
leer una de archivo, sobre la cual realiza tantos sweeps como queramos a un beta fijado. Para
cada iteracin (o cada un cierto nmero de ellas aadiendo un if) realiza medidas de la energa
y de la magnetizacin de la configuracin y las guarda en un archivo junto al ndice de la
iteracin para luego poder ver la evolucin en una grfica. Al finalizar el programa tambin
genera otro archivo con la malla final tras el nmero de iteraciones elegido, de forma que se
podr utilizar para una simulacin posterior (la malla de la figura anterior ha sido generada
mediante este programa).
Realicemos una simulacin con 100000 iteraciones, que toma la energa y la magnetizacin
cada 100 simulaciones para con un beta fijado como anteriormente a 0.1 para ver cmo
evoluciona el sistema (se elige tambin L=20).

Al haber realizado la simulacin para un beta de 0.1 el valor central de energa no resulta ser 0,
sino ligeramente inferior. Esto nos indica que en efecto se han generado pequeas regiones
donde domina un spin u otro, tal y como hemos podido ver anteriormente.

18


En cambio, la magnetizacin s sigue estando centrada en 0, lo que nos indica que a pesar de
que se hayan generado pequeas zonas donde dominan unos u otros spines, se sigue teniendo
una configuracin desordenada ya que la cantidad de spines de cada tipo sigue siendo igual.
Conviene tambin observar la diferencia entre la dispersin de valores para esta dimensin y
una mayor, ya que en una suma de V variables aleatorias, la dispersin se reduce con raz de V
(por teorema del lmite central); y se obtendrn valores ms estables alrededor del 0. Para la
energa no se aprecian diferencias relevantes, ya que su dispersin como ya hemos indicado
est ms relacionada con la generacin de pequeas zonas donde predomina un tipo de spin.
Realizamos una simulacin con L=64 y observemos la diferencia en cuanto a la dispersin de
los datos de magnetizacin:

19

Se observa claramente que los valores de magnetizacin obtenidos estn menos dispersos
(observar en el eje y los valores entre los que vara). Esto se traducir en una menor
susceptibilidad, tendiendo a 0 conforme aumenta V, resultado que podremos observar
posteriormente con las grficas de la susceptibilidad con respecto a beta.
Temperaturas intermedias (transicin de fase)
A estas temperaturas, en la configuracin se empezarn a formar grandes zonas donde
predominen unos u otros spines. Esto es debido a que la probabilidad de que un tomo
rodeado de 4 con el mismo spin realice un flip flop es muy reducida. Si las temperaturas siguen
bajando las grandes zonas de un tipo de spin predominarn sobre las del otro, hasta que
finalmente en temperaturas fras la totalidad de la malla tenga spines de un solo tipo.
Observemos una configuracin de L=20 a un beta de 0.42, temperatura muy cercana a la beta
crtica donde se produce la transicin de fase.

En este caso particular observamos cmo se ha generado una configuracin de spines
positivos predominante sobre la de spines negativos. La magnetizacin es de 0.590 y la energa
de -0.650.
De nuevo volvamos a observar cmo evoluciona la energa y la magnetizacin, realizando
100000 iteraciones y tomando un valor de energa y de magnetizacin cada 100 iteraciones.
20


La energa toma valores bastante inferiores que en temperaturas altas, consecuencia de la
existencia de esas grandes zonas con el mismo spin. Tambin existe una dispersin mucho
mayor de los valores de energa, lo que nos indica que estas zonas no se estabilizan en un
tamao dado, sino que aumentan o se reducen de tamao. Por tanto, en esta regin el calor
especfico ser mayor que en temperaturas altas.

En cuanto a la magnetizacin, se observa cmo la predominancia de spines de un tipo u otro
se va alternando, existiendo tambin situaciones intermedias en las que ambas zonas estn
ms o menos equilibradas. Es decir, existe una enorme dispersin entre los valores de
21

magnetizacin obtenidos, incluso tomando el valor absoluto, lo que se traduce en una
susceptibilidad magntica muy alta.
Temperaturas bajas (fase ordenada)
Volvamos a observar una configuracin tpica, esta vez para un valor de beta de 0.6. Esta vez
se obtendr una malla con todos los spines orientados hacia el mismo lado, salvo alguno
aislado que espontneamente pueda haber realizado un flip flop (la probabilidad de que esto
ocurra ser ms baja cuanto menores sean las temperaturas)

La configuracin obtenida ha resultado ser prcticamente uniforme con spines de +1, salvo por
9 de ellos que son negativos (la temperatura tomada no es excesivamente baja y es normal
que esto ocurra). La energa toma un valor de -0.945 y la magnetizacin de 0.955.
Observemos ahora la evolucin de los observables del sistema a esta beta de 0.6, de la misma
manera que anteriormente.

22


Ambas grficas siguen un comportamiento similar. La energa toma valores centrados casi en
-1 (ligeramente inferior por no encontrarnos en un beta excesivamente alto) con una
dispersin muy pequea en comparacin con las anteriores (el calor especfico pues tomar un
valor tambin inferior); y la magnetizacin acta igual, slo que tambin podra haber estado
centrada en el valor opuesto (no existe ninguna preferencia inicialmente entre spines +1 -1),
por lo que la susceptibilidad magntica tambin ser baja.
Conforme las temperaturas son menores (betas mayores), como se ha indicado, la
probabilidad de que un spin realice espontneamente un flip flop es menor. Esto se traduce en
que los valores de energa y magnetizacin media se acercan cada vez ms a su valor lmite (-1
en la energa, 1 en el valor absoluto de la magnetizacin), y adems su dispersin se ir
reduciendo, lo que har que el calor especfico y la susceptibilidad vayan alcanzando valores
cada vez ms cercanos a 0.
Para acabar esta seccin, indicar que exista una probabilidad no nula de que una
configuracin con predominancia de spines de un tipo cambie, y esta predominancia pase a ser
de los del otro tipo. Esto no ha llegado a suceder en la anterior simulacin, as que para
observar este fenmeno realizaremos una simulacin esta vez con 10
6
iteraciones y con un
beta fijado en 0.5, ya que a mayor temperatura existe una mayor probabilidad de que suceda.
23


En efecto, hemos conseguido apreciar ahora este fenmeno. La predominancia ha cambiado,
aunque los valores de magnetizacin han estado siempre centrados en un valor y en su
opuesto. Gracias a esto ahora es fcil ver por qu se ha elegido realizar las medias sobre el
valor absoluto de la magnetizacin.

24

Resultados de la simulacin
Tal y como se haba indicado en otros apartados, para cada valor de beta se toman un cierto
nmero de medidas de energa y magnetizacin con el cual poder estimar su media y error, y
las magnitudes derivadas de calor especfico y susceptibilidad.
Para cada observable se ha realizado un anlisis independiente. Incluimos grficas para cada
uno de ellos en un intervalo de beta de [0.0,1.5], y otra con mayor resolucin y un intervalo
adaptado al entorno de beta crtica en aquellos que sea conveniente. A lo largo de este punto
utilizaremos los trminos energa y magnetizacin haciendo referencia a energa intensiva
media y magnetizacin intensiva media respectivamente.
Energa
Se puede apreciar en las grficas la gran similitud existente entre la energa media para todo
valor de L. Recordemos que la energa analizada se trata de la energa intensiva; en caso
contrario veramos que ira multiplicada por V y se apreciara enormemente esa diferencia en
las grficas.
Desde beta igual a 0 hasta el entorno de beta crtica, la energa se va reduciendo sin
observarse grandes diferencias entre las distintas simulaciones. Al llegar al entorno de beta
crtica, las diferencias se acentan, realizando un cambio ms brusco, y ligeramente ms tardo
cuanto mayor es L. Esto corresponde a un cambio de fase que paulatinamente se va
asemejando ms al modelo terico de L infinito, el cual se produce ms tarde cuanto mayor es
el tamao de la malla.
Para betas superiores a este intervalo, la pendiente de la grfica se va reduciendo hasta
estabilizarse en el valor final de <e>=-1 (O prcticamente ese valor, ya que recordemos que
para esos valores de beta existe una probabilidad baja pero no nula de que un tomo gire
espontneamente).

25


Error de la energa
En esta grfica destaca como el error se va reduciendo con L (salvo en el entorno de beta
crtico, que analizaremos en la seccin de calor especfico). Esto se explica mediante el
teorema del lmite central, ya que para el clculo de la energa media existen V variables
aleatorias independientes que se suman; y al hacer esta magnitud intensiva, la dispersin se
reduce a razn de 1/V. Cabe indicar que el nmero de medidas tomado en todas las
simulaciones ha sido 10000, con lo cual este no supone un factor diferencial entre los errores
de las distintas simulaciones.
Tambin se aprecia un claro mximo en estas grficas, que se va desplazando hacia la derecha
segn aumenta el valor de L. Este mximo coincide con el valor de beta crtica, en el que existe
una mayor dispersin entre los valores de energa.
Finalmente, para valores elevados de beta el error se reduce en gran medida, ya que en estos
casos casi todos los tomos apuntan hacia el mismo lado, existiendo una probabilidad muy
baja de que espontneamente uno cambie de orientacin.

26

Vamos a comprobar cmo, en efecto, el error se reduce con raz de V.
Tomaremos un valor cualquiera de beta alejado del entorno de beta crtica, ya que aqu existe
un comportamiento ligeramente distinto (que posteriormente explicaremos), y analizaremos
el error que le corresponde para cada L. Con estos valores realizaremos una grfica del error
con respecto a 1/L, y observaremos cmo la dependencia es lineal.

Concretamente, esta grfica se ha realizado para un valor de beta de 0.2.
Magnetizacin
Las grficas de la magnetizacin para cada L presentan una diferencia mucho ms clara que las
anteriormente vistas de energa. Ya para valores de beta cercanos a 0 difieren entre ellas, lo
suficiente como para poder discernir una grfica de otra. Esto es debido a que se toma como
observable <|m|>, y no <m>, y por tanto el valor central obtenido no es 0 ni lo sera aunque
realizramos un nmero mucho mayor de medidas. Pero conforme aumenta L, este valor se va
asemejando mucho ms a 0 ya que la magnetizacin extensiva para altas temperaturas se
obtiene mediante la suma de V nmeros +1 -1 al azar, y su suma se separar de la media con
. Al hacer esta magnitud intensiva (dividiendo entre V), vemos que en efecto <|m|> ser
proporcional a 1/. Al final de este apartado de magnetizacin se comprobar esto.
Pero donde se aprecia una mayor diferencia entre las grficas a medida aumenta L las grficas
es en el entorno de beta crtica. A mayor tamao, las grficas se van asemejando cada vez ms
al modelo terico de dimensin infinita, realizando un cambio de fase ms tardo y ms
brusco. Recordemos que para dicho modelo terico el valor de la magnetizacin es 0 hasta
beta crtica, y en ese punto se produce un cambio de comportamiento; una transicin de fase
de primer orden. Esto es, la funcin no es derivable en este punto, la derivada presenta una
discontinuidad.
Para betas ya superiores a estos valores se observa como todas las grficas tienden a
estabilizarse en <|m|>=1, es decir, todos los tomos se encuentran orientados hacia el mismo
lado, nos encontramos en una configuracin congelada.
0,00E+00
2,00E-04
4,00E-04
6,00E-04
8,00E-04
1,00E-03
1,20E-03
0 0,05 0,1 0,15
e
r
r
o
r

<
e
>

1/L
27



Por ltimo queda realizar la comprobacin de que, en la fase desordenada, para temperaturas
muy altas (betas bajos) el valor de la magnetizacin es proporcional a 1/. En efecto,
comprobemos que esta prediccin se cumple realizando una grfica de <|m|> con respecto a
1/L para un valor fijo de beta an en esta fase, como 0.38 y observando que tal y como
esperbamos, la dependencia es lineal.
28


Error de la magnetizacin
Para la siguiente grfica podemos realizar un anlisis similar al del caso del error de la energa,
aunque existen ciertos aspectos que difieren. De nuevo, el error salvo para betas en el entorno
de beta crtica es inversamente proporcional a (como ya hemos indicado, el anlisis para
los puntos de este entorno se realizar posteriormente).
Tambin se observa al igual que en el caso del error de la energa, los mximos se desplazan
hacia la derecha cuanto mayor es la dimensin, pero en este caso adems las grficas se
estrechan alrededor de ese mximo. Esto es consecuente con el hecho de que en la grafica de
magnetizacin existe un cambio ms rpido que el observado en la energa, lo que aumenta la
dispersin de los valores en esa regin de cambio.

Volvemos a tomar un valor de beta alejado del entorno de beta crtica y analizaremos el error
que le corresponde para cada L, para realizar una grfica del error con respecto a 1/L, y
observaremos cmo, tal y como era de esperar, de nuevo la dependencia es lineal. En este
caso hemos tomado los errores para beta=0.5.
0
0,1
0,2
0,3
0,4
0,5
0,6
0 0,02 0,04 0,06 0,08 0,1 0,12 0,14
<
|
m
|
>

1/L
29





Calor especfico
Comencemos con el anlisis de esta observable recordando su definicin, que no es otra que la
derivada de la energa con respecto a beta. Es decir, su valor no es otro que la pendiente de la
grfica de la energa, por lo que tomar valores ms altos segn mayor sea la variacin
existente en ese punto en la grfica de la energa. El punto en el que se produzca la mxima
variacin de energa ser donde esta grfica alcance su valor mximo, y precisamente ese
punto ser el beta crtico (de manera que cuando posteriormente determinemos el valor de
beta crtico, se realizar tomando el punto donde se encuentra el mximo en estas grficas).
Observamos que segn aumenta el tamao de la malla sobre la que se ha realizado la
simulacin, el valor del calor especfico en ese punto es ms alto, acercndose as a la grfica
terica para la malla de dimensin infinita en la que se produce una discontinuidad de salto
infinito (transicin de fase de primer orden). El hecho de que se alcancen valores mayores para
dimensiones mayores nos sugiere que el cambio en la energa es ms brusco cuanto mayor es
L, hecho que en efecto hemos comprobado anteriormente en el anlisis de esas grficas.
Por esta misma razn habamos indicado en el error de la energa que iba dividido entre raz de
V en todo beta salvo beta crtica y sus alrededores (ya que el error, salvo constantes, est
relacionado con el calor especfico mediante una raz). Lo mismo ocurra tambin en el caso
del error de la magnetizacin.
Otro aspecto que habamos comentado anteriormente en las grficas de la energa es que el
cambio brusco suceda progresivamente ms tarde segn aumentaba L. Esto tambin es
consecuente con el hecho de que el mximo de estas grficas (beta crtica) se alcance en un
beta mayor cuanto mayor es tambin la dimensin de L.

-1E-04
0,0001
0,0003
0,0005
0,0007
0,0009
0,0011
0,0013
0 0,02 0,04 0,06 0,08 0,1 0,12 0,14
e
r
r
o
r

<
|
m
|
>

1/L
30



Tras observar las grficas, atendiendo a dnde estn los mximos, ahora determinaremos
numricamente los valores de beta crtica para distintas L. Para poder distinguir mejor los dos
ltimos casos entre s se han realizado nuevas simulaciones con mayor nmero de medidas y
mayor resolucin.
L Beta crtica L Beta crtica
8 0,408 32 0,435
12 0,416 64 0,4380
16 0,426 128 0,4395
24 0,430

31

En efecto, como comprobamos en la siguiente grfica al aumentar el tamao de la malla, el
valor de beta crtico aparente tiende asintticamente hacia el valor terico de
1
2
ln(1 +2) =
0.44069

Susceptibilidad magntica
El anlisis realizado para esta grfica es similar al del calor especfico, pero en este caso existir
una diferencia mucho mayor en los valores mximos de la susceptibilidad para cada L, ya que
la diferencia entre las pendientes de la magnetizacin para cada tamao de malla era mucho
mayor que en el caso de la energa. Esto es claramente apreciable en la grfica, en la que se ve
cmo los valores mximos de susceptibilidad para L=128 y L=64 se disparan, dificultando la
apreciacin de las grficas del resto de mallas (por ello en la segunda representacin, la de
menor rango, no se han representado las susceptibilidades para esas dimensiones).

0,405
0,41
0,415
0,42
0,425
0,43
0,435
0,44
0,445
0 20 40 60 80 100 120 140
B
e
t
a

c
r

t
i
c
a

L
32


Se determinarn numricamente las betas crticas obtenidas para la susceptibilidad de la
misma manera que con el calor especfico, buscando el valor de beta donde la susceptibilidad
alcanza un valor mximo. Al ser obtenidas mediante observables diferentes, no tienen por qu
coincidir con las anteriores determinadas mediante el calor especfico.
L Beta crtica L Beta crtica
8 0,388 32 0,428
12 0,408 64 0,4345
16 0,414 128 0,4375
24 0,424

Volvemos a representar la beta crtica obtenida para cada dimensin frente a su lado L para
poder observar de nuevo una tendencia asinttica hacia el valor terico de
1
2
ln(1 +2) =
0.44069

0,38
0,39
0,4
0,41
0,42
0,43
0,44
0,45
0 20 40 60 80 100 120 140
B
e
t
a

c
r

t
i
c
a

L
33

Conclusin
En resumen podemos decir que gracias al mtodo de Montecarlo hemos podido estudiar un
sistema ferromagntico y sus transiciones de fase al desorden cuando nos acercamos a valores
de beta (temperatura) prximos a un cierto beta crtica.
A pesar de estar estudiando configuraciones que macroscpicamente parecen estables, hemos
visto que se producen cambios a nivel microscpico, que resultan ser muy bruscos cuando hay
un cambio de fase. Ha sido importante el estudio de la energa, ya que todos los spines tienden
a apuntar en la misma direccin para reducir la energa total del sistema para temperaturas
reducidas, realizando una transicin muy fuerte en las grficas en el entorno de beta crtica
desde la fase desordenada. Adems cabe resaltar que esto es lo que favorece la aparicin de la
magnetizacin en estas temperaturas, magnitud cuyo estudio tambin es muy importante ya
que fue precisamente la que motiv la creacin de este modelo.
Podemos decir que hemos conseguido conocer aproximadamente los estados microscpicos
de un ferromagneto dado un estado macroscpico.
Gran parte de los esfuerzos en la realizacin del trabajo han ido destinados a la optimizacin
de la simulacin para su viabilidad computacional. Idealmente se habra generado una
configuracin de tamao infinito y se habran realizado infinitas medidas sobre el mismo con
una resolucin igualmente infinita. Pero obviamente, esto no ha sido posible, y el reto ha
estado en determinar los valores adecuados para obtener una simulacin viable, fiable y con
una exactitud suficiente. De esta forma se han ido ajustando los parmetros de entrada segn
nuestros objetivos, para obtener los mejores resultados posibles.
Tambin se han observado las limitaciones de la simulacin por el hecho de contar con una
malla de dimensin finita, y hemos visto como los resultados se acercaban a los tericos
cuanto mayor era la dimensin. Se ha observado cmo la complejidad computacional
aumentaba con L
2
por lo que llegaba un punto en el que tomar mayores dimensiones no era
viable, ni tampoco habra aportado prcticamente informacin adicional para los objetivos del
trabajo.
Pero a pesar de estas limitaciones, se han conseguido simulaciones que consiguen imitar de
manera bastante fidedigna el modelo de Ising, obteniendo resultados aproximadamente
correctos sin requerir mayor potencia que la de un PC de potencia normal.

34

ANEXO I: Cdigo utilizado para la simulacin de Monte Carlo del modelo
de Ising
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LMAX 128 // Dimensin mxima del lado de la malla
#define VMAX LMAX*LMAX // Dimensin mxima de la malla.
#define MEDMAX 50000// Nmero mximo de medidas para cada beta.
#define MAXPASOSBETA 2000 // Nmero mximo de pasos que se pueden dar para recorrer
beta.
#define NormRANu (2.3283063671E-10F) // Parmetro para el generador random de Parisi-
Rapuano
unsigned int irr[256];
unsigned int ir1;
unsigned char ind_ran,ig1,ig2,ig3;
extern void ini_ran(int SEMILLA);
extern float Random(void);
void LeeInput (float *beta_inicial, float *beta_final, float *delta_beta, int*pasos_termalizacion,
int *n_medidas, int *pasos_montecarlo);
void GeneraConfiguracion (char *conf, int *L);
void InicializaOffset (int L, int *xp, int *yp, int *xm, int *ym);
void CalculaProb (float beta, double *prob);
void Sweep (char *conf, int L, int *xp, int *yp, int *xm, int *ym, double *prob);
void CalculaEM (char *conf, int L, float *e, float *m, int *xp, int *yp);
void ConstruirVectorMedidas (int indice, int N_medidas, float e, float m, float *medidas);
void CalculaValoresMedios(float *medidas, double *results, int N_medidas, int indice_beta,
float beta);
void EscribeValoresMedios(double *results, int indice_beta);
FILE *fout;
main()
{
char conf[VMAX]; // Vector de configuraciones. Es un char porque no requerimos del
espacio de memoria que nos ofrece int para representar slo valores de -1 y 1.
int L; // Dimensin L de la malla.
int pasos_termalizacion, N_medidas, pasos_montecarlo, N_pasos; // Nmero de iteraciones
mximo en diferentes bucles. Los tres primeros se leen de archivo en LeeInput, el ltimo se
calcula a partir de los beta tambin del mismo archivo.
int P_TER, N_MED, P_MON, indice_beta, sentido,i; // Contador, cada uno respectivo a los
35

valores mximos de la linea de arriba, salvo el contador sentido, cuyo mximo es 2 (hay 2
sentidos para recorrer beta)
int xp[LMAX], yp[LMAX], xm[LMAX], ym[LMAX]; //Offset
float beta, beta_inicial, beta_final, delta_beta; // Valor "actual" de beta. Los siguientes,
leidos de archivo en LeeInput, su valor mximo, su valor mnimo y el paso de uno a otro.
double prob[5]; // Vector de probabilidades, calculado en CalculaProb
float e,m; // Energa y magnetizacin, calculados de una configuracion dada en CalculaEM.
float medidas[MEDMAX*2]; //Vector donde se almacenan todos los datos de energa y
magnetizacin de un beta, sobre los cuales se calcularn errores.
double results[7*MAXPASOSBETA]; // Vector donde se almacenan las medias y errores de
todos los betas generados en la simulacin.
fout=fopen("datos.txt","wt"); // Abrimos el archivo en modo write para crear uno nuevo
eliminando el anterior. Creamos tambin la primera lnea.
fprintf(fout,"# Beta <e> error_e <|m|> error_m <e^2> <m^2>\n");
fclose(fout);
ini_ran(123456789*time(NULL));// Se inicializan los generadores random segn el reloj
interno del ordenador.
srand(987654321*time(NULL));
LeeInput(&beta_inicial, &beta_final, &delta_beta, &pasos_termalizacion, &N_medidas,
&pasos_montecarlo); // Leemos los datos recogidos en el input.
GeneraConfiguracion (conf, &L); // Generamos una configuracin de malla inicial desde la
que partir de la dimensin L que introduzca el usuario.
InicializaOffset (L,xp,yp,xm,ym); // Damos valor a los vectores del offset (xp, yp, xm, ym)
para podernos mover hacia arriba, abajo, izda o dcha en la malla.
N_pasos=(beta_final-beta_inicial)/delta_beta; // Calculamos el nmero de pasos necesario
para recorrer todo beta, valor que usaremos en un bucle posterior.
beta=beta_inicial; // Le damos a beta el valor inicial introducido por archivo.
fout=fopen("datos.txt","at"); // Abrimos archivo de output de datos en modo append. Se abre
antes del bucle para hacerlo una nica vez.
for (sentido=0; sentido<2; sentido++) // Recorremos sentido hacia delante y hacia atrs
(slo cuando simulamos histresis)
{
for (indice_beta=0; indice_beta<N_pasos; indice_beta++) // Realizamos tantos pasos
como deltas de beta haya hasta el mximo de beta.
{
CalculaProb(beta,prob);
for(P_TER=0; P_TER<pasos_termalizacion; P_TER++)
Sweep(conf,L,xp,yp,xm,ym,prob); // Termalizamos la malla para cada nuevo beta
for(N_MED=0; N_MED<N_medidas; N_MED++) // Tras termalizar, realizamos
N_medidas medidas para cada valor de beta.
36

{
if (beta==0)
for (i=0;i<L*L;i++) conf[i]=1-2*(rand()%2); // En el caso especial de beta=0 se
generan configuraciones random en lugar de utilizar el algoritmo de metropolis.
else
for(P_MON=0; P_MON<pasos_montecarlo; P_MON++)
Sweep(conf,L,xp,yp,xm,ym,prob); // Entre cada medida realizamos
pasos_montecarlo iteraciones de montecarlo
CalculaEM(conf, L, &e, &m, xp, yp); // Medimos la energa y la magnetizacin en
cada una de las N_medidas configuraciones que vamos obteniendo.
ConstruirVectorMedidas(N_MED, N_medidas, e, m, medidas); // Almacenamos las
medidas de e y m en el indice N_MED en los vectores medidas[N_MED] y medidas
[N_MED+N_medidas] respectivamente.
}
CalculaValoresMedios(medidas, results, N_medidas, indice_beta, beta);
EscribeValoresMedios(results, indice_beta);
beta+=delta_beta; // Incrementamos beta para empezar de nuevo el bucle con un
nuevo valor de beta.
}
delta_beta=-delta_beta; // Cambiamos el sentido de recorrido de beta tras haber llegado al
valor mximo introducido en el input, para ahora recorrer beta en el sentido contrario.
}
fclose (fout);
return (0);
}
float Random(void)
{
float r;
ig1=ind_ran-22;
ig2=ind_ran-55;
ig3=ind_ran-61;
irr[ind_ran]=irr[ig1]+irr[ig2];
ir1=(irr[ind_ran]^irr[ig3]);
ind_ran++;
r=ir1*NormRANu;
return r;
}
void ini_ran(int SEMILLA)
{
int INI,FACTOR,SUM,i;
37

srand(SEMILLA);
INI=SEMILLA;
FACTOR=67397;
SUM=7364893;
for (i=0;i<256;i++)
{
INI=(INI*FACTOR+SUM);
irr[i]=INI;
}
ind_ran=ig1=ig2=ig3=0;
}
void LeeInput (float *beta_inicial, float *beta_final, float *delta_beta,int*pasos_termalizacion,
int *N_medidas, int *pasos_montecarlo)
{
FILE *input;
input=fopen("input.txt","rt");
fscanf(input,"%f (beta inicial)%f (beta final)%f (delta beta)%d (pasos de termalizacion)%d
(numero de medidas)%d (pasos de monte carlo entre medidas)", beta_inicial, beta_final,
delta_beta, pasos_termalizacion, N_medidas, pasos_montecarlo);
fclose (input);
}
void GeneraConfiguracion (char *conf, int *L)
{
int i;
do // Se crea un bucle para evitar que el usuario introduzca una dimensin mayor a LMAX,
producira errores.
{
printf ("Introduce la dimension del lado L de la configuracion (MAX:%d)\n",LMAX);
scanf ("%d",L);
if (*L>LMAX||*L<0) printf("Eleccion no valida. L maxima=%d\n",LMAX);
} while (*L>LMAX||*L<0);

for (i=0;i<(*L)*(*L);i++)
conf[i]=1-2*(rand()%2); // Inicializamos la configuracion de manera random.
}
void InicializaOffset (int L, int *xp, int *yp, int *xm, int *ym)
{
int i;
for (i=0;i<(L-1);i++) // Definimos las direcciones positiva y negativa del retculo
{
xp[i]=1;
38

yp[i]=L;
xm[i+1]=-1;
ym[i+1]=-L;
}
xp[L-1]=-(L-1);
yp[L-1]=-L*(L-1);
xm[0]=(L-1);
ym[0]=L*(L-1);
}
void CalculaProb (float beta, double *prob)
{
prob[0]=exp(-beta*(-8.0));
prob[1]=exp(-beta*(-4.0));
prob[2]=exp(-beta*(0.0));
prob[3]=exp(-beta*4.0);
prob[4]=exp(-beta*8.0);
}
void Sweep (char *conf, int L, int *xp, int *yp, int *xm, int *ym, double *prob)
{
int x,y,n;
int indice_prob;
float porcentaje;

n=0;
for(y=0; y<L; y++)
for(x=0; x<L; x++)
{
indice_prob=conf[n]*(conf[n+xp[x]]+conf[n+xm[x]]+conf[n+yp[y]]+conf[n+ym[y]])/2+2;
if(Random()<prob[indice_prob])
conf[n]=-conf[n];
n++;
}
}
void CalculaEM (char *conf, int L, float *e, float *m, int *xp, int *yp)
{
int x,y,i;
*e=0.0;
*m=0.0;
i=0;
39

for (y=0; y<L; y++) // Clculo de energa
for (x=0;x<L;x++)
{
*e+=conf[i]*(conf[i+xp[x]]+conf[i+yp[y]]);
i++;
}
*e/=(-2*L*L); //La hacemos una cantidad intensiva
for (i=0; i<L*L; i++) // Clculo de magnetizacin
*m+=conf[i];
*m/=(L*L); //La hacemos una cantidad intensiva
}
void ConstruirVectorMedidas (int indice, int N_medidas, float e, float m, float *medidas)
{
medidas[indice]=e;
medidas[indice+N_medidas]=m;
}
void CalculaValoresMedios(float *medidas, double *results, int N_medidas, int indice_beta,
float beta)
{
/*Acerca del vector results:
results[7*indice_beta] es la beta actual.
results[1+7*indice_beta] es la energa media de esa beta.
results[2+7*indice_beta] es el error de la media de la energa.
results[3+7*indice_beta] es la magnetizacin (en mdulo) media de esa beta.
results[4+7*indice_beta] es el error de la media de la magnetizacin
results[5+7*indice_beta] es la media de los cuadrados de la energa.
results[6+7*indice_beta] es la media de los cuadrados de la magnetizacin*/

int i;
results[7*indice_beta]=beta;
for (i=1; i<7; i++) results[i+7*indice_beta]=0; // Inicializamos vector a 0, salvo el primer
ndice al que ya le hemos asignado el valor de beta.
for (i=0;i<N_medidas;i++)
{
results[1+7*indice_beta]+=medidas[i];
if (medidas[i+N_medidas]<0) medidas[i+N_medidas]=-medidas[i+N_medidas]; //
Calculamos |m|
results[3+7*indice_beta]+=medidas[i+N_medidas];
results[5+7*indice_beta]+=medidas[i]*medidas[i];
results[6+7*indice_beta]+=medidas[i+N_medidas]*medidas[i+N_medidas];
40

}
results[1+7*indice_beta]/=N_medidas; // Media e
results[3+7*indice_beta]/=N_medidas; // Media m
results[5+7*indice_beta]/=N_medidas; // Media de los cuadrados de e
results[6+7*indice_beta]/=N_medidas; // Media de los cuadrados de m
results[2+7*indice_beta]=results[5+7*indice_beta]-
results[1+7*indice_beta]*results[1+7*indice_beta]; // <e^2>-<e>^2
results[4+7*indice_beta]=results[6+7*indice_beta]-
results[3+7*indice_beta]*results[3+7*indice_beta]; // <|m|^2>-<|m|>^2
results[2+7*indice_beta]=sqrt(results[2+7*indice_beta]/(N_medidas-1)); // Error de la
media de e
results[4+7*indice_beta]=sqrt(results[4+7*indice_beta]/(N_medidas-1)); // Error de la
media de m
}
void EscribeValoresMedios(double *results, int indice_beta)
{
int i;
fprintf(fout,"%1.4lf ", results[7*indice_beta]); //Escribimos beta con 4 decimales.
printf("%1.4f ", results[7*indice_beta]);
for(i=1; i<7; i++)
{
fprintf(fout,"%1.8lf ", results[i+7*indice_beta]); // Escribimos el resto de parmetros con
8 decimales.
printf("%1.8lf ", results[i+7*indice_beta]);
}
fprintf(fout,"\n");
printf("\n");
}

41

ANEXO II: Cdigo utilizado para la simulacin con un valor fijo de beta
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define LMAX 128
#define VMAX LMAX*LMAX

#define RAN (rand()/((double)RAND_MAX+1))

void EscribeConfiguracion (char *conf, int L);
void EscribeConfiguracionArchivo (char *conf, int L);
void CalculaEM (char *conf, int L, float *e, float *m, int *xp, int *yp);
void Sweep (char *conf, int L, int *xp, int *yp, int *xm, int *ym, double *prob);
void GeneraConfiguracion (char *conf, int *dim);


main()
{
char conf[VMAX];
int i, L, pasos_termalizacion, pasos_medir, pasos_montecarlo;
int xp[LMAX], yp[LMAX], xm[LMAX], ym[LMAX];
float e, m, beta, beta_inicial, beta_final, delta_beta;
double prob[5];
FILE *fout;

srand(time(NULL)); // Se inicializa el generador random.

GeneraConfiguracion(conf,&L); // Se genera una configuracin random o leda de archivo

for (i=0;i<(L-1);i++) // Definimos las direcciones positiva y negativa del retculo
{
xp[i]=1;
yp[i]=L;
xm[i+1]=-1;
ym[i+1]=-L;
}
xp[L-1]=-(L-1);
yp[L-1]=-L*(L-1);
xm[0]=(L-1);
ym[0]=L*(L-1);

beta=0.6; // Damos un valor fijo a beta. Se cambia desde aqu segn se desee

42

prob[0]=exp(-beta*(-8.0)); // A partir de ese beta generamos el vector de probabilidades
prob[1]=exp(-beta*(-4.0));
prob[2]=exp(-beta*(-0.0));
prob[3]=exp(-beta*4.0);
prob[4]=exp(-beta*8.0);


CalculaEM(conf,L,&e,&m,xp,yp); // Se calcula y se escribe por pantalla la energa y
magnetizacin iniciales.
printf("\nEnergia inicial: %lf Magnetizacion inicial: %lf\n",e,m);

fout=fopen("EM_Iteraciones.txt","wt"); // Se abre el archivo donde se escribiran los valores
de energa y magnetizacin para cada iteracion.
fprintf(fout,"#i e m\n");

for(i=1;i<=100000;i++) // Se realizan tantas iteraciones como se deseen.
{
Sweep(conf,L,xp,yp,xm,ym,prob);
// EscribeConfiguracion (conf,L); // Saca por pantalla la configuracin actual. Resulta
interesante observar iteracin por iteracin cmo evoluciona un sistema.
CalculaEM(conf,L,&e,&m,xp,yp);
if (i%100==0) // Se ha aadido para escribir en el archivo cada 100 iteraciones. Tambin
se puede variar esto desde aqu.
fprintf(fout,"%d %11.8lf %11.8lf\n",i,e,m);

}


printf("\nEnergia final: %lf Magnetizacion final: %lf",e,m); // Escribimos por pantalla la
energa y magnetizacin finales.
EscribeConfiguracionArchivo(conf,L); // Escribimos la configuracin final en otro archivo.

fclose(fout);

return (0);
}

void Sweep (char *conf, int L, int *xp, int *yp, int *xm, int *ym, double *prob)
{
int x,y,n;
int indice_prob;
float porcentaje;
n=0;


43

for(y=0; y<L; y++)
for(x=0; x<L; x++)
{

indice_prob=conf[n]*(conf[n+xp[x]]+conf[n+xm[x]]+conf[n+yp[y]]+conf[n+ym[y]])/2+2;
if(RAN<prob[indice_prob])
conf[n]=-conf[n];
n++;
}
}


void EscribeConfiguracion (char *conf,int L) // Escribe por pantalla una configuracin dada de
dimensin L
{
int i,j;
printf("\n\nLa configuracion generada es la siguiente: \n\n");
for (i=0;i<L*L;i++)
{
printf("%d ",conf[i]);
if ((i+1)%L==0) printf ("\n");
}
}

void EscribeConfiguracionArchivo (char *conf, int L) //Escribe en el archivo zconf.txt una
configuracin dada de dimensin L
{
int i,j;
FILE *confout;
confout=fopen("zconf.txt","wt");

for (i=0;i<L*L;i++)
{
fprintf(confout,"%+d ",conf[i]);
if ((i+1)%L==0) fprintf(confout,"\n");
}
fclose(confout);
}

void CalculaEM (char *conf, int L, float *e, float *m, int *xp, int *yp)
{
int x,y,i;
*e=0.0;
*m=0.0;

44

i=0;
for (y=0; y<L; y++) // Clculo de energa
for (x=0;x<L;x++)
{
*e+=conf[i]*(conf[i+xp[x]]+conf[i+yp[y]]);
i++;
}
*e/=(-2*L*L);

for (i=0; i<L*L; i++) // Clculo de magnetizacin
*m+=conf[i];
*m/=(L*L);
}

void GeneraConfiguracion (char *conf, int *dim) // Genera una configuracin random o la lee
de archivo.
{
int eleccion,i,j;
char archivo [32];
FILE *input;

do //El usuario elige cmo generar la configuracin
{
printf ("Elige la configuracion para empezar la simulacion:\n\n[0]Configuracion
random\n[1]Leer configuracion de un archivo de texto\n");
scanf("%d",&eleccion);
if (eleccion>5||eleccion<0) printf ("Eleccion no valida\n\n");
} while (eleccion>5||eleccion<0);

do
{
printf ("\nIntroduce la dimension del lado L de la configuracion (MAX:%d)\n",LMAX);
scanf ("%d",dim);
if (*dim>LMAX||*dim<0) printf("Eleccion no valida\n");
} while (*dim>LMAX);

switch (eleccion)
{
case 0:
for (i=0;i<(*dim)*(*dim);i++) conf[i]=1-2*(rand()%2);
break;

case 1:
do{
printf("Introduce el nombre del archivo del que quieres leer los datos:\n");
45

scanf("%s",archivo);
input=fopen(archivo,"rt");
if (input==NULL) printf("\nEl archivo no ha podido abrirse. \n\n");
} while (input==NULL);

for (i=0;i<(*dim)*(*dim);i++) fscanf(input,"%d",conf+i);
fclose(input);
break;
}

}

Das könnte Ihnen auch gefallen