Table des matières MathematicaPython

Modèle d'Ising à deux dimensions

1. Introduction

Les matériaux ferromagnétiques possèdent une aimantation spontanée (en l'absence de champ magnétique) lorsque la température est inférieure à la température de Curie Tc. Par exemple pour le fer Tc=1043 K.

Au dessus de la température de Curie, l'aimantation spontanée est nulle. Le matériau est alors dans un état paramagnétique : il peut acquérir une aimantation uniquement sous l'effet d'un champ magnétique extérieur.

L'aimantation est causée par les moments magnétiques de spin des électrons, représenté par le nombre quantique s=±12 . À basse température, les spins sont alignés et l'aimantation résultante est importante. À haute température (T>Tc), l'agitation thermique empêche cet alignement.

2. Modèle d'Ising du ferromagnétisme

On considère ici le modèle d'Ising à 2 dimensions. Dans ce modèle, N spins sont disposés sur un réseau carré. Notons ν une configuration particulière du système. Chaque spin interagit avec ses 4 plus proches voisins. En l'absence de champ extérieur, l'énergie du système est :

Eν=-Ji,j SiSj

où la somme se fait sur les paires de spins voisins. J est le facteur de couplage, positif pour un ferromagnétique.

Lorsque le système est en contact avec un thermostat de température T, la probabilité d'une configuration donnée des spins est

pν=exp(-βEν)Q

avec

β=1kbT

et

Q=νexp(-βEν)

est une somme sur toutes les configurations possibles, appelée fonction de partition du système.

Notons M0 l'aimantation à très basse température, obtenue lorsque tous les spins sont alignés (par exemple 1/2). L'aimantation d'une configuration particulière est proportionnelle à la somme des spins

Mν=2M0NiSi

La grandeur accessible à l'expérience est l'aimantation moyenne, définie par :

M=νMνpν

Le modèle d'Ising a deux dimensions possède une solution exacte, établie par L. Onsager en 1944. On donne ici l'aimantation en fonction de la température pour T<Tc :

M(T)=M0(1-1sh4(J2kbT))1/8

La température de Curie est

Tc=J2kbarcsh(1)=0,567296J/kb

Ci dessous le tracé de l'aimantation obtenu en posant J/kb=1 :

m[T_]:=(1-1/Sinh[1/(2*T)]^4)^(1/8);
Tc=1/(2*ArcSinh[1]);
Plot[m[T],{T,0.001,Tc},PlotPoints->2000,PlotRange->{{0,1},{0,1}},AxesLabel->{'T','M'}]
figMag.pngfigMag.pdf

On remarque une variation très rapide de l'aimantation au voisinage de la température de Curie.

3. Simulation de Monte-Carlo

3.a. Méthode

Une simulation de Monte-Carlo consiste à balayer aléatoirement un grand nombre de configurations du système, avec une distribution s'approchant de la loi pν donnée plus haut. L'algorithme de Metropolis permet de le faire.

Pour simplifier, on considère des valeurs de spins égales à 1 ou -1, ce qui revient à diviser J par 4.

Au départ, on attribue aux N spins du réseau une valeur aléatoire (1 ou -1). À chaque itération, un spin est choisi aléatoirement puis on évalue la variation d'énergie ΔE que provoquerait sont basculement (changement de signe). Si cette variation est négative, le basculement est effectué. Sinon, on tire un nombre aléatoire x compris entre 0 et 1 puis on effectuer le basculement du spin si la condition

exp(-βΔE)x

est vérifiée.

Afin de simuler un système de taille infinie, on utilise des conditions limites périodiques sur les bords du réseau carré.

Les calculs sont effectués en posant kb=1 et J=1. Dans ces conditions, la température de Curie (ou température critique) est :

Tc=N[4/(2*ArcSinh[1])]
2.269185314213022

Le programme de calcul est écrit en C++. Les itérations sont regroupés en blocs. À chaque bloc, le moment magnétique est mémorisé de manière à tracer la courbe de son évolution au cours de la simulation, puis de calculer sa valeur moyenne.

Les tracés et le calcul des moyennes sont effectués en Python. Le programme de calcul fournit la matrice S des spins à la fin du calcul et la liste M des moments magnétiques calculés à chaque bloc d'itérations.

from pylab import *
from numpy import *
from math import *
def moyenne(M,n1,n2):
    m=0
    for i in range(n1,n2):
        m = m + M[i]
    return m/(n2-n1)

3.b. Résultats

La simulation est faite avec un réseau de 100x100 spins. Chaque bloc d'itérations en contient 100000, soit en moyenne 10 évaluations pour chaque spin. Pour chaque température, le nombre de blocs est choisi de manière à obtenir un régime d'apparence stationnaire.

La première température choisie est T=2.2, légèrement en dessous de la température critique. Voici le tableau de spins après 1000 blocs de 100000 itérations :

matshow(S)
title('T = 2.2')
plotAplotA.pdf

La courbe suivante montre l'évolution du moment magnétique, l'unité de l'abscisse correspondant à un bloc de 100000 itérations.

clf()
plot(M)
ylabel('M')
title('T = 2.2')
plotBplotB.pdf

Le moment magnétique moyen est calculé entre les blocs 200 et 1000 :

mm1=moyenne(M,200,1000)
print(mm1)
--> -7901

Le même calcul pour T=2 :

matshow(S)
title('T = 2')
plotCplotC.pdf
clf()
plot(M)
ylabel('M')
title('T = 2')
plotDplotD.pdf

Moment magnétique moyen :

mm2=moyenne(M,200,1000)
print(mm2)
--> 8901

Le même calcul pour T=1.5 :

matshow(S)
title('T = 1.5')
plotEplotE.pdf
clf()
plot(M)
ylabel('M')
title('T = 1.5')
plotFplotF.pdf

Moment magnétique moyen :

mm3=moyenne(M,200,1000)
print(mm3)
--> -9749

Le moment magnétique est pratiquement à sa valeur maximale (100x100)

Le même calcul pour T=1 :

matshow(S)
title('T = 1')
plotGplotG.pdf
clf()
plot(M)
ylabel('M')
title('T = 1')
plotHplotH.pdf

Moment magnétique moyen :

mm4=moyenne(M,200,1000)
print(mm4)
--> 9826

Pour le modèle d'Ising à deux dimensions, la température critique est Tc=2.26919.... Voici le résultat du calcul pour une température T=2.25 :

matshow(S)
title('T = 2.25')
plotIplotI.pdf
clf()
plot(M)
ylabel('M')
title('T = 2.25')
plotJplotJ.pdf

Moment magnétique moyen pour les blocs 1000 à 3000 :

mm5=moyenne(M,1000,3000)
print(mm5)
--> 6721

Lorsqu'on s'approche du point critique, les fluctuations du moment magnétique deviennent très grandes. Voici le résultat pour T=2.269, obtenus avec 5000 blocs de 100000 itérations :

matshow(S)
title('T = 2.269')
plotKplotK.pdf
clf()
plot(M)
ylabel('M')
title('T = 2.269')
plotLplotL.pdf

Moment magnétique moyen, calculé pour les blocs 1000 à 10000:

mm6=moyenne(M,1000,10000)
print(mm6)
--> -5740

Calcul pour une température au dessus du point critique T=2.3 :

matshow(S)
title('T = 2.3')
plotMplotM.pdf
clf()
plot(M)
ylabel('M')
title('T = 2.3')
plotNplotN.pdf

Moment magnétique moyen sur les 20000 blocs:

mm7=moyenne(M,0,20000)
print(mm7)
--> -351

On remarque de grandes fluctuations, avec un moment magnétique moyen faible.

Augmentons la température à T=2.5 :

matshow(S)
title('T = 2.5')
plotOplotO.pdf
clf()
plot(M)
ylabel('M')
title('T = 2.5')
plotPplotP.pdf

Moment magnétique moyen :

mm8=moyenne(M,200,1000)
print(mm8)
--> -202

Température T=3 :

matshow(S)
title('T = 3')
plotQplotQ.pdf
clf()
plot(M)
ylabel('M')
title('T = 3')
plotRplotR.pdf

Moment magnétique moyen :

mm9=moyenne(M,200,1000)
print(mm9)
--> 160

Moment magnétique moyen (valeur absolue) en fonction de la température obtenue par la simulation de Monte-Carlo (ronds bleus) et courbe théorique (en rouge) :

T=[1,1.5,2,2.2,2.25,2.269,2.3,2.5,3]
M0=10000.0
mm=[mm4,mm3,mm2,mm1,mm5,mm6,mm7,mm8,mm9]
n=len(mm)
for i in range(0,n):
    mm[i]=abs(mm[i])/M0
clf()
plot(T,mm,marker='o')
xlabel('T')
ylabel('M')
temp = arange(1.0,2.27,0.001)
moment = arange(1.0,2.27,0.001)
n=len(temp)
for i in range(0,n):
    moment[i]= pow((1.0-1.0/pow(sinh(2.0/temp[i]),4)),1/8.0)
plot(temp,moment,color='r')
plotAAplotAA.pdf

On remarque que la simulation est très délicate au voisinage du point critique en raison des fortes fluctuations du moment magnétique. En particulier pour T=2.3 (en théorie au dessus du point critique), il a fallu 20000x100000 itérations (plusieurs minutes de calcul).

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.