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