Méthodes de Monte-Carlo en physique statistique

publicité
Frédéric Legrand
Licence Creative Commons
1
Méthodes de Monte-Carlo en physique statistique
1.
Introduction
Ce document constitue une introduction aux méthodes de Monte-Carlo appliquées
à la physique statistique. Les méthodes sont exposées à partir d'un exemple, le modèle
d'Ising du ferromagnétisme.
2.
Modèle d'Ising
2.a. Dénition
Les matériaux ferromagnétiques (comme le fer ou le nickel) tiennent leurs propriétés
magnétiques du spin des électrons itinérants (responsables aussi de la conduction électrique). Le spin est un moment cinétique intrinsèque de l'électron, auquel est associé un
moment magnétique. Le spin est quantié. La projection du moment cinétique de spin
sur un axe Z n'a que deux valeurs possibles :
Sz = ±
~
2
(1)
où ~ est la constante de Planck divisée par 2π . Le moment magnétique associé au spin
est proportionnel au moment cinétique :
mz = −gµB Sz
(2)
où g est le facteur de Landé (égal environ à 2) et µB le magnéton de Bohr. En présence
d'un champ magnétique, l'énergie de l'électron est :
E = −mz Bz
(3)
Les moments magnétiques ont donc tendance à s'orienter dans le sens du champ.
Dans un matériau ferromagnétique, les spins ont la faculté de s'orienter dans le même
sens, même en l'absence de champ magnétique extérieur. C'est pourquoi un morceau de
fer peut présenter une aimantation permanente. Pour expliquer ce phénomène, il faut
une interaction entre les spins.
Deux électrons peuvent interagir par l'interaction dipolaire : le champ magnétique
créé par le moment magnétique d'un électron exerce une inuence sur le moment magnétique de l'autre électron. Cependant, l'interaction dipolaire est beaucoup trop faible
pour expliquer le ferromagnétisme.
C'est un phénomène quantique qui explique l'interaction entre deux spins responsable
du ferromagnétisme. Le principe d'exclusion de Pauli et la répulsion électrique entre les
deux électrons, conduisent à une interaction appelée interaction d'échange. Pour deux
électrons voisins i et j , cette interaction peut être représentée par une énergie de la
forme :
E = −JSzi Szj
(4)
où J est une constante positive. Deux électrons voisins ont une énergie plus basse lorsque
leurs spins sont de même sens. Ils ont donc tendance à s'orienter dans le même sens.
Frédéric Legrand
Licence Creative Commons
2
Le modèle d'Ising est une représentation simpliée du matériau ferromagnétique,
dans lequel la direction des spins (axe Z) est la même pour tous les électrons. Les spins
sont positionnés sur un réseau. On se limite ici au modèle d'Ising à une dimension. La
gure suivante montre un exemple de conguration pour un système à N spins. Les deux
valeurs possibles pour chaque spin sont -1 et 1.
1
1
1
-1
N-1
0
1
2
1
3
-1
-1
4
5
...........
1
N-5
1
-1
1
1
N-4
N-2
N-1
0
Le spin d'indice i interagit avec ses deux voisins i − 1 et i + 1. On introduit une condition
limite périodique, consistant à faire interagir les spins 0 et N − 1. Avec ces hypothèses,
l'énergie du système s'écrit :
E=−
N
−1
X
BSi + Si Si+1
(5)
i=0
où B est une constante représentant le champ magnétique extérieur. Par convention, le
moment magnétique est dans le même sens que le spin (physiquement, ils sont de sens
opposé car l'électron a une charge négative).
2.b. Distribution de Boltzmann
En raison de l'agitation thermique, les électrons itinérants échangent en permanence
de l'énergie avec les atomes du métal et les autres électrons. L'agitation thermique a
tendance à maintenir un état désordonné des spins. Un résultat important de la théorie
statistique est la distribution de Boltzmann, valable si le système est à l'équilibre thermique à la température T . Soit µ une conguration particulière du système de spins et Eµ
l'énergie de cette conguration. La propabilité de cette conguration est proportionnelle
à un facteur exponentiel (facteur de Boltzmann) :
pµ = α exp(−
Eµ
)
kT
(6)
où k est la constante de Boltzmann. Lorsque la température est faible, les congurations
de faible énergie sont beaucoup plus probables que les congurations de plus haute
énergie. Lorsque la température augmente, l'énergie a de moins en moins d'inuence sur
la probabilité. À température innie, toutes les congurations sont équiprobables. Pour
simplier les notations, on pose :
β=
1
kT
(7)
Pour déterminer la constante de normalisation α, il faut écrire la condition de normalisation : la somme des probabilités de toutes les congurations doit être égale à 1. On
obtient ainsi :
e−βEµ
P
pµ =
−βEµ
µe
(8)
Frédéric Legrand
Licence Creative Commons
3
Cette distribution permet en principe de calculer la moyenne (au sens d'espérance), de
diérentes grandeurs physiques. Soit X une grandeur physique et Xµ sa valeur pour la
conguration µ. La valeur moyenne de X, c'est-à-dire l'espérance de la variable aléatoire
X, est :
P
−βEµ
µ Xµ e
P
X = E(X) =
−βEµ
µe
(9)
Dans le cas du modèle d'Ising, une grandeur intéressante est le moment magnétique total,
déni par :
mµ =
X
Si
(10)
i
Le moment magnétique est une grandeur macroscopique mesurable. La valeur mesurée
est précisément la moyenne dénie ci-dessus.
3.
Méthodes de Monte-Carlo
3.a. Principe
Il s'agit d'évaluer l'espérance (9). Même lorsque le nombre de congurations est ni,
cette somme ne peut être calculée directement car ce nombre est beaucoup trop grand.
Par exemple pour le modèle d'Ising, le nombre de congurations est 2N . Même pour un
petit système de N = 100 spins, le nombre de congurations à explorer dépasse de très
loin les capacités d'un ordinateur.
Il faut donc s'orienter vers une méthode de Monte-Carlo, qui consiste à opérer sur un
échantillon de congurations choisies aléatoirement.
3.b. Échantillonnage direct
Une première idée serait de choisir des congurations aléatoirement, toutes ayant la
même probabilité. Dans le cas du modèle d'Ising, ce tirage ne pose pas de dicultés.
Il sut de choisir aléatoirement chaque spin (-1 ou 1) pour obtenir une conguration.
Si M est le nombre de congurations tirées, l'espérance (9) est évaluée par la moyenne
empirique :
M
1 X
pk Xk
moy(X, M ) =
M k=1
(11)
où pk est la probabilité de la conguration k.
Cette méthode est cependant impossible à réaliser, car la somme gurant dans l'expression de pµ n'est pas connue a priori. C'est justement ce type de somme que l'on
cherche à calculer.
La solution consiste à tirer aléatoirement les échantillons avec la probabilité pµ et non
pas avec une probabilité uniforme. De cette manière, l'évaluation de l'espérance devient :
M
1 X
moy(X, M ) =
Xk
M k=1
(12)
Frédéric Legrand
Licence Creative Commons
4
La diculté est d'avoir une méthode pour échantillonner les congurations avec la probabilité pµ . Les diérentes méthodes d'échantillonnage de nombres aléatoires sont exposées
dans Échantillonnage des distributions de probabilité discrètes.
La méthode du rejet ne nécessite pas la connaissance de la constante de normalisation.
Elle consiste à tirer aléatoirement une conguration µ avec un tirage uniforme, puis à
calculer sa probabilité non normalisée :
qµ = e−βEµ
(13)
La seconde étape consiste à tirer un nombre réel aléatoire x avec une densité uniforme
sur l'intervalle [0, qmax ]. Dans le cas présent, la valeur maximale de la probabilité non
normalisée est qmax = 1. Ce nombre x est comparé à qµ , ce qui permet de conserver ou
de rejeter la conguration. Si x < qµ , la conguration est retenue, sinon elle est rejetée.
Pour le modèle d'Ising, la méthode du rejet est donc constituée des étapes suivantes :
. Choisir aléatoirement les N spins, les valeurs -1 et +1 étant équiprobables.
. Calculer l'énergie Eµ de la conguration et la probabilité qµ non normalisée cor-
respondante.
. Tirer aléatoirement un réel x dans l'intervalle [0, 1] avec une densité uniforme.
. Si x < qµ , la conguration est retenue, sinon elle est rejetée.
L'évaluation de la moyenne se fait avec les congurations retenues. On évalue aussi la
variance comme expliqué dans méthode de Monte-Carlo. En divisant cette variance par
le nombre M de tirages, on obtient la variance de la moyenne.
Dans le cas de la distribution exponentielle de Boltzmann, la méthode du rejet soure
d'un grave inconvénient : la très grande majorité des congurations a une probabilité non
normalisée très faible, ce qui conduit à un taux de rejet très important, surtout lorsque
la température est faible.
3.c. Méthode de Metropolis
La méthode de Metropolis ([1], [2]) a servi de point de départ pour le développement
de méthodes d'échantillonnage par chaines de Markov, qui sont incomparablement plus
ecaces que les méthodes d'échantillonnage direct. L'article original exposait son application au modèle des sphères dures, mais la méthode de Metropolis se généralise a tout
problème de calcul statistique.
On se contente ici d'un exposé descriptif de la méthode appliquée au modèle d'Ising.
Au lieu de tirer directement chaque conguration, la méthode de Metropolis tire une
nouvelle conguration en modiant légèrement la conguration précédente. Il s'agit de
générer une suite de congurations avec des règles de transition, de telle sorte que les
congurations obtenues obéissent à la loi de probabilité voulue, en l'occurence la loi de
Boltzmann.
L'obtention d'une nouvelle conguration à partir de la précédente se fait en deux
étapes : la sélection et l'acceptation. En cas de refus de la nouvelle conguration, la
conguration est conservée.
Frédéric Legrand
Configuration μ
Licence Creative Commons
Sélection
Nouvelle configuration
Acceptation
5
Configuration μ'
Refus
La sélection est une modication de la conguration simple à réaliser. Toute règle de
sélection est possible, à condition qu'elle permette l'exploration de toutes les congurations. Dans le modèle d'Ising, on se contente de choisir un spin aléatoirement et de
changer son signe. Notons µ la conguration et µ0 la nouvelle conguration. Le rapport
de leur probabilité est :
pµ0
= e−β(Eµ0 −Eµ ) = e−β∆E
pµ
(14)
Lorsqu'on modie un seul spin, il est très facile (et peu coûteux) de calculer la variation
d'énergie
∆E = Eµ0 − Eµ
(15)
Lorsque cette diérence est négative, la nouvelle conguration est plus probable que la
précédente. Il est donc logique de l'accepter. Si la diérence d'énergie est positive, il ne
faut pas refuser systématiquement la nouvelle conguration, car cela pourrait empêcher
d'explorer certaines congurations importantes. Il faut donc l'accepter ou la refuser en
utilisant une méthode similaire à la méthode du rejet exposée plus haut. On tire un
nombre réel aléatoire avec une densité de probabilité uniforme sur l'intervalle [0, 1]. La
nouvelle conguration est acceptée seulement si :
x < e−β∆E
(16)
Dans le cas contraire, la nouvelle conguration est refusée et on garde la précédente.
Voici pour résumer les opérations à eectuer pour obtenir une nouvelle conguration,
dans le cas du modèle d'Ising :
. Choix d'un spin aléatoirement.
. Calcul de la variation d'énergie ∆E résultant de l'inversion de ce spin.
. Si ∆E <= 0, le spin est inversé.
. Sinon, tirage d'un réel x aléatoirement avec une densité uniforme sur l'intervalle
[0, 1]. Si x < e−β∆E , le spin est inversé, sinon il est inchangé.
La suite de congurations ainsi générée converge vers la distribution de Boltzmann ([2]).
La conguration initiale est quelconque ; on peut la choisir aléatoirement. Il faut calculer
un certain nombre Q de congurations (qui peut être très grand) avant que la suite de
congurations obéisse eectivement à la loi de Boltzmann. À partir de cet instant, le
système est à l'équilibre et on peut commencer à calculer des grandeurs moyennes. Si M
est le nombre total de congurations d'équilibre générées, l'évaluation de l'espérance de
X est donnée par la somme suivante :
Frédéric Legrand
Licence Creative Commons
M
1 X
moy(X, M ) =
Xk
M k=1
6
(17)
On calcule aussi la variance expérimentale.
Q est le nombre de congurations qu'il faut générer pour atteindre l'équilibre. Les
calculs de moyenne ne peuvent commencer qu'à partir de ce rang. La principale diculté
de la méthode de Metropolis est l'évaluation de Q, qui n'est pas connu a priori.
Comparée à la méthode d'échantillonnage directe (méthode du rejet), la méthode de
Metropolis est bien meilleure pour deux raisons :
. Le calcul de ∆E est beaucoup moins coûteux que le calcul de l'énergie E d'une
conguration.
. La proportion de congurations rejetées est beaucoup plus faible que dans la
méthode du rejet.
Contrairement à la méthode directe, la méthode de Metropolis nécessite un certain
nombre de tirages de mise à l'équilibre (Q), avant que l'on puisse commencer à faire
les calculs de moyenne.
Pour améliorer une méthode de Metropolis, il faut trouver des règles de sélection qui
donne des taux de rejet faibles dans l'étape d'acceptation. Une méthode de Metropolis
idéale aurait un taux de rejet nul.
4.
Travaux pratiques : implémentation de la méthode de Metropolis
L'objectif est d'implémenter la méthode de Metropolis pour le modèle d'Ising à une
dimension. Les deux variables aléatoires dont on cherche à calculer la moyenne sont le
moment magnétique, c'est-à-dire la somme des spins :
m=
N
−1
X
Si
(18)
i=0
et l'énergie :
E=−
N
−1
X
BSi + Si Si+1
(19)
i=0
Compte tenu du très grand nombre de congurations qu'il faudra générer, il faut prendre
soin de minimiser les calculs. En particulier, le moment magnétique et l'énergie devront
être stockés dans une variable, qui sera actualisée à chaque basculement de spin.
Lorsque l'inversion d'un spin est testé, il faut calculer la variation d'énergie ∆E
résultant de l'inversion de ce spin. Notons S l'état du spin avant l'inversion. Le terme
d'interaction avec le champ extérieur est changé de +2BS . Pour le terme d'interaction
entre spins voisins, il y a trois cas suivant l'état des spins avant le changement :
. Les deux spins voisins Si−1 et Si+1 sont de même signe que Si . La variation
d'énergie est +4.
. Les deux spins voisins sont de même signe mais de signe opposé à Si . La variation
d'énergie est −4.
Frédéric Legrand
Licence Creative Commons
7
. Les deux spins voisins sont de signes opposés. La variation d'énergie est nulle.
Finalement, il y a 6 variations d'énergie totale possibles :
2B + 4, 2B − 4, 2B, −2B + 4, −2B − 4, −2B
(20)
Le facteur e−β∆E de ces 6 termes devra être calculé au préalable et stocké dans une liste.
import numpy
import numpy.random
import math
from matplotlib.pyplot import *
Pour mémoriser toutes les données relatives à un réseau de spins (tableau de spins,
énergie, moment magnétique), il est commode d'utiliser une classe. On dénit donc une
classe dont voici le prototype :
class Ising1D:
def __init__(self,N):
def constantes(self,B,T):
def init_random(self):
def voisins(self,i):
def deltaE(self,i):
def metropolis(self,i,x):
def boucle(self,n):
Le constructeur __init__(self,N) se charge de créer un tableau de N spins, initialisés à 1 :
La fonction constantes(self,B,T) dénit le champ magnétique et la température.
La fonction init_random(self) initialise les spins avec des valeurs aléatoires (-1 ou
1). Cela correspond à une conguration initiale avec une température innie. La fonction
doit aussi initialiser l'énergie et le moment magnétique.
La fonction voisins(self,i) renvoit l'état des deux voisins du spin d'indice i, en
tenant compte des conditions limites périodiques.
La fonction deltaE(self,i) calcule la variation d'énergie ∆E et le facteur de Boltzmann e−β∆E pour le basculement du spin d'indice i.
La fonction metropolis(self,i,x) teste le basculement du spin d'indice i et réalise
ou pas ce basculement en fonction de ∆E et de x, qui est un nombre aléatoire ottant
compris entre 0 et 1.
La fonction boucle(self,n) réalise une boucle de calcul comportant n*N tentatives
(réussies ou pas) de basculement de spin. Cela correspond, en moyenne, à n basculements
pour chaque spin du réseau. La fonction renvoit la liste des valeurs de moment magnétique
(une pour chaque itération) et la liste des valeurs de l'énergie.
class Ising1D:
def __init__(self,N):
self.N = N
self.spin = numpy.ones(N)
Frédéric Legrand
def
def
def
def
def
Licence Creative Commons
8
self.E = 0
self.M = N
constantes(self,B,T):
beta = 1.0/T
self.B = B
self.dE = [2*B+4,2*B-4,2*B,-2*B+4,-2*B-4,-2*B]
self.A = []
for k in range(6):
self.A.append(math.exp(-beta*self.dE[k]))
self.E = 0
for i in range(self.N-1):
self.E -= self.B*self.spin[i]+self.spin[i]*self.spin[i+1]
self.E -= self.B*self.spin[self.N-1]+self.spin[self.N-1]*self.spin[0]
init_random(self):
self.spin = numpy.random.randint(0,2,self.N)*2-1
self.M = self.spin.sum()
self.E = 0
for i in range(self.N-1):
self.E -= self.B*self.spin[i]+self.spin[i]*self.spin[i+1]
self.E -= self.B*self.spin[self.N-1]+self.spin[self.N-1]*self.spin[0]
voisins(self,i):
if i==0:
s1 = self.spin[self.N-1]
else:
s1 = self.spin[i-1]
if i==self.N-1:
s3 = self.spin[0]
else:
s3 = self.spin[i+1]
return (s1,s3)
deltaE(self,i):
s2 = self.spin[i]
(s1,s3) = self.voisins(i)
if s2==1:
p = 0
else:
p = 3
if (s1,s2,s3)==(1,1,1) or (s1,s2,s3)==(-1,-1,-1):
pass
elif (s1,s2,s3)==(1,-1,1) or (s1,s2,s3)==(-1,1,-1):
p += 1
else:
p += 2
return (self.dE[p],self.A[p])
metropolis(self,i,x):
(dE,A)= self.deltaE(i)
if dE<=0:
self.spin[i] = -self.spin[i]
Frédéric Legrand
Licence Creative Commons
self.E += dE
self.M += 2*self.spin[i]
else:
if x<A:
self.spin[i] = -self.spin[i]
self.E += dE
self.M += 2*self.spin[i]
def boucle(self,n):
m = numpy.zeros(n)
e = numpy.zeros(n)
tab_i = numpy.random.randint(0,self.N,size=n*self.N)
tab_x = numpy.random.random_sample(size=n*self.N)
j = 0
for k in range(n):
m[k] = self.M
e[k] = self.E
for i in range(self.N):
self.metropolis(tab_i[j],tab_x[j])
j += 1
return (m,e)
Voici un exemple :
N = 1000
ising = Ising1D(1000)
B = 0.1
T = 1.0
ising.constantes(B,T)
ising.init_random()
(M,E) = ising.boucle(100)
figure()
subplot(211)
plot(M/N)
ylabel("M/N")
subplot(212)
plot(E/N)
ylabel("E/N")
9
Frédéric Legrand
Licence Creative Commons
10
On voit sur ces courbes le moment magnétique (par spin) et l'énergie en fonction du
nombre d'itérations (une itération = N tentatives de basculement). Ce type de tracé
donne une estimation du nombre d'itérations qu'il faut pour atteindre l'équilibre. Pour
conrmer, on refait une simulation avec une condition initiale aléatoire diérente :
ising.init_random()
(M,E) = ising.boucle(100)
figure()
subplot(211)
plot(M/N)
ylabel("M/N")
subplot(212)
plot(E/N)
ylabel("E/N")
Frédéric Legrand
Licence Creative Commons
11
Cela conrme que l'équilibre est largement atteint au bout de 100 itérations (mais on ne
peut en être certain). On peut donc commencer les calculs de moyennes et d'écart-types.
Voici par exemple un calcul avec 100 itérations :
n = 100
(M,E) =
M /= N
E /= N
M_moy =
M_std =
E_moy =
E_std =
ising.boucle(n)
M.mean()
M.std()
E.mean()
E.std()
print((M_moy,M_std))
--> (0.58196000000000003, 0.065562172020151979)
print((E_moy,E_std))
--> (-0.87391600000001235, 0.023116906021352576)
L'écart-type de l'estimation de la moyenne est obtenu en divisant par la racine carré
du nombre de congurations utilisées pour estimer la moyenne :
print(M_std/math.sqrt(n))
--> 0.0065562172020151976
print(E_std/math.sqrt(n))
--> 0.0023116906021352574
Frédéric Legrand
Licence Creative Commons
12
Lorsque le programme fonctionnera correctement, on testera diérentes valeurs de
la température pour ce champ magnétique, puis diérents champs magnétiques. Pour
B = 0, on constatera que le modèle d'Ising à une dimension ne peut donner de moment magnétique permanent. Pour obtenir une aimantation en l'absence de champ B
(ferromagnétisme), il faut un modèle à deux dimensions.
Références
[1] N. Metropolis, A.W. Rosenbluth, M.N. Rosenbluth, A.H. Teller, Equation of state
, (J. Chem. Phys. vol. 21 No. 6, 1953)
[2] M.E.J. Newman, G.T. Barkema, Monte Carlo methods in statisticals physics, (Oxford
university press, 1999)
calculations by fast computing machines
Téléchargement