Sei sulla pagina 1di 55

UNIVERSITÀ DEGLI STUDI DI PAVIA

Facoltà di Scienze Matematiche Fisiche e Naturali

Corso di Laurea in Fisica

Esperimenti Monte Carlo con


il modello di Ising

Tesi per la laurea di


Barbara De Palma
Mat. 365993/70

Relatore
Prof. Marco Guagnelli

Anno Accademico 2010/11


2 0.0
Indice

Introduzione 1
1 Studio di osservabili termodinamiche 3
1.1 Basi statistiche della termodinamica . . . . . . . . . . . . . . . 3
1.2 Elementi di teoria degli ensemble . . . . . . . . . . . . . . . . 6
1.2.1 Ambiente di lavoro per un sistema classico . . . . . . . 6
1.2.2 Ensemble microcanonico . . . . . . . . . . . . . . . . . 10
1.2.3 Ensemble canonico . . . . . . . . . . . . . . . . . . . . 11
1.2.4 Funzione di partizione e densità degli stati . . . . . . . 14
1.3 Equivalenza nel limite termodinamico . . . . . . . . . . . . . . 16

2 Simulazioni Monte Carlo 17


2.1 Introduzione al metodo Monte Carlo . . . . . . . . . . . . . . 17
2.2 Algoritmo Metropolis . . . . . . . . . . . . . . . . . . . . . . . 19
2.3 Entropic Sampling . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4 Algoritmo Wang-Landau . . . . . . . . . . . . . . . . . . . . 22
2.5 Analisi degli errori . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.1 Autocorrelazione . . . . . . . . . . . . . . . . . . . . . 25
2.5.2 Binning . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Jackknife . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.4 Reweighting . . . . . . . . . . . . . . . . . . . . . . . . 27

3 Applicazioni 29
3.1 Modello di Ising . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Transizioni di fase . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.1 Simulazione del modello di Ising . . . . . . . . . . . . . 31

Bibliograa 50

3
4 0.0 INDICE
Introduzione

1
2 0.0 INDICE
Capitolo 1
Studio di osservabili
termodinamiche

1.1 Basi statistiche della termodinamica

Consideriamo un sistema sico composto da N particelle e racchiuso in un


volume V . Il numero di particelle con cui avremo a che fare sarà dell'ordine
del numero di Avogadro e per descrivere al meglio le grandezze macroscopiche
(e microscopiche) del sistema assumiamo che N → ∞ e V → ∞, cioè ci
poniamo nel cosiddetto limite termodinamico, in maniera tale che il rapporto
N/V rimanga sso. Con questa assunzione le grandezze estensive diventano
direttamente proporzionali alle dimensioni del sistema, rappresentate da V e
N , mentre le grandezze intensive ne risultano indipendenti.
L'energia totale del sistema, nel caso di particelle non interagenti, può essere
scritta come:
X
E= ni i
i

dove ni è il numero di particelle che hanno il valore di energia i e soddisfa


ovviamente l'equazione
X
N= ni .
i

In accordo con la meccanica quantistica abbiamo assunto discrete le energie


di singola particella in quanto il loro valore dipende fortemente dal volume
V in cui sono connate. Se, però, si considerano volumi sempre più grandi,
la spaziatura tra i dierenti valori diventa così piccola rispetto all'energia
totale del sistema che il parametro E può essere assunto come una variabile

3
4 1.1 Basi statistiche della termodinamica

continua.
La specicazione dei valori delle variabili N , V ed E denisce un macrosta-
to del sistema. Notiamo che ci sono molteplici possibilità di realizzare un
particolare macrostato come, per esempio, redistribuendo l'energia E totale
del sistema tra le particelle. Si realizzano, in questo modo, diverse con-
gurazioni del sistema, ognuno delle quali specica un microstato. Quindi
ad ogni macrostato corrisponde un gran numero di microstati e, preso un
qualunque istante di tempo t, il sistema può trovarsi in uno qualsiasi dei
microstati corrispondenti al particolare macrostato. Questa caratteristica è
nota come equiprobabilità a priori ed è assunta come postulato.
Dalle considerazioni fatte nora, si capisce che il numero di tutti i possi-
bili microstati dipenderà da N , V e E . Tale numero, che indichiamo con
Ω(N, V, E), è di fondamentale importanza in quanto, da esso, è possibile ri-
cavare tutta la termodinamica del sistema in esame. Viene realizzato, quindi,
un collegamente tra la statistica e la termodinamica del sistema.

Signicato sico di Ω. Consideriamo un sistema sico isolato, costituito


da due sottosistemi: A1 , il cui macrostato è descritto dalla terna (N1 , V1 , E1 ),
e A2 , il cui macrostato è denito dalla terna (N2 , V2 , E2 ). Per ogni sistema
il numero possibile di microstati sarà dato rispettivamente da Ω1 (N1 , V1 , E1 )
e da Ω(N2 , V2 , E2 ), la cui forma matematica dipende completamente dalla
natura del sistema. Vogliamo ricavare in che modo Ω1,2 è legato ad ogni
grandezza termodinamica. Poniamo i due sistemi in contatto termico, sepa-
rati da una parete rigida, in maniera tale che ci sia solo scambio di energia e
che non ci siano variazioni del numero di particelle e del volume dei singoli
sistemi. In questa situazione, le energie E1 ed E2 sono legate dalla relazione

E 0 = E1 + E2 = costante (1.1.1)

dove E 0 indica l'energia del sistema composto A0 = A1 + A2 , in cui sono


trascurabili gli eetti dell'interazione tra A1 e A2 . Per l'equiprobabilità a
priori, in qualsiasi momento il sistema Ai può trovarsi in un qualsiasi tra
i Ωi microstati (i = 0, 1, 2), indipendentemente dall'altro sistema. Questo
comporta che la dipendenza di Ω0 da Ω1,2 sia data da

Ω0 (E1 , E2 ) = Ω1 (E1 )Ω2 (E2 ) = Ω1 (E1 )Ω2 (E0 − E1 ) = Ω0 (E0 , E1 )

Per quale valore di E1 il sistema A0 è in equilibrio? Il sistema è in equilibrio


quando raggiunge il valore dell'energia che massimizza Ω0 (E0 , E1 ). Possiamo
capire tale aermazione pensando che ogni sistema sico tende naturalmente
allo stato di equilibrio con il sistema ambiente. E' quindi lecito aermare che,
col passare del tempo, cresce la probabilità di trovare il sistema nello stato di
Capitolo 1. Studio di osservabili termodinamiche 5

equilibrio; tradotto in termini di meccanica statistica, a causa dell'equiproba-


bilità a priori, per avere una probabilità maggiore è necessario che il sistema
sia descritto dal macrostato con il maggior numero di microstati. Indicando
con Ē1 , Ē2 il valore all'equilibrio di E2 , E1 rispettivamente, massimizziamo Ω
scrivendo
   
∂Ω1 (E1 ) ∂Ω2 (E2 ) ∂E2
Ω2 (Ē2 ) + Ω1 (Ē1 ) = 0.
∂E1 E1 =Ē1 ∂E2 E2 =Ē2 ∂E1

Dato che dalla (1.1.1) si ricava che ∂E2 /∂E1 = −1, possiamo scrivere
   
∂ ln Ω1 (E1 ) ∂ ln Ω2 (E2 )
= .
∂E1 E1 =Ē1 ∂E2 E2 =Ē2

Denendo il parametro β come


 
∂ ln Ω(N, V, E)
β≡ (1.1.2)
∂E N,V,E=Ē

la condizione di equilibrio tra i sistemi A1 , A2 si riduce all'equivalenza tra i


parametri β1 , β2 .
Abbiamo, quindi, trovato che quando due sistemi sici sono in contatto ter-
mico e scambiano energia tra di essi, questo scambio avviene no a che non
vengono raggiunti i valori di equilibrio Ē1 , Ē2 delle variabili E1 , E2 . Una
volta che tale valore è raggiunto, non avviene più uno scambio di energia
netto, ma si è in uno stato di mutuo equilibrio. Seguendo il ragionamento
che abbiamo svolto nora, ciò avviene solo quando β1 = β2 . Ci si aspetta
quindi che β sia in qualche modo legato alla temperatura termodinamica T
del sistema. Per ricavare tale relazione, ricordiamo la formula termodinamica
 
∂S 1
= , (1.1.3)
∂E N,V T

dove S è l'entropia del sistema in questione. Confrontando la (1.1.2) con la


(1.1.3), si ottiene
∆S 1
= = costante, (1.1.4)
∆(ln Ω) βT
esiste, quindi, una relazione tra la quantità termodinamica S e la quantità
statistica Ω. Questa corrispondenza venne notata per primo da Boltzmann
che evidenziò, inoltre, il fatto che, dato che la relazione tra l'approccio ter-
modinamico e quello statistico sembra essere di carattere fondamentale, la
6 1.2 Elementi di teoria degli ensemble

costante che appare nella (1.1.4) deve essere una costante universale. Fu poi
Planck a scrivere per primo la relazione esplicita

S = k ln Ω, (1.1.5)

senza alcuna costante additiva S0 . L'equazione (1.1.5) determina il valore


assoluto dell'entropia di un dato sistema sico in termini del numero totale di
microstati ad esso accesibili, in conformità al dato macrostato, e rappresenta
un ponte tra il macroscopico e il microscopico, tra statistca e termodinamica,
ed è per questo di fondamentale importanza. Notiamo, inne, che dalle
(1.1.4), (1.1.5), possiamo scrivere
1
β=
kT
dove k è una costante universale, la costante di Boltzmann.

1.2 Elementi di teoria degli ensemble

Consideriamo un sistema descritto dal macrostato (N, V, E). Preso un qual-


siasi istante t, sappiamo che il sistema può trovarsi in un qualsiasi microstato
che realizza il macrostato dato. Col passare del tempo, il sistema continua
a cambiare microstato, con il risultato che, oltre un ragionevole intervallo di
tempo, ciò che si osserva è un comportamento mediato su tutti i microstati
attraverso cui è passato il sistema. Potrebbe, quindi, avere senso conside-
rare, ad un certo istante di tempo, un numero piuttosto grande di sistemi
(che potremmo assumere come copie mentali del sistema dato) caratterizzati
dallo stesso macrostato, come l'originale, ma corrispondenti a microstati di-
versi. Ci aspettiamo, allora, in circostanze ordinarie, che il comportamento
medio di ogni sistema in questa collezione, che chiamiamo ensemble, sia iden-
tico con il comportamento medio (nel tempo) del sistema dato. È in questa
prospettiva che procederemo a sviluppare la teoria degli ensemble.

1.2.1 Ambiente di lavoro per un sistema classico

Per un sistema classico, l'ambiente di lavoro più appropriato per lo sviluppo


del formalismo degli ensemble è lo spazio delle fasi.
Il microstato di un dato sistema classico, in qualsiasi istante di tempo t,
può essere denito specicando la posizione istantanea e il momento lineare
istantaneo di tutte le particelle costituenti il sistema. Quindi, per un sistema
di N particelle, per specicare un microstato sono necessarie 3N coordinate
posizionali q1 , q2 , ..., q3N e 3N coordinate dei momenti lineari p1 , p2 , ..., p3N .
Capitolo 1. Studio di osservabili termodinamiche 7

Il set di coordinate (qi , pi ) è un punto dello spazio delle fasi 6N dimensionale


ed è un punto rappresentativo del sistema dato.
Le coordinate qi , pi sono funzione del tempo e rispettano le equazioni del
moto di Hamilton
∂H(qi , pi )

q̇i =
 , i = 1,2,...,3N
∂pi (1.2.1)
ṗi = − ∂H(qi , pi ) , i = 1,2,...,3N

∂qi
dove H(qi , pi ) è l'hamiltoniana del sistema. Al passare del tempo, il punto
rappresentativo nello spazio delle fasi denisce una treaiettoria, la cui di-
rezione è determinata, istante per istante, dal vettore velocità v ≡ (q̇i , ṗi ).
Dato che generalmente si ha a che fare con sistemi di volume nito, tale
condizione limita i valori delle coordinate qi , mentre la condizione di energia
nita limita i valori sia di qi , sia di pi , attraverso l'Hamiltoniana del sistema.
Questo signica che la traiettoria descritta dal punto rappresentativo è con-
nata in una regione dello spazio delle fasi. In particolare, se è noto il valore
preciso dell'energia del sistema, la traiettoria corrispondente sarà ristretta
all'ipersupercie

H(qi , pi ) = E
dello spazio delle fasi; se, invece, il valore dell'energia appartenesse all' in-
tervallo (E − ∆/2, E + ∆/2), la traiettoria corrispondente sarebbe ristretta
all'iperguscio denito da questi limiti.
Se adesso consideriamo un ensemble di sistemi, la gura corrispondente nello
spazio delle fasi sarebbe quella di uno sciame di punti rappresentativi, ognu-
no per ogni membro dell'ensemble, tutti giacenti entro la regione permessa
dello spazio delle fasi. Al passare del tempo, ogni punto evolve secono la
propria equazione del moto, descrivendo quindi una propria traiettoria. La
situazione complessiva di questo movimento possiede notevoli caratteristiche
che possono essere descritte in termini della funzione densità ρ(q, p; t): il
numero di punti rappresentativi nell'unità di volume (d3N q, d3N p) attorno al
punto (q, p) dello spazio delle fasi è dato dal prodotto ρ(q, p; t)d3N qd3N p. La
funzione densità degli stati rappresenta quindi il modo in cui i membri del-
l'ensemble sono distribuiti su tutti i possibili microstati in dierenti istanti
di tempo.
La media sugli ensemble di una quantità sica f (q, p), che in generale po-
trebbe variare fra microstati dierenti, è da
R
f (q, p)ρ(q, p; t)d3N qd3N p
hf i = R (1.2.2)
ρ(q, p; t)d3N qd3N p
8 1.2 Elementi di teoria degli ensemble

dove l'integrale è esteso all'intero spazio delle fasi, ma solo i punti in cui ρ 6= 0
contribuiscono all'integrale. Bisogna notare che, la media sugli ensemble hf i
potrebbe essere funzione del tempo.
Un ensemble si dice stazionario se, per ogni t, rispetta la condizione

∂ρ
= 0. (1.2.3)
∂t
È chiaro che, per tale ensemble, la media sugli ensemble hf i di qualsiasi
quantità sica f (q, p) sarà indipendente dal tempo. Quindi, un ensemble
stazionario è adatto a descrivere un sistema in equilibrio.

Teorema di Liouville
Consideriamo un volume arbitrario w nella regione rilevante dello spazio
delle fasi (cioè, in cui ρ 6= 0) e denotiamo con σ la supercie che racchiude
tale volume. Per conoscere come varia il numero di punti che attraversa la
supercie nell'unità di tempo, basta calcolare
Z

ρ dw, (1.2.4)
∂t w

dove dw ≡ (d3N qd3N p). Tuttavia, il tasso netto con cui i punti rappresentativi
escono da w è data da Z
ρ(v · n̂) dσ; (1.2.5)
σ

dove v è il vettore velocità dei punti rappresentativi nella regione di elemento


di supercie dσ , mentre n̂ è il versore normale a dσ . Dal teorema della
divergenza, la (1.2.5) può essere scritta
Z
div(ρv) dw; (1.2.6)
w

dove
3N  
X ∂ ∂
div(ρv) ≡ (ρq̇i ) + (ρṗi ) . (1.2.7)
i=1
∂q i ∂p i

Dato che nello spazio delle fasi non ci sono nè pozzi nè sorgenti, il numero
totale dei punti rappresentativi deve rimanere costante, e quindi, dalla (1.2.4)
e dalla (1.2.6) si ottiene
Z  
∂ρ
+ div(ρv) dw = 0. (1.2.8)
w ∂t
Capitolo 1. Studio di osservabili termodinamiche 9

Condizione necessaria e suciente anchè l'integrale (1.2.8) si annulli per


ogni w arbitrario è che l'integrando sia ovunque nullo, cioè
∂ρ
+ div(ρv) = 0 (1.2.9)
∂t
Questa è l'equazione di continuità locale per lo sciame di punti rappresenta-
tivi. Dalle (1.2.7) e (1.2.9) si ottiene
3N   3N  
∂ρ X ∂ρ ∂ρ X ∂ q̇i ∂ ṗi
+ (q̇i ) + (ṗi ) + ρ (q̇i ) + (ṗi ) = 0. (1.2.10)
∂t i=1
∂q i ∂p i i=1
∂q i ∂p i

dove il terzo termine si annulla se si sostituisce (1.2.1). L'equazione,allora,


diventa
dρ ∂ρ
= + [ρ, H] = 0. (1.2.11)
dt ∂t
La (1.2.11) è il cosiddetto teorema di Liouville, secondo il quale la densità
locale dei punti rappresentativi, vista da un osservatore in moto con un punto
rappresentativo, rimane costante nel tempo.
Bisogna, però, fare una distinzione tra (1.2.11) e (1.2.3). Mentre la prima
deriva dalla meccanica di base delle particelle ed è quindi del tutto generale,
la seconda è solo un requisito per l'equilibrio che, in ogni caso, può essere
soddisfatto oppure no. La condizione che assicura la validità simultanea delle
due equazioni è
3N  
X ∂ρ ∂ρ
[ρ, H] = q̇i + ṗi = 0. (1.2.12)
i=1
∂q i ∂p i

Ci sono due modi possibili per soddisfare la (1.2.12). Il primo è assumere


ρ indipendente dalle coordinate (q, p) (e indipendente in forma esplicita dal
tempo), cioè
ρ(q, p) = costante
in tutta la regione rilevante dello spazio delle fasi. Fisicamente, tale scelta
corrisponde a un ensemble di sistemi distribuiti uniformemente su tutti i
possibili microstati. La media sugli ensemble si riduce quindi a
Z
1
hf i = f (q, p) dw;
w w
dove w denota il volume della regione rilevante dello spazio delle fasi. Tale
scelta porta alla denizione dell'ensemble microcanonico.
Il secondo modo (più generale) è quello di assumere che la dipendenza di ρ
da (q, p) ci sia solo attraverso la dipendenza esplicita dell'hamiltoniana, cioè
ρ(q, p) = ρ[H(q, p)];
10 1.2 Elementi di teoria degli ensemble

e tale equazione denisce una classe di funzioni densità per le quali il cor-
rispondente ensemble è stazionario. In particolare, la scelta più naturale è
considerare
ρ(q, p) ∝ exp[−H(q, p)/kT ].
L'ensemble così denito è chiamato ensemble canonico.

1.2.2 Ensemble microcanonico

Nell'enesmble microcanonico il macrostato di un sitema è denito da un


ssato numero di molecole, N , un volume ssato, V , e un'energia E che può
variare nell' intervallo (E − ∆/2; E + ∆/2). Da quest'ultima, abbiamo che i
punti rappresentativi dell'ensemble sono connati nell'iperguscio denito da

(E − ∆/2) ≤ H(q, p) ≤ (E + ∆/2).

Abbiamo detto che l'ensemble microcanonico è una collezione di sistemi per


i quali la funzione densità ρ è data da
(
ρ(q, p) = costante se (E − ∆/2) ≤ H(q, p) ≤ (E + ∆/2)
0, altrove

Quindi, il valore di aspettazione del numero di punti rappresentativi gia-


centi in un volume elementare dw dell'iperguscio sopra denito è semplice-
mente proporzionale a dw. In altre parole, la probabilità a priori di trovare il
punto rappresentativo in un dato volume elementare dw è la stessa di trova-
re un punto rappresentativo in un volume elementare equivalente, disposto
ovunque nell'iperguscio. In termini statistici, ciò implica che ogni membro
dell'ensemble ha la stessa probabilità di trovarsi in uno qualsiasi dei possibili
microstati. In questi termini, la media sugli ensemble acquisisce il signicato
sico comune. Vediamo perchè.
Fino a che studiamo ensemble stazionari, la media sugli ensemble di una
qualsiasi quantità sica f sarà indipendente dal tempo t; quindi, preso un
tempo medio, da ciò non si avrà alcun nuovo risultato.

hf i ≡ la media sugli ensemble di f


= la media temporale di f.
I processi di media temporale e media sugli ensemble sono indipendenti fra
loro, quindi, cambiando l'ordine non si causerà alcun cambiamento nella valu-
tazione di hf i. La media temporale di ogni quantità sica, presa su un lungo
intervallo di tempo, deve essere la stessa per ogni membro dell'ensemble, in
Capitolo 1. Studio di osservabili termodinamiche 11

quanto stiamo considerando solo copie mentali del sistema dato. Possiamo
scrivere, di conseguenza

hf i = media di f presa su un lungo intervallo di tempo


dove il secondo termine è valido per ogni membro dell'ensemble. Inoltre, la
media temporale su un lungo intervallo di tempo di una quantità sica è tutto
ciò che si ottiene facendo delle misure di questa quantità sica; possiamo,
quindi identicarla con il valore di aspettazione che si otterrebbe attraverso
la sperimentazione,

hf i = fasp .
Questo discorso ci conduce ad una importante conclusione: la media sugli
ensemble di una quantità sica f è identica al valore di aspettazione ottenuto
con appropriate misurazioni sul sistema dato.
Come ultima cosa, deniamo la connessione tra meccanica dell'ensemble mi-
crocanonico e la termodinamica dei sistemi membri. Questa discende dalla
corrispondenza tra i microstati del dato sistema e i punti localizzati nello spa-
zio delle fasi. Il volume w nella regione accessibile dello spazio delle fasi è una
diretta misura della molteplicità Γ dei microstati accessibili al sistema. Per
avere una corrispondenza numerica tra w e Γ, dobbiamo conoscere il volume
fondamentale w0 che può essere visto come l'equivalente a un microstato.
Quindi
w
Γ= (1.2.13)
w0
e la termodinamica può essere ricavata in maniera analoga a (1.1.5)
w
S = k ln Γ = k ln . (1.2.14)
w0

1.2.3 Ensemble canonico

Nell'ensemble microcanonico la determinazione del numero di microstati di-


stinti del sistema è un problema matematico non banale. Inoltre, da un
punto di vista sico, è dicile misurare l'energia interna totale di un sistema
e tenerla sotto stretto controllo. Un'alternativa può essere quella di lasciar
variare l'energia nell'intervallo [0, ∞) e considerare, invece, la temperatura T
ponendo, per esempio,il sistema a contatto termico con una riserva di calore.
Tale riserva deve avere capacità quasi innita in modo che, a prescindere
dallo scambio di energia tra sistema e riserva, la temperatura possa essere
12 1.2 Elementi di teoria degli ensemble

mantenuta costante. Ora, se la riserva di calore consiste in un numero inni-


tamente grande di copie mentali del sistema considerato, otteniamo ancora
un ensemble i cui membri sono caratterizzati da macrostati deniti tramite
la terna (N, V, T ) e si parla, in questo caso, di ensemble canonico.
Abbiamo detto che in quest'ultimo l'energia può variare tra zero e innito.
Ma qual'è la probabilità Pr che un dato sistema dell'ensemble si trovi, ad
ogni t, ad avere energia Er ? Ci sono due modi per ricavare la dipendenza di
Pr da Er :

1. si considera il sistema in equilibrio con una riserva di calore di capacità


innita e si studia la statistica dello scambio energetico;

2. si trattano i sistemi come elementi (particelle) di un ensemble micro-


canonico che si scambiano una certa energia totale;

Equilibrio tra sistema e riserva di calore Considero un dato sistema


A, immerso in una riserva di calore A . Deniamo il sistema composto come
0

A0 ≡ A+A0 di energia E 0 = Er +Er0 = costante. Inizialmente le energie di A


e A0 possono essere comprese tra 0 e E 0 . Quando i due sistemi avranno rag-
giunto l'equilibrio avranno una temperatura comune T , mentre le rispettive
energie potrebbero essere variabili. Dato che la riserva di calore è supposta
essere molto più grande del sistema dato, Er è una frazione molto piccola di
E0
Er0
 
Er
= 1 − 0  1. (1.2.15)
E0 E
Avendo specicato lo stato di A, (Er ), A0 può trovarsi in un qualunque stato
tra i numerosi stati compatibili con il valore Er0 . Indichiamo questo nume-
ro con Ω0 (Er0 ) e evidenziamo che questo dipende dalla natura della riserva,
ma tale dipendenza non inuenzerà il risultato nale. Dato che tutti i pos-
sibili stati hanno la stessa probabilità di vericarsi, la probabilità Pr sarà
direttamente proporzionale a Ω0 (Er0 ),

Pr ∝ Ω0 (Er0 ) ≡ Ω0 (E 0 − Er ). (1.2.16)
Per la (1.2.15),si può espandere Pr , ma, per ragioni di convergenza è preferi-
bile espandere il logaritmo di Pr
 0
∂Ω
0 0 0 0
ln Ω (Er ) = ln Ω (E ) + (E 0 − E 0 ) + ... ' cost − β 0 Er . (1.2.17)
∂E 0 E 0 =E 0 r

dove abbiamo fatto uso della (1.1.2). All'equilibrio β 0 = β = 1/kT . Dalla


(1.2.16) e dalla (1.2.17) otteniamo il risultato
Capitolo 1. Studio di osservabili termodinamiche 13

Pr ∝ exp(−βEr ),
e, normalizzando questa equazione si ottiene

exp(−βEr )
Pr = P (1.2.18)
r exp(−βEr )

dove la somma è estesa a tutti gli stati accessibili del sistema A. Notiamo
che la (1.2.18) non mostra alcuna dipendenza dalla natura sica di A0 .

Un sistema nell'ensemble canonico Considero un ensemble di N siste-


mi identici che condividono l'energia E . Indichiamo con Er , r = 1, 2, ... gli
autovalori dell'energia del sistema, e con nr , r = 1, 2, ... il numero dei sistemi
che, per ogni t, hanno energia Er . I vincoli di questo ensemble sono
(P
nr = N
Pr (1.2.19)
r nr Er = E = N U

dove U è l'energia media per sistema. Ogni set {nr } che soddisfa (1.2.19)
rappresenta una maniera possibile di distribuire l'energia E tra gli N sistemi.
Dato che ogni maniera può essere realizzata in modi dierenti, possiamo
eettuare un rimescolamento tra questi membri dell'ensemble con energie
diverse e ottenere così uno stato dell'ensemble che è diverso dall'originale.
Indichiamo con W {nr } il numero di modi possibili per fare questo. Abbiamo

N
W {nr } =
n0 !n1 !n2 !...
Dato che tutti i possibili stati dell'ensemble sono equiprobabili, la frequenza
con cui un set {nr } si realizzerà è proporzionale a W {nr } e, quindi, il modo
di distribuzione più probabile {n∗r } sarà quello che massimizza W {nr }.
Possiamo anche prendere in considerazione tutti i modi possibili di distribu-
zione e calcolarne il valore di aspettazione, pesando sui W {nr }
P0
{n } nr W {nr }
hnr i = P0 r
{nr } W {nr }

dove la somma primata è estesa su tutte le distribuzioni che rispettano le


condizioni di vincolo (1.2.19).
{n∗r } hnr i
Ci si aspetta che e , in quanto analoghi a Pr , coincidano nel limite
N N
di N → ∞ e siano identici a Pr già trovato.
14 1.2 Elementi di teoria degli ensemble

Con il metodo del valore più probabile, in cui si massimizza W {nr } utiliz-
zando il metodo dei moltiplicatori di Lagrange, si arriva alla soluzione

n∗r exp(−βEr )
=P
N r exp(−βEr )

dove β è un moltiplicatore di Lagrange, soluzione dell'equazione


P ∗ P
r nr E r E r Er exp(−βEr )
= =U = P .
N N r exp(−βEr )

Sfruttando il collegamento tra statistica e termodinamica si dimostra che il


moltiplicatore di Lagrande β coincide con β = 1/kT .
Con il metodo del valore medio, in cui si ricava hnr i con il metodo di Darwin-
Fowler, si arriva al risultato

hnr i exp(−βEr )
=P
N r exp(−βEr )

che è la distribuzione di Boltzmann (canonica). Anche in questo caso si


dimostra che il parametro β coincide con 1/kT .
Abbiamo, quindi, dimostrato la coincidenza tra (1.2.3) e (1.2.3) e che la
dipendenza di Pr dall'energia è data dalla (1.2.18).

1.2.4 Funzione di partizione e densità degli stati

Deniamo la funzione di partizione, nell'ensemble canonico, come


X
Z(V, T ) = exp(−Er /kT ) (1.2.20)
r

Nota la funzione di partizione di un sistema, possiamo ricavarne tutta la


termodinamica partendo dalla relazione seguente

A(N, V, T ) = −kT ln Z(V, T ); (1.2.21)

dove A(N, V, T ) è l'energia libera di Helmholtz. La dipendenza di Z da N


e V risulta dagli autovalori dell'energia Er . Inoltre, dato che A(N, V, T ) è
una quantità estensiva del sistema, anche ln Z(V, T ) deve essere estensiva.
Se adesso ci concentriamo sull'entropia, si osserva che
X
S = −k Pr ln Pr . (1.2.22)
r
Capitolo 1. Studio di osservabili termodinamiche 15

Questa relazione mostra che l'entropia di un sistema sico è completamente e


unicamente determinata dal valore della propabilità Pr del sistema di essere
in uno degli stati accessibili. Se ci riportiamo nel caso dell'ensemble micro-
canonico, avremmo un gruppo di Ω stati, che hanno la stessa probabilità di
vericarsi; il valore di Pr è, quindi, 1/Ω per ognuno di questi stati e zero per
gli altri. Di conseguenza la (1.2.22)
Ω   
X 1 1
S = −k ln = k ln Ω
r=1
Ω Ω

che è precisamente il risultato (1.1.5) che avevamo ottenuto nell'ensemble


microcanonico.
In molte situazioni siche, i livelli accessibili del sistema sono degeneri, cioè
si ha un gruppo di stati, di numero gi tutti appartenenti allo stesso livello di
energia Ei . In questi casi è più utile esprimere la (1.2.20) come
X
Z(V, T ) = gi exp(−βEi ). (1.2.23)
i

La probabilità che un sistema abbia energia Ei viene riscritta come


gi (E) exp(−βEi )
Pi = P . (1.2.24)
i gi (E) exp(−βEi )

Se i livelli sono molto ravvicinati tra loro, tanto da poter essere considerati
continui, allora la (1.2.24) diventa
g(E) exp(−βE)dE
P (E)dE = ,
Z
dove Z ∞
Z= exp(−βE)g(E)dE. (1.2.25)
0
Presa, allora, una qualunque grandezza sica f , possiamo calcolare la media
sugli ensemble come
R∞
X f (Ei )g(Ei )e−βEi 0R
f (E)g(E)e−βE dE
hf i ≡ f i Pi = P −βEi
→ ∞ −βE
i i g(Ei )e 0
e g(E)dE

Con β > 0, g(e) coincide con l'antitrasformata di Laplace di Z(β)

Z β 0 +i∞ Z +∞
1 1 0 00 )E
g(E) = dβe βE
Z(β) = dβe(β +iβ Z(β 0 + iβ 00 ),
2πi β 0 −i∞ 2π −∞

dove β è trattata come variabile complessa, β = β 0 + iβ 00


16 1.3 Equivalenza nel limite termodinamico

1.3 Equivalenza nel limite termodinamico

Nell'ensemble microcanonico l'energia è ristretta ad un range molto sottile,


mentre in quello canonico un sistema può avere energia compresa tra zero e
innito. Esaminiamo, nell'ensemble canonico, che probabilità ha l'energia di
discostarsi dal valore medio:
P
r Er exp(−βEr )
U ≡ hEi = P
r exp(−βEr )
P 2 P 2
∂U r Er exp(−βEr ) r Er exp(−βEr )
|E ,V = − P + P
∂β r r r exp(−βEr ) r exp(−βEr ) (1.3.1)
= −hE 2 i + hEi2 ≡ −h(∆E)2 i
da cui segue

∂U ∂U
h(∆E)2 i = hE 2 i − hEi2 = = kT 2 = kT 2 CV
∂β ∂T
Nell'ultima relazione abbiamo ottenuto il calore specico a volume costante,
perchè la derivata parziale in (1.3.1) è stata eseguita tenendo Er costante.
La uttuazione quadratica media è quindi

h(∆E)2 i
 
1
=O √ (1.3.2)
hEi N
per l'estensività di CV e U . Nel limite in cui N → ∞ il rapporto in (1.3.2)
è trascurabile a tutti gli eetti e quindi un sistema dell'ensemble canonico
ha sempre energia pari all'energia media U ; tale situazione è praticamente
identica a quella dell'ensemble microcanonico. È evidente, quindi, che, nel
limite termodinamico si ha l'equivalenza tra i due ensemble.
Capitolo 2
Simulazioni Monte Carlo
La sica computazionale è una branca della sica che utilizza la potenza di
calcolo dei computer per studiare il comportamento dei sistemi sici. La sua
importanza risiede nel fatto che, nello studio di un particolare sistema sico,
la risoluzione analitica delle equazioni che descrivono lo stato del sistema
non è sempre accessibile e spesso richiede strumenti matematici avanzati.
La simulazione al computer permette, innanzitutto, una notevole agevola-
zione nei calcoli, fornendo la possibilità di ottenere risultati quantitativi di
grandezze signicative per il sistema e, inoltre, consente la visualizzazione e
l'esame dettagliato di processi sici che potrebbero non essere accessibili spe-
rimentalmente, contribuendo notevolmente allo sviluppo del modello teorico
associato.
In questo lavoro verranno trattate tecniche di simulazione Monte Carlo (MC)
applicate nell'ambito della Meccanica Statistica.

2.1 Introduzione al metodo Monte Carlo

Supponiamo di voler studiare un sistema sico nell'ambito del formalismo


dell'ensemble canonico. Supponiamo che tale sistema sia descritto dal ma-
crostato (N, V, T ). Indichiamo con q un particolare microstato (o congura-
zione) e con A(q) un'osservabile termodinamica, funzione del microstato. La
media all'equilibrio termodinamico di A(q) è data da
1X
hAi = exp[−βH(q)] (2.1.1)
Z q

dove Z è la funzione di partizione che riscriviamo come


X
Z= exp[−βH(q)]
q

17
18 2.1 Introduzione al metodo Monte Carlo

mentre H(q) è l'hamiltoniana del sistema. Osserviamo che, per calcolare le


grandezze termodinamiche rappresentative del nostro sistema, è necessario
conoscere la funzione di partizione.
Decidiamo di simulare il nostro sistema sico attraverso il metodo Monte
Carlo (MC). Tale metodo utilizza numeri pseudocasuali per estrarre un cam-
pione rappresentativo di microstati {q} con una distribuzione di probabilità
all'equilibrio data da
exp(−βH(q))
Peq (q) = . (2.1.2)
Z
In pratica, anzichè scegliere casualmente le congurazioni (campionando tut-
to lo spazio delle fasi) per poi pesarle con il fattore di Boltzmann, scegliamo
congurazioni con una probabilità exp(−Eβ) e la pesiamo uniformemente
[3]. In questo modo, la media termodinamica di una grandezza sica A(q)
può essere calcolate usando semplicemente la
M
1 X
hAiM = A(qj ). (2.1.3)
M j=1

dove M è il numero di congurazioni estratte. Questo modo di operare viene


chiamato metodo importance sampling ed è più vantaggioso dal punto di vi-
sta computazionale rispetto ai campionamenti normali, in quanto rende più
eciente la selezione dei microstati.
Ma come possiamo estrarre i microstati q con una distribuzione di probabi-
lità (2.1.1)? L'algoritmo da seguire è molto semplice.
Consideriamo, al tempo t = 0, un microstato iniziale q con una distribuzione
di probabilità P (q, 0). Facciamo evolvere q operando una piccola modica
del sistema, per esempio, facendo lo spin-ip di un unico spin nel caso di
un sistema di spin. Indicando con f la funzione ttizia che rappresenta l'e-
voluzione (updating) del microstato: applicando f a q si ottiene la nuova
congurazione q 0 e applicando nuovamente f a q 0 otteniamo la congura-
zione q 00 . Iterando questo procedimento si racava una catena di microstati
q, q 0 , q 00 , ..., q n , detta catena di Markov.
La probabilità di transizione Wf (q → q 0 ) è la probabilità che il microstato q
evolva a q 0 applicando f . Essa ha le seguenti proprietà
0
R Wf0 (q → q ) ≥
0
0,
dq Wf (q → q ) = 1
dove la seconda relazione esprime l'equiprobabilità a priori: ogni microstato
dell'ensemble di equilibrio ha la stessa probabilità di essere estratto rispetto
agli altri microstati.
Capitolo 2. Simulazioni Monte Carlo 19

Se W (q 0 → q) obbedisce alla condizione di bilancio dettagliato


X X
Peq (q 0 )W (q 0 → q) = Peq (q)W (q → q 0 )
q0 q

che esprime sostanzialmente la reversibilità del processo di evoluzione, e la


f è ergodica (ovvero è possibile raggiungere ogni microstato dell'ensemble
di equilibrio applicandola a qualsiasi microstato iniziale in un numero nito
di passi), allora la distribuzione di probabilità del sistema approssimerà, per
t → ∞, la distribuzione di probabilità all' equilibrio:

lim P (q, t) = Peq (q)


t→∞

In pratica questa condizione è usualmente implementata utilizzando la con-


dizione di bilancio dettagliato, equivalente alla relazione

Wf (q → q 0 ) Peq (q 0 ) 0

0
= = e(E(q)−E(q ))/kT (2.1.4)
Wf (q → q) Peq (q)

Dalla (2.1.1) si nota che la valutazione di Peq (q) richiede di sommare su


tutte le congurazioni del sistema per determinare la funzione di partizione,
mentre, dalla (2.1.3), si nota che il rapporto Peq (q)/Peq (q 0 ) dipende solo dalla
dierenza di energia ∆E = E(q 0 )−E(q). Inoltre, le probabilità di transizione
sono legate dalla relazione

W (q → q 0 ) = exp(−β∆E)W (q 0 → q).

Ciò garantisce che la sequenza di microstati generati da questo processo sto-


castico di importance sampling, è equivalente al set che si otterrebbe dall'e-
strazione casuale tra i microstati dell'ensemble di equilibrio.
Dalla scelta di W (q → q 0 ), che in pratica rappresenta la probabilità con cui
accettare la congurazione q 0 , si distinguono diversi algoritmi. Ci concentria-
mo in particolare sull'algoritmo di Metropolis, in cui
(
W (q → q 0 ) = 1 ∆E ≤ 0,
0
(2.1.5)
W (q → q ) = exp(−β∆E) ∆E > 0.

2.2 Algoritmo Metropolis

L'algoritmo Metropolis è denito dai seguenti passi:


20 2.3 Algoritmo Metropolis

1. Per prima cosa, bisogna inizializzare il sistema scegliendo un microsta-


to q(0) di partenza dal set di tutti i microstati del modello. Può essere
di aiuto se q(0) è tipico dei microstati nell'ensemble di equilibrio, in
quanto ciò riduce il numero di passi necessari anché il sistema rag-
giunga l'equilibrio. Per esempio, un liquido in uno stato di disordine
potrebbe non essere il migliore punto di partenza per una simulazione
di un solido cristallino.

2. Si eettua un cambiamento casuale del microstato di partenza ottenen-


do un nuovo microstato, identico al primo, ad eccezione di un piccolo
particolare, per esempio per un diverso valore di spin (azione locale).

3. Si valuta il cambiamento in energia del nuovo microstato confrontan-


dolo con il precedente, valutando ∆E = Eq0 − Eq .

4. Se ∆E ≤ 0, il microstato viene accettato e si passa direttamente al


punto 8.

5. Se ∆E > 0, si pone w = exp(−β∆E).

6. Attraverso il generatori di numeri pseudocasuali si genera un valore r


all'interno dell'intervallo aperto [0.0, 1.0).

7. Se r ≤ w, il nuovo microstato viene accettato; altrimenti viene mante-


nuto il microstato precedente. I punti (1)-(7) costicono un passo Monte
Carlo e vengono eseguiti una volta per ogni particella o spin del sistema,
sceglindo casualmente il microstato iniziale per assicurare la condizione
di bilancio dettagliato.

8. Si ripetono M passi MC per portare il sistema all'equilibrio (proces-


so di termalizzazione). Successivamente si ripetono M 0 scansioni MC
tenendo nota stavolta di tutte le osservabili termodinamiche di cui si
vuole conoscere la misura, cioè {A(q)}, e si procede con il calcolo dei
loro valor medi tramite la (2.1.2).
Capitolo 2. Simulazioni Monte Carlo 21

2.3 Entropic Sampling

La maggior parte degli algoritmi è basato sull'importance sampling in cui


la scelta della probabilità di transizione W (q → q 0 ) determina il modo con
cui si scelgono le congurazioni che descrivono il sistema. L'algoritmo di
Metropolis, in cui tale scelta viene fatta secondo la (??), si rivela in generale
ecacie per calcolare le medie di osservabili secondo la (??), ma può risultare
fallimentare nel riprodurre tutte le possibili distribuzioni di equilibrio della
funzione di partizione se esiste una barriera tra di esse (come, per esempio,
nelle transizioni di fase del primo ordine). Entropic Sampling è un algoritmo
Monte Carlo con cui è possibile ottenere qualsiasi distribuzione delle grandez-
ze desiderate con una simulazione MC e di cui l'importance sampling risulta
essere un caso particolare[2].
L'idea principale sta nel campionare l'entropia di un dato sistema a tempera-
tura innita. Per questo tipo di lavoro, ci poniamo nello spazio delle energie,
ma il metodo non è vincolato da tale scelta. In questo contesto la funzione
di partizione deve essere riscritta come:
X X X
Z(β) = exp[−βE(q)] = g(E) exp(−βE) = exp[S(E) − βE],
q E E

dove g(E) è la densità degli stati e S(E) è l'entropia per una data E . Nel caso
dell'importance sampling, abbiamo visto che, per ottenere la distribuzione di
Boltzmann P (q) ∝ exp[−βE] o P (q) ∝ exp[S(E)−βE] è suciente imporre,
oltre all'ergodicità, la condizione di bilancio dettagliato (2.1.3). Inceve, nel
caso dell'Entropic sampling, dato che ci si pone nel limite di temperatura
innita, Z(β = 0) = q 1 = E exp S(E) e, per ottenere una distribuzione
P P
arbitraria del tipo
P (q) ∝ exp[A(E)] = exp[S(E) − J(E)] (2.3.1)
basterebbe imporre, oltre all'ergodicità, una condizione simile a quella di
bilancio dettagliato
Wf (q → q 0 )
0
= exp −[J(E(q 0 )) − J(E(q))] (2.3.2)
Wf (q → q)
Le equazioni 2.3.1, 2.3.2 sono le equazioni principali su cui è basato l'algo-
ritmo e l'importance sampling ne è un caso particolare con J(E) = βE .
Per valutare l'entropia del sistema è necessario avere una stima piuttosto
rozza di S(E) prima di intraprendere la simulazione MC. Questa può essere
ricavata abbastanza facilmente con un metodo autoiterativo da sistemi di
piccole dimensioni, senza alcuna informazione circa il modello, iterando in
questo modo:
22 2.4 Algoritmo Wang-Landau

1. Si seleziona una congurazione iniziale casualmente e si inizializza J(E) =


S(E) = 0 per ogni E .

2. Si ottiene l'istogramma H(E) dell'energia per una breve scansione MC.


Si accetta la distribuzione in accordo con 2.3.2.

3. La nuova stima di S(E) è data da


(
J(E), se H(E) = 0
S(E) = (2.3.3)
J(E) + ln H(E), altrove

Questi tre passi deniscono un'iterazione dell'algoritmo. Con la nuova stima


di J(E) = S(E), si ripete l'iterazione no a che non si raggiunge il range
desiderato di energia. Può essere utile aumuntare il numero di scansioni MC
in modo da coprire un range di energie sucientemente grande. Dato che
l'entropia diminuisce con il volume, S(E) stimata per un sistema di una certa
dimensione può essere considerata come stima rozza di S(E) per un sistema
più grande.
Questo algoritmo ha portato notevoli vantaggi nel calcolo di variabili termo-
dinamiche che no a quel momento non erano accessibili con gli algoritmi
precedenti. Tuttavia, questo algoritmo non è molto eciente dal punto di
vista computazionale. L'algoritmo che stiamo per descrivere nasce proprio
dalla necessità di migliorare l'Entropic Sampling

2.4 Algoritmo Wang-Landau

Descriviamo, ora, un algoritmo che utilizza un random walk nello spazio delle
energie per ottenere una stima molto accurata della densità degli stati,[4],[5].
L'idea di base di questo algoritmo è la seguente: se mi muovo casualmente
nello spazio delle energie, con step che implicano una minima modica dell'e-
nergia del sistema, come per esempio può essere lo spin-ip di un sistema di
spin, e se la probabilità di accedere ad un dato livello di energia E è propor-
zionale al reciproco della densità degli stati, 1/g(E), allora l'istogramma per
la distribuzione di energia H(E) che ne si ricava sarà piatto. Ciò è ottenuto
tramite la modica della stima della densità degli stati in un modo siste-
matico per produrre un istogramma piatto su tutto l'intervallo dell'energia
considerato.
Deniamo i punti principali di questo algoritmo.
Capitolo 2. Simulazioni Monte Carlo 23

1. All'inizio della simulazione, la densità degli stati è a priori sconosciu-


ta. Per ricavarla si utilizza un processo auto-iterativo, cioè si ssa un
valore iniziale con cui si comincia la simulazione e poi, attraverso la
simulazione stessa si tenta di far convergere la densità degli stati al
valore vero. Quindi, per prima cosa, poniamo g(E) = 1 per tutte le
energie possibili E .
2. A questo punto cominciamo il processo di campionamento casuale (ran-
dom walk) nello spazio delle energie (nel caso specico del modello di
Ising, ciò signica fare lo spin-ip di uno spin) ricordando che ogni livel-
lo ha probabilità proporzionale a 1/g(E) di essere visitato. In generale,
se E1 e E2 sono le energie prima e dopo uno spin ip, la probabilità di
transizione dal livello di energia E1 a E2 è:
 
g(E1 )
p(E1 → Es ) = min ,1 . (2.4.1)
g(E2 )

3. Ogni volta in cui un livello di energia è visitato, modichiamo l'esi-


stente densità degli stati tramite un fattore di modica f 1, impo-
nendo g(E) → g(E) ∗ f . In realtà si utilizza la formula più pratica
ln[g(E)] → ln[g(E)] + ln f . Se nel processo di campionamento viene ri-
utata una transizione ad un altro livello energetico e si rimane quindi
al livello precedente, allora modichiamo la densità degli stati esisten-
te con lo stesso fattore f . Come fattore iniziale è una buona scelta
prendere f = f0 = e ' 2, 71828..., perchè ci permette di raggiungere
tutti i possibili livelli di energia molto velocemente anche per sistemi di
grandi dimensioni. Scelte di f0 troppo piccoli porta il processo di cam-
pionamento a spendere troppo tempo per raggiungere tutte le energie
possibili, mentre scelte di f0 troppo grande conduce a errori statistici
molto grandi.
4. Durante il processo di campionamento, calcoliamo l'istogramma H(E)
(ovvero quante volte viene visitato il livello di energia E ) nello spa-
zio delle energie. Quando l'istogramma si appiattisce, sappiamo che la
densità degli stati converge al valore vero con un accuratezza propor-
zionale a ln f . La funzione dell'istogramma è quella di darci un criterio
(la piattezza) per passare al livello energetico successivo.

5. A questo punto, riduciamo f utilizzando la funzione fi+1 = fi , az-
zeriamo l'istogramma, e cominciamo il livello successivo di campiona-
mento casuale durante il quale modichiamo la densità degli stati con il
nuovo fi+1 . Continuiamo così no a che l'istogramma non si appiattisce
nuovamente e, quindi, riduciamo ulteriormente f .
24 2.4 Algoritmo Wang-Landau

6. Terminiamo il processo quando f è più piccolo di un valore predenito.

Alla ne della simulazione,in realtà, quella che otteniamo è solo la densità
relativa, in quanto la densità degli stati può essere modicata ogni volta che
viene visitato un livello di energia. Per ricavare la densità degli stati assoluto
bisogna rinormalizzare la densità degli stati relativa con il numero del livello
fondamentale (per esempio, nel modello di Ising ci sono due stati fondamen-
tali, corrispondenti alla congurazione di spin in su e spin in giù). Il fattore
di modica f svolge un ruolo di fondamentale importante durante lo svolgi-
mento del processo. Infatti, questo ha la funzione di parametro di controllo
sull'accuratezza della densità degli stati e, inoltre denisce il numero di passi
MC necessari a terminare l'intera simulazione. In realtà, l'accuratezza della
densità degli stati non dipende solo da ff inal ma anche da altri fattori, co-
me la complessità e le dimensioni del sistema, il criterio di generazione degli
istogrammi e altri dettagli di implementazione dell'algoritmo. Abbiamo det-
to che l'accuratezza della densità degli stati è proporzionale a ln f : bisogna
fare in modo che il valore ln ff inal non diventi troppo piccola, altrimenti la
dierenza tra ln[g 0 (E)] modicata e ln[g(E)] esistente non sarà apprezzabile
con la precisione dei numeri double utilizzata. Se ciò accade, l'algoritmo non
convergerà, e il programma potrebbe continuare a girare per sempre. Anche
se ff inal è entro il range ma è troppo piccolo, il calcolo potrebbe metterci
troppo tempo per nire. Bisogna specicare che la scelta di come ridurre il
fattore di modica non è unica: infatti, ogni funzione che decresce in manie-
ra monotona a 1 può essere utilizzata. Una semplice ma eciente formula è
1/n
fi+1 = fi , dove n 1. Il valore di n può essere scelto in base al tempo della
CPU disponibile e all'accuratezza aspettata della simulazione. Con la scelta
n = 2 si raggiunge il nostro scopo: la convergenza della densità degli stati al
suo valore vero.
Il metodo può essere ulteriormente migliorato e reso più eciente eseguendo
processi di campionamento multipli, ognuno per un dierente range di ener-
gia, sequenzialmente oppure simultaneamente. I risultanti pezzi della densità
degli stati possono essere uniti e utilizzati per produrre medie canoniche per
il calcolo di quantità termodinamche a qualsiasi temperatura.
Va tenuto conto che durante il processo di campionamento nello spazio dell'e-
nergie, l'algoritmo non soddisfa esattamente la condizione di bilancio detta-
gliato, dato che la densità degli stati è costantemente modicata. Comunque,
la densità degli stati converge molto velocemnte al suo valore vero non ap-
pena f si avvicina a 1. Se p(E1 → E2 ) è la probabilità di transizione di
passare dal livello di energia E1 al livello E2 , il rapporto tra le probabilità di
Capitolo 2. Simulazioni Monte Carlo 25

transizione nei due sensi può essere facilmente calcolata come:

p(E1 → E2 ) g(E1 )
= (2.4.2)
p(E2 → E1 ) g(E2 )

In altre parole, il nostro algoritmo soddisfa la condizione di bilancio detta-


gliato:
1 1
p(E1 → E2 ) = p(E2 → E1 ) (2.4.3)
g(E1 ) g(E2 )
dove 1/g(E1 ) è la probabilità al livello di energia E1 è p(E1 → E2 ). Conclu-
diamo dicendo che la condizione di bilancio dettagliato è soddisfata con un
accuratezza proporzionale a ln f .
La scelta dello spazio delle energie come spazio di lavoro è giusticata dal
fatto che il numero totale dei livelli di energia possibili cresce linearmente
con le dimensioni del sistema, mentre il numero totale delle congurazioni
cresce esponenzialmente con le dimensioni del sistema. È chiaro che diventa
molto più semplice eseguire un processo di campionamento nello spazio delle
energie, anzichè nello spazio delle congurazioni.

2.5 Analisi degli errori

Abbiamo visto che l'importance sampling è un metodo eciace per campio-


nare lo spazio delle fasi. Se supponiamo che le congurazioni estratte siano
statisticamente indipendenti tra loro, allora ci aspetteremmo√ che l'errore as-
sociato alle variabili calcolate nella simulazione sia δ ∝ 1/ NM C dove NM C
è il numero di passi Monte Carlo. Ciò è conseguenza del teorema centrale
del limite. Tuttavia, il metodo di importance sampling rende le congura-
zioni estratte correlate tra loro (si parla, infatti, di autocorrelazione) e, in
particolare, attorno al punto critico la correlazione coinvolge l'intero siste-
ma estratto. É quindi necessario stimare nuovamente l'errore tenendo conto
della non indipendenza delle congurazioni estratte.

2.5.1 Autocorrelazione

Indichiamo con Xi la misura di qualche quantità X dalla congurazione


i = 1, 2, ..., N , con N numero passi MC. L'errore associato a X è
sP
− hXi)2
i (Xi
δX = (2.5.1)
N (N − 1)
26 2.5 Analisi degli errori

se e solo se le Xi sono statisticamente indipendenti.


In caso di misure statisticamente dipendenti deniamo la funzione di auto-
correlazione della quantità X :
1 PN −t 2
i=1 Xi Xi+t − hXi
C(t) = N − t (2.5.2)
hX 2 i − hXi2
dove t è la distanza tra due congurazioni estratte.Il denominatore ser-
ve per normalizzare C(0) = 1. Una quantità importante è il tempo di
autocorrelazione integrata τint

1 X
τint = + C(t) (2.5.3)
2 t=1

Questa grandezza ci permette, infatti, di calcolare l'errore nel caso di gran-


dezze correlate attraverso la formula
√ p
δX = 2τint δX ∼ τint /N (2.5.4)

dove δX è calcolato con 2.5.1.


Un'altra grandezza che esprime la correlazione tra due variabili è la lunghezza
di correlazione ξ che indica la distanza minima tra due congurazioni stati-
sticamente indipendenti tra loro. Il tempo di autocorrelazione, in funzione
di questa grandezza si comporta come

τ ∼ ξz (2.5.5)

dove z è un esponente dinamico che dipende dal tipo di update eseguito dal-
l'algoritmo.

Riprenderemo successivamente questo concetto.

2.5.2 Binning

Un metodo per rendere le congurazioni indipendenti tra loro è il processo


di binning.
Consideriamo il sistema Xi precendentemente considerato. Dividiamo il set
delle N congurazioni in N/2 gruppi, ognuno contenente due termini, presi
in ordine, cioè [X1 , X2 , X3 , X4 ..] senza ripetizioni. A questo punto calcolia-
mo la media di ogni coppia: otteniamo così un set di N/2 congurazioni
X10 , X20 , ...XN/2
0
. Iterando questo processo rendiamo le misure sempre più in-
dipendenti tra loro. Ma a che livello del processo di binning si ottengono
Capitolo 2. Simulazioni Monte Carlo 27

congurazioni statisticamente indipendenti? Una regola empirica dice che


all'ottavo livello di binning si raggiunge tale condizione, e, calcolando la de-
viazione standard ad ogni livello di binning si osserverà che il suo valore
tenderà a un valore più o meno costante oltre l'ottavo livello. Mostreremo
nelle applicazioni questo fenomeno.

2.5.3 Jackknife

È un metodo ingegnoso per calcolare la deviazione standard di grandezze


derivate Il metodo Jackknife è un procedimento sistematico che serve per ot-
tenere la deviazione standard di un set di misure stocastiche. Immaginiamo,
nuovamente, di aver eseguito N simulazioni MC e di aver ottenuto un set di
valori Xi , i = 1, ..., N , per l'osservabile X , che supponiamo possa dipendere
da una o più variabili casuali. Per calcolare la deviazione standard asso-
ciata a hXi, anzichè rifarci alla classica propagazione degli errori, possiamo
procedere come segue:

1. Calcoliamo il valor medio X̄ .

2. Dividiamo i dati in M blocchi, la cui lunghezza sia maggiore del tempo


di correlazione τ . Si opera questa scelta per liberarsi delle autocor-
relazioni tra i dati di partenza. Se le variabili non sono correlate, la
lunghezza del blocco può essere presa uguale a uno.

3. Per ogni m = 1, ..., M , eliminiamo lm-esimo valore Xm e calcoliamo la


media X̄(m) utilizzando tutti gli altri valori.

4. Si stima l'errore associato a X calcolando la deviazione standard di X̄m


da X̄ v
u
uM − 1 X M
δX = t (X̄m − barX)2 (2.5.6)
M m=1

2.5.4 Reweighting

Reweighting è un metodo che permette di espandere i risultati dalla simula-


zione originale, eseguiti a un certo β , a un altro β 0 sucientemente vicino al
primo, senza eseguire nessuna simulazione aggiuntiva. La forma più sempli-
ce è basata sul fatto che la probabilità canonica di una cogurazione q a un
certo β , pβ (q) può essere facilmente collegata a un'altra distribuzione con un
diverso β 0 , cioè

pβ 0 (q) ∝ exp(−β 0 Eq ) = C exp[−(β 0 − β)Eq ]pβ (q) (2.5.7)


28 2.5 Analisi degli errori

dove C è una costante di proporzionalità, dipendente da β e β 0 e che rimarrà


indeterminata. Il valore di aspettazione di O(q) alla temperatura β 0 può
essere scritto come
1 X
hOiβ 0 = O(q)pβ 0 (q)
Zβ 0 q
C X
= O(q) exp[−(β 0 − β)Eq ]pβ (q) (2.5.8)
Zβ q
0


= ChO exp[−(β 0 − β)E]iβ
Zβ 0

Per ottenere il rapporto tra le funzioni di partizione possiamo porre O = 1,


il che implica
Zβ 0
= Chexp[−(β 0 − β)E]iβ (2.5.9)

Il risultato nale è quindi

hO exp[−(β 0 − β)E]iβ
hOiβ 0 = (2.5.10)
hexp[−(β 0 − β)E]iβ

Ciò signica che il valore di aspettazione di qualunque osservabile a qualsiasi


temperatura β 0 può essere ottenute in funzione del valore di aspettazione
valutato a β . Con un'unica simulazione grazie alla 2.5.10 potremmo ottenere
risultati a qualsiasi valore della temperatura. In realtà la situazione non è
così semplice a causa del numero nito delle statistiche che si ottengono in
una simulazione.
Capitolo 3
Applicazioni
I metodi di simulazione introdotti precedentemente sono molto utili nello
studio di sistemi sici in cui si verichino fenomeni di transizione di fase.Da
migliorare: Questo perchè la simulazione numerica ha il vantaggio di non
risentire direttamente dei limiti sici del sistema, ma piuttosto risente della
dicoltà di implementazione del sistema stesso. Il concetto è che di base qual-
siasi sistema può essere studiato numericamente e sotto qualsiasi condizio-
ni, basta saperle implementare nell'eventuale algoritmo; mentre per studiare
analiticamente un sistema c'è sempre la necessità di ricondursi a situazioni
limite, a causa della complessità del sistema.

3.1 Modello di Ising

Uno dei fenomeni più interessanti nella sica dello stato solido è il ferroma-
gnetismo. In alcuni metalli, come il ferro e il nichel, una frazione nita di
spin degli atomi si polarizza spontaneamente in una certa direzione, dando
luogo ad un campo magnetico macroscopico [1]. Questo capita solo quando
la temperatura è al di sotto di un certo valore, noto come temperatura di
Curie Tc . Sopra tale valore gli spn sono orientati casualmente, senza produrre
alcun campo magnetico. Appena si è nell'intorno della temperatura di Curie,
il calore specico del metallo diverge e questo signica che la transizione di
fase è del secondo ordine. Il modello di Ising è un tentativo approssimativo
di simulare la struttura di un materiale ferromagnetico. La sua importanza
risiede nel fatto che il modello di Ising bidimensionale è l'unico esempio non
banale di una transizione di fase che può essere risolta con rigore matematico.
In questo modello il sistema considerato è un vettore di N punti ssi chiamati
siti reticolari che formano un reticolo n-dimensionale periodico (n = 1, 2, 3).
La struttura geometrica del reticolo può essere, per esempio, cubica o esago-

29
30 3.2 Transizioni di fase

nale. Ad ogni sito reticolare è associata una variabile di spin si (i = 1, ..., N )


che può assumere il valore +1 o −1. Se si = +1, −1, l'i-esimimo sito ha, ri-
spettivamente, spin up e spin down (avendo scelto per esempio l'asse z come
asse di riferimento). Un dato set di numeri {si } specica una congurazione
dell'intero sistema. L'energia nella congurazione specicata è denita da:
X N
X
EI {si } = − si sj − H si (3.1.1)
hi,ji i=1

dove:
• gli indici i, j sono interi che etichettano i siti di un reticolo;
• hi, ji signica somma su i e j primi vicini;
•  è l'energia di interazione, se  > 0 gli spin primi vicini tendono
ad allinearsi (ferromagnetismo), la congurazione è energeticamente
favorita;
• H è un eventuale campo magnetico esterno;
In questo lavoro ci siamo concentrati su un sistema di Ising in assenza
di campo magnetico, H = 0, studiandone il comportamento attorno alla
temperatura di Curie, ovvero durante la transizione di fase.

3.2 Transizioni di fase

La maggior parte delle transizioni di fase possono essere descritti da un para-


metro di ordine. Matematicamente, questo è zero in una fase, di solito nella
fase di disordine, ed è diverso da zero nell'altra, nella fase di ordine. Nor-
malmene, le transizioni si classicano in transizioni del primo e del seconod
ordine. Il nome deriva dall'ordine di derivazione dell'energia libera necessaria
per osservare il comportamento discontinuo. Nel caso di derivata di ordine
zero abbiamo che l'energia libera è sempre continua; al primo ordine di deri-
vata il parametro d'ordine ha una discontinuità di tipo salto (calore latente);
al secondo ordine, sono presenti delle divergenze.
Il modello di Ising presenta una transizione di fase del secondo ordine il
cui comportamento è descritto da degli esponenti critici. Riportiamo i più
importanti
Magnetizzazione


 M ∼ |T − Tc |β
χ ∼ |T − T |−γ Suscettività magnetica

M c
(3.2.1)


 C V ∼ |T − Tc |
−α
Calore specico
ξ ∼ |T − Tc |−ν Lunghezza di correlazione

Capitolo 3. Applicazioni 31

Per il modello di Ising in due dimensioni gli esponenti critici sono noti e han-
no i valori: α = 0, β = 0.125, γ = 1.75, ν = 1.

3.2.1 Simulazione del modello di Ising

Per la simulazione del modello di Ising bidimensionale abbiamo implementato


gli algoritmi Metropolis, HeatBath, Entropic e Wang-Landau in C++. In
tutti e quattro i metodi, la prima operazione che si esegue è il riempimento
del reticolo quadrato con i valori di spin. Per minimizzare gli eetti derivanti
dal volume nito considerato introduciamo condizioni periodiche al contorno.
Gli algoritmi Metropolis e HeatBath si rivelano ecaci per il calcolo di quelle
grandezze termodinamiche che dipendono localmente dalle variabili di spin,
come per esempio l'energia
X
EI {si } = − si sj (3.2.2)
hi,ji

e la magnetizzazione
* N +
X
MI = si , (3.2.3)
i=1

mentre risultano del tutto inecaci nel calcolo di grandezze che non sono
esprimibili come somma sui primi vicini, come l'entropia e la densità degli
stati. Secondo questo criterio, la funzione di partizione, è calcolabile con
questi due algoritmi ma risulta inapplicabile a livello computazionale.
L'Entropic Sampling e il Wang-Landau sono stati pensati proprio per risol-
vere questo problema.
Per descrivere completamente le caratteristiche termodinamiche del modello
di Ising ci siamo concentrati sulla simulazione tramite l'algoritmo di Metro-
polis e di Wang-Landau.

Simulazione con Metropolis


Analizziamo i risultati ottenuti dalla simulazioni di diverse grandezze siche
del sistema, in particolare energia, magnetizzazione, calore specico e ma-
gnetizzazione.
Il codice per il calcolo dell'energia è stata implementata seguendo la (3.2.2).
Riportiamone il graco
32 3.2 Transizioni di fase

1.5

1.0

0.5

Β
0.3 0.4 0.5 0.6 0.7

Figura 3.1: Energia in funzione di β ottenuto dalla simulazione con algoritmo di


Metropolis per diversi valori di L: rosso L = 8, verde L = 16, blu L =
20, nero L = 24. Gli errori sperimentali, stimati con il procedimento
di binning, sono più piccoli delle dimensioni del punto rappresentativo.

La magnetizzazione è stata calcolata tramite la 3.2.3. Ne riportiamo il


graco.
Capitolo 3. Applicazioni 33

M
1.0

0.8

0.6

0.4

0.2

Β
0.3 0.4 0.5 0.6 0.7

Figura 3.2: Magnetizzazione in funzione di β ottenuto dalla simulazione con algo-


ritmo Metropolis per diversi valori di L: rosso L = 8, verde L = 16,
blu L = 20, nero L = 24. Gli errori sperimentali, stimati con il
procedimento di binning, sono più piccoli delle dimensioni del punto
rappresentativo.

Per il calcolo del calore specico, ci siamo rifatti alla relazione

∂U (β)
C(β) = = β 2 (hEi2β − hE 2 iβ ). (3.2.4)
∂β

I risultati sono riportati nel graco seguente:


34 3.2 Transizioni di fase

Cv

1.5

1.0

0.5

Β
0.3 0.4 0.5 0.6 0.7

Figura 3.3: Calore specico in funzione di β ottenuto dalla simulazione con algo-
ritmo Metropolis per diversi valori di L: rosso L = 8, verde L = 16,
blu L = 20, nero L = 24. Gli errori sperimentali sono stimati con il
procedimento di binning.

La suscettività magnetica è stata ricavata dalla relazione seguente:

χ(β) = β(hM 2 i − hM i2 ) (3.2.5)

I risultati sono riportati nel graco seguente:


Capitolo 3. Applicazioni 35

12

10

Β
0.3 0.4 0.5 0.6 0.7

Figura 3.4: Suscettività magnetica in funzione di β ottenuto dalla simulazione


con algoritmo Metropolis per diversi valori di L: rosso L = 8, verde
L = 16, blu L = 20, nero L = 24. Gli errori sperimentali sono stimati
con il procedimento di binning.

Gli errori di tutte le grandezze appena descritte sono state stimate con
il procedimento di binning. Tale scelta è motivata dal fatto che attorno
alla temperatura critica la lunghezza di correlazione diverge, come si vede
dall'ultima delle 3.2.1. Dalla relazione 2.5.5 si può osservare che anche il
tempo di autocorrelazione τ diverge. Si capisce quindi che l'errore stimato
con la deviazione standard risulta essere sottostimato, in quanto la corre-
lazione coinvolge tutti i punti del reticolo. A tale proposito, riportiamo il
graco seguente, da cui si ricava che l'errore stimato con il procedimento di
binning è circa 3.5 volte più grande di quello stimato normalmente. Questo
signica che la correlazione nelle simulazioni che utilizzano algoritmi Monte
Carlo non può essere trascurata.
36 3.2 Transizioni di fase

0.1
cvp1binning44.dat
cvp1nobinning44.dat
Dev. Std. Cv

0.01

0.001
100000 1e+06 1e+07 1e+08
Numero passi MC

Figura 3.5

Dai graci appena mostrati sarebbe possibile stimare gli esponenti critici
delle grandezze descritte nel modo seguente. Supponiamo di voler calcolare
l'esponente critico per il calore specico. Dalla terza e dalla quarta relazione
della 3.2.1 e dal fatto che, al punto critico,
ξ∼L (3.2.6)
ricaviamo che
L ∝ |T − Tc |−α (3.2.7)
riscrivendolo in termini di β si ottiene
βc (V ) = βc (∞) − c · L−/α (3.2.8)
dove con βc (V ) si intende il valore a volume nito e con βc (∞) si intende
il valore a volume innito (che è noto essere βc (∞) = 0.440687). Nel caso
di volume nito CV ha un massimo a un punto pseudocritico βc (V ) e ha un
andamento
CV,max ∝ (βc (V ) − βc (∞))−γ ∝ Lγ/α . (3.2.9)
Da questa relazione, dalla valutazione degli βc (V ) a vari L è possibile ricavare
βc (∞)) e α, facendo un t in potenza passante per il massimo di CV ai vari
Capitolo 3. Applicazioni 37

valori di L. Il graco riportato non attendibile perchè, a causa di volumi


troppo piccoli, i punti utilizzati sono risultati solo tre. La sua funzione è
quella di mostrare che, al crescere di L, la stima di βc (V ) tende a al valore
stimato per volume innito.

Figura 3.6: β critico in funzione della lunghezza di reticolo L. Gli errori non sono
stati riportatiper l'inconsistenza delle misure.

Wang-Landau

Con questo metodo abbiamo ricavato l'entropia del sistema del sistema in
funzione dell'energia.
38 3.2 Transizioni di fase

150

100

50

EV
50 100 150 200 250

Figura 3.7: β critico in funzione della lunghezza di reticolo L. Gli errori non sono
stati riportatiper l'inconsistenza delle misure.
Appendice: estratti dal codice
sorgente

main.cpp

# include < iostream >


# include < iomanip >
# include < vector >
# include < cstdlib >
# include < ctime >

# define METROPOLIS 1
# define HEATBATH 2
# define WANGLANDAU 3
# define ENTROPIC 4

# include " Options .h "


# include " Lattice .h "
# include " Metro .h"
# include " HeatBath . h"
# include " Entropic . h"
# include " Measure .h "

using namespace std ;

int main ( int argc , char * const argv []) {

cout . setf ( std :: ios :: fixed , std :: ios :: floatfield );


cout . setf ( std :: ios :: showpoint );
cout . precision (6);

srand48 (( unsigned ) time (0));

Options opt ( argc , argv );


opt . dump ();

Lattice lat ( opt . getSize ());


lat . initSpins ( opt . getStart ());

Measure meas ;

switch ( opt . getAlgo ()) {


case METROPOLIS : {
Metro runner (& lat , opt . getBeta ());
runner . sweep ( opt . getNTherma () , false , NULL );

39
40 Appendice

runner . sweep ( opt . getNMC () , true , & meas );


for ( int ibin = 0; ibin < 9; ++ ibin ) {
meas . average ( opt . getBeta () , lat . getVolume () , ibin );
}
break ;
}
case HEATBATH : {
HeatBath runner (& lat , opt . getBeta ());
runner . sweep ( opt . getNTherma () , false , NULL );
runner . sweep ( opt . getNMC () , true , & meas );
for ( int ibin = 0; ibin < 9; ++ ibin ) {
meas . average ( opt . getBeta () , lat . getVolume () , ibin );
}
break ;
}
case WANGLANDAU : {
Entropic runner (& lat , opt . getFEnd () , 0);
runner . sweep ( opt . getNRun () , opt . getStart ());
runner . average ( opt . getNRun () , lat . getVolume ());
break ;
}
case ENTROPIC : {
Entropic runner (& lat , 0, opt . getNMC ());
runner . sweep ( opt . getNRun () , opt . getStart ());
runner . average ( opt . getNRun () , lat . getVolume ());
break ;
}
default :
cerr << " ERROR : Unkwown Algorithm " << opt . getAlgo () << endl ;
exit (1);
break ;
}
return 0;
}

Metro.cpp

# include " Metro .h"


# include " Measure .h "

void Metro :: initLookupTable () {


for ( int i = 0; i < 17; ++ i) {
minusBetaDeltaE . push_back (0);
}
minusBetaDeltaE [ 0] = -8* beta ;
minusBetaDeltaE [ 4] = -4* beta ;
minusBetaDeltaE [ 8] = 0;
minusBetaDeltaE [12] = 4* beta ;
minusBetaDeltaE [16] = 8* beta ;
}

void Metro :: sweep ( int n , bool flag , Measure * meas ) {


int volume = lat -> getVolume ();
for ( int i = 0; i < n; ++ i ) {
for ( int ix = 0; ix < volume ; ++ ix ) {
int DeltaE = -2* lat - > getSpin ( ix )* lat -> getNeighbours ( ix );
if ( log (1 - drand48 ()) < minusBetaDeltaE [ DeltaE +8]) {
Appendice 41

lat -> flipSpin ( ix );


}
}
if ( flag ) {
lat -> measure ();
meas -> accEnergy ( lat -> getEnergyDensity ());
meas -> accMag ( lat -> getMagDensity ());
if (( i %10000) == 0) {
cout << " Iteration " << i << " of " << n << " done \n ";
}
}
}
}

Entropic.cpp

# include " Entropic . h"

void Entropic :: average ( int nrun , int volume ) {

ofstream filedat (" obs . dat ");


filedat << "# beta E Delta E CV Delta CV \n ";

ofstream filent (" entropy . dat ");


filent << "# E/V S(E) Delta S(e)E \n ";

mpfr :: mpreal :: set_default_prec (256);

cout << "\ nEntropy versus Energy Density :\ n\n ";


for ( int i = 0; i < nhist ; ++ i) {
for ( int irun = 1; irun <= nrun ; ++ irun ) {
tglog [0][ i] += tglog [ irun ][ i ];
}
for ( int irun = 1; irun <= nrun ; ++ irun ) {
tglog [ irun ][ i] = ( tglog [0][ i] - tglog [ irun ][ i ]) / ( nrun - 1);
}
tglog [0][ i] /= nrun ;
double err = 0;
for ( int irun = 1; irun <= nrun ; ++ irun ) {
double diff = tglog [0][ i] - tglog [ irun ][ i ];
err += diff * diff ;
}
err = sqrt (( double ) nrun * err /( double )( nrun -1));
cout << i *(4.0/ volume ) << " " << tglog [0][ i] << " +/ - " << err << endl ;
filent << i *(4.0/ volume ) << "\ t" << tglog [0][ i ] << "\ t" << err << endl ;
}
cout << endl ;

// start loop on beta values


vector < mpfr :: mpreal > Z ;
vector < mpfr :: mpreal > e1 ;
vector < mpfr :: mpreal > e2 ;
vector < mpfr :: mpreal > cv ;

for ( int irun = 0; irun <= nrun ; ++ irun ) {


Z. push_back ("0");
e1 . push_back ("0");
42 Appendice

e2 . push_back ("0");
cv . push_back ("0");
}

for ( double beta = BETA_MIN ; beta <= BETA_MAX ; beta += BETA_STEP ) {


for ( int irun = 0; irun <= nrun ; ++ irun ) {
Z[ irun ] = "0";
e1 [ irun ] = "0";
e2 [ irun ] = "0";
cv [ irun ] = "0";
for ( int i = 0; i < nhist ; ++ i) {
double E = i *4;
if ( tglog [ irun ][ i ] > 0) {
mpfr :: mpreal expA = mpfr :: exp ( tglog [ irun ][ i] - beta *E );
Z[ irun ] += expA ;
}
}
for ( int i = 0; i < nhist ; ++ i) {
double E = i *4;
if ( tglog [ irun ][ i ] > 0) {
mpfr :: mpreal expA = mpfr :: exp ( tglog [ irun ][ i] - beta *E )/ Z[ irun ];
e1 [ irun ] += ( mpfr :: mpreal )E * expA ;
e2 [ irun ] += ( mpfr :: mpreal )( E*E) * expA ;
}
}
cv [ irun ] = ( mpfr :: mpreal )( beta * beta )*( e2 [ irun ]- e1 [ irun ]* e1 [ irun ]);
}
mpfr :: mpreal err_e = "0";
mpfr :: mpreal err_c = "0";
for ( int irun = 1; irun <= nrun ; ++ irun ) {
mpfr :: mpreal diff = e1 [0] - e1 [ irun ];
err_e += diff * diff ;
diff = cv [0] - cv [ irun ];
err_c += diff * diff ;
}
err_e = mpfr :: sqrt (( mpfr :: mpreal ) nrun * err_e /( mpfr :: mpreal )( nrun -1));
err_c = mpfr :: sqrt (( mpfr :: mpreal ) nrun * err_c /( mpfr :: mpreal )( nrun -1));
cout << " beta = " << beta << " Z = " << Z [0] <<
" < E > = " << e1 [0]/ volume << " +/ - " << err_e / volume <<
" < C_V > = " << cv [0]/ volume << " +/ - " << err_c / volume << endl ;

filedat << beta << "\ t" << e1 [0]/ volume << "\ t" << err_e / volume <<
"\ t" << cv [0]/ volume << "\ t" << err_c / volume << endl ;

cout << " Entropy written on entropy . dat \n ";


cout << " Data written on obs . dat \n\n ";

void Entropic :: sweep ( int nrun , int start ) {

// create " entry 0" in tglog for later use

resetGlog ();
tglog . push_back ( glog );

for ( int irun = 1; irun <= nrun ; ++ irun ) {

lat -> initSpins ( start );


lat -> measure ();
Appendice 43

energy = lat -> getEnergy ();

resetGlog ();

if ( nes == 0) {

// Wang - Landau algorithm

int gCounter = 0;
double f = 2;
do {
f /= 2;
resetHist ();
cout << " Run " << irun << " of " << nrun << " , start f = " << f << " ... ";
int counter = wl (f );
cout << " counter = " << counter << endl ;

gCounter += counter ;
} while (f > fend );
} else {

// Entropic sampling

int nstep = nes ;


for ( int ies = 1; ies <= 10; ++ ies ) {
nstep *= 2;
cout << " ies = " << ies << " nstep = " << nstep << " ... ";
resetHist ();
es ( nstep );
esUpdateGlog ();
cout << " done \n ";
}
}
saveGlog ( irun );
}
}

void Entropic :: saveGlog ( int irun ) {

// 1. we know glog should be symmetric , so symmetrize it


// 2. we know glog [0] should be log (2) , so normalize it

for ( int i = 0; i <= nhist /2; ++ i) {


glog [i] = ( glog [i ] + glog [ nhist -1 - i ]) / 2;
glog [ nhist -1 - i] = glog [i ];
}
double norma = glog [0] - log (2);
for ( int i = 0; i < nhist ; ++ i) {
if ( glog [i] > 0) {
glog [i] -= norma ;
}
}

// save glog in global vector for later analysis

tglog . push_back ( glog );


}

bool Entropic :: flatHistogram () {


int tot = hist [0] + hist [ nhist -1];
for ( int i = 2; i < nhist -2; ++ i ) {
tot += hist [i ];
44 Appendice

}
double mean = (( double ) tot ) / ( nhist -2);
if ( hist [0] < 0.8* mean ) return false ;
if ( hist [ nhist -1] < 0.8* mean ) return false ;
bool result = true ;
int i = 1;
do {
++ i;
result = ( hist [i] >= 0.8* mean );
} while ( result && (i < nhist -3));
return result ;
}

void Entropic :: step () {


int volume = lat -> getVolume ();
for ( int i = 0; i < volume ; ++ i) {
int ix = (( int ) floor ( drand48 ()* volume ));
int new_energy = energy + 2* lat -> getSpin ( ix )* lat -> getNeighbours ( ix );
if ( log (1 - drand48 ()) < glog [ energy /4] - glog [ new_energy /4]) {
lat -> flipSpin ( ix );
energy = new_energy ;
}
hist [ energy /4] += 1;
}
}

int Entropic :: wl ( double f) {


for ( int i = 0; i < 1000; ++ i) {
step ();
wlUpdateGlog (f );
}
int counter = 1000;
do {
++ counter ;
step ();
wlUpdateGlog (f );
} while (! flatHistogram ());
return counter ;
}

void Entropic :: es ( int nstep ) {


for ( int i = 0; i < nstep ; ++ i) {
step ();
}
}

void Entropic :: init () {


nhist = lat -> getVolume () + 1;
for ( int i = 0; i < nhist ; ++ i) {
hist . push_back (0);
glog . push_back (0);
}
}

void Entropic :: resetHist () {


for ( int i = 0; i < nhist ; ++ i) {
hist [i] = 0;
}
}

void Entropic :: resetGlog () {


for ( int i = 0; i < nhist ; ++ i) {
Appendice 45

glog [i] = 0;
}
}

void Entropic :: esUpdateGlog () {


for ( int i = 0; i < nhist ; ++ i) {
if ( hist [i] > 0) {
glog [i] += log ( hist [i ]);
}
}
}

Measure.cpp

# include " Measure .h "

void Measure :: autocorrelation () {

ofstream outfile (" auto . dat ");


outfile << "# t E M CV Chi \n ";

vector < double > phi_e ;


vector < double > phi_m ;
vector < double > phi_c ;
vector < double > phi_s ;

double tau_e = 0, tau_m = 0, tau_c = 0 , tau_s = 0;

for ( int i = 0; i < NAUTO ; ++ i) {


phi_e . push_back (0);
phi_m . push_back (0);
phi_c . push_back (0);
phi_s . push_back (0);
}

cout << " Autocorrelation function E , M , CV , Chi \n ";

for ( int j = 0; j < NAUTO ; ++ j) {


for ( int i = 0; i < NData - NAUTO ; ++ i) {
phi_e [ j] += energy1 [ i ]* energy1 [ i+j ];
phi_m [ j] += mag1 [i ]* mag1 [i +j ];
phi_c [ j] += cv1 [i ]* cv1 [i+j ];
phi_s [ j] += chi1 [i ]* chi1 [i +j ];
}
phi_e [j] /= ( NData - NAUTO );
phi_m [j] /= ( NData - NAUTO );
phi_c [j] /= ( NData - NAUTO );
phi_s [j] /= ( NData - NAUTO );

phi_e [j] -= mean [0]* mean [0];


phi_e [j] /= ( mean [1] - mean [0]* mean [0]);
phi_m [j] -= mean [2]* mean [2];
phi_m [j] /= ( mean [3] - mean [2]* mean [2]);
phi_c [j] -= mean [4]* mean [4];
phi_c [j] /= ( mean [5] - mean [4]* mean [4]);
phi_s [j] -= mean [6]* mean [6];
phi_s [j] /= ( mean [7] - mean [6]* mean [6]);
46 Appendice

outfile << j << "\ t" << phi_e [ j] << "\ t " << phi_m [j] <<
"\ t" << phi_c [j] << "\ t" << phi_s [ j] << endl ;

tau_e += phi_e [j ];
tau_m += phi_m [j ];
tau_c += phi_c [j ];
tau_s += phi_s [j ];
}

cout << endl ;


cout << " tau_E = " << tau_e << endl ;
cout << " Molt . Factor for sigma_E = " << sqrt (2* tau_e +1) << endl ;
cout << " True error on Energy = " << gerr [0]* sqrt (2* tau_e +1) << endl ;
cout << " tau_M = " << tau_m << endl ;
cout << " Molt . Factor for sigma_M = " << sqrt (2* tau_m +1) << endl ;
cout << " True error on Magn . = " << gerr [1]* sqrt (2* tau_m +1) << endl ;
cout << " tau_C = " << tau_c << endl ;
cout << " Molt . Factor for sigma_C = " << sqrt (2* tau_c +1) << endl ;
cout << " True error on CV = " << gerr [2]* sqrt (2* tau_c +1) << endl ;
cout << " tau_S = " << tau_s << endl ;
cout << " Molt . Factor for sigma_S = " << sqrt (2* tau_s +1) << endl ;
cout << " True error on Chi = " << gerr [3]* sqrt (2* tau_s +1) << endl ;
cout << endl ;

cout << " Autocorrelation data written in auto . dat \n\ n ";
}

void Measure :: reweight ( double beta0 , int volume , int ndata ) {

ofstream outfile (" reweight . dat ");


outfile << "# beta E Delta E CV Delta CV \n ";

double deltaBeta = 2.0/ volume ;


double betaUp = beta0 + deltaBeta ;
double betaDn = beta0 - deltaBeta ;
double betaStep = ( betaUp - betaDn ) / 20; // 20 values of beta around beta0

cout << " Start reweighting ...\ n ";

for ( double beta = betaDn ; beta <= betaUp ; beta += betaStep ) {

// first step : compute normalization

double norma = 0;
for ( int i = 0; i < ndata ; ++ i) {
double tmp = exp ( -( beta - beta0 )* energy1 [i ]* volume );
norma += tmp ;
}

// second step : compute averages

double en1 = 0;
double en2 = 0;
for ( int i = 0; i < ndata ; ++ i) {
double tmp = exp ( -( beta - beta0 )* energy1 [i ]* volume )/ norma ;
en1 += energy1 [ i ]* tmp ;
en2 += energy2 [ i ]* tmp ;
}

// now we know the error on < rew - energy > AND < rew - C_V > up to a
// multiplicative factor
Appendice 47

double cv = en2 - en1 * en1 ;


double err_en = sqrt ( cv /( ndata -1));

// third step : compute error on < rew - C_V >

double err_cv = 0;
for ( int i = 0; i < ndata ; ++ i) {
double tmp = exp ( -( beta - beta0 )* energy1 [i ]* volume )/ norma ;
double diff = energy2 [ i ]* tmp - en1 * en1 ;
err_cv += diff * diff ;
}
err_cv /= ndata ;
err_cv = sqrt ( err_cv /( ndata -1));

cout << " Reweight : Beta = " << beta <<


" Energy = " << en1 << " +/ - " << err_en <<
" CV = " << beta * beta * volume * cv << " +/ - " << beta * beta * volume * err_cv << endl ;

outfile << beta << "\ t" << en1 << "\ t" << err_en <<
"\ t" << beta * beta * volume * cv << "\ t" << beta * beta * volume * err_cv << endl ;
}
cout << " Reweight data written in reweight . dat \n\n ";
}

int Measure :: binData ( int binlevel ) {


int division = 1;
for ( int i = 0; i < binlevel ; ++ i) {
division *= 2;
}
int ndata = NData / division ;
for ( int i = 0; i < 2* ndata ; i += 2) {
energy1 [i /2] = ( energy1 [i] + energy1 [i +1]) / 2;
energy2 [i /2] = ( energy2 [i] + energy2 [i +1]) / 2;
mag1 [i /2] = ( mag1 [i] + mag1 [i +1]) / 2;
mag2 [i /2] = ( mag2 [i] + mag2 [i +1]) / 2;
}
return ndata ;
}

void Measure :: average ( double beta , int volume , int binlevel ) {

ofstream outfile (" binerr . dat ", ios_base :: app );

int ndata ;
if ( binlevel == 0) {
NData = energy1 . size ();
ndata = NData ;
} else {
ndata = binData ( binlevel );
}

cout << endl << " Average Values at binlevel = " << binlevel << endl ;
cout << "N Data = " << ndata << endl ;
cout << endl ;

double mean_energy = 0;
double err = 0;
for ( int i = 0; i < ndata ; ++ i) {
mean_energy += energy1 [i ];
err += energy2 [i ];
}
48 Appendice

mean_energy /= ndata ;
err /= ndata ;

mean [0] = mean_energy ; // < E >


mean [1] = err ; // < E ^2 >
gerr [0] = sqrt (( err - mean_energy * mean_energy )/( ndata -1));

cout << "< E > = " << mean_energy <<


" +/ - " << gerr [0] << endl ;

double mean_mag = 0;
err = 0;
for ( int i = 0; i < ndata ; ++ i) {
mean_mag += mag1 [i ];
err += mag2 [i ];
}
mean_mag /= ndata ;
err /= ndata ;

mean [2] = mean_mag ; // < |M| >


mean [3] = err ; // < M ^2 >
gerr [1] = sqrt (( err - mean_mag * mean_mag )/( ndata -1));

cout << "< M > = " << mean_mag <<


" +/ - " << gerr [1] << endl ;

for ( int i = 0; i < ndata ; ++ i) {


double tmp = energy2 [i ]- mean_energy * mean_energy ;
if ( binlevel == 0) {
cv1 . push_back ( tmp );
cv2 . push_back ( tmp * tmp );
} else {
cv1 [i] = tmp ;
cv2 [i] = tmp * tmp ;
}
}
double mean_cv = 0;
err = 0;
for ( int i = 0; i < ndata ; ++ i) {
mean_cv += cv1 [i ];
err += cv2 [i ];
}
mean_cv /= ndata ;
err /= ndata ;

mean [4] = mean_cv ;


mean [5] = err ;
gerr [2] = beta * beta * volume * sqrt (( err - mean_cv * mean_cv )/( ndata -1));

cout << "< CV > = " << beta * beta * volume * mean_cv <<
" +/ - " << gerr [2] << endl ;

for ( int i = 0; i < ndata ; ++ i) {


double tmp = mag2 [i]- mean_mag * mean_mag ;
if ( binlevel == 0) {
chi1 . push_back ( tmp );
chi2 . push_back ( tmp * tmp );
} else {
chi1 [i] = tmp ;
chi2 [i] = tmp * tmp ;
}
}
Appendice 49

double mean_chi = 0;
err = 0;
for ( int i = 0; i < ndata ; ++ i) {
mean_chi += chi1 [i ];
err += chi2 [i ];
}
mean_chi /= ndata ;
err /= ndata ;

mean [6] = mean_chi ;


mean [7] = err ;
gerr [3] = beta * volume * sqrt (( err - mean_chi * mean_chi )/( ndata -1));

cout << "< Chi > = " << beta * volume * mean_chi <<
" +/ - " << gerr [3] << endl ;
cout << endl ;

if ( binlevel == 0) {
outfile << "# ibin Delta E Delta M Delta CV Delta Chi \n ";
autocorrelation ();
reweight ( beta , volume , ndata );
}
outfile << binlevel << "\ t " << gerr [0] << "\ t" << gerr [1] << "\ t" <<
"\ t" << gerr [2] << "\ t" << gerr [3] << endl ;

cout << " Errors appended to binerr . dat \n\ n ";


}
50 Appendice
Bibliograa
[1] Huang, K.: Statistical Mechanics. Wiley, 1987.

[2] Lee, Jooyoung: New Monte Carlo algorithm: Entropic sampling. Phys.
Rev. Lett., 71:211214, Jul 1993. http://link.aps.org/doi/10.1103/
PhysRevLett.71.211.
[3] Pathria, R.K. e P.D. Beale: Statistical Mechanics. Academic Press,
3a edizione, 2011.

[4] Wang, Fugao e D. P. Landau: An ecient, multiple range random walk


algorithm to calculate the density of states. Phys. Rev. Lett., 86:2050,
2001. http://arxiv.org/abs/cond-mat/0011174.

[5] Wang, Fugao e David. P. Landau: Determining the density of states for
classical statistical models: A random walk algorithm to produce a at
histogram, giugno 2001. http://arxiv.org/abs/cond-mat/0107006.

51