Matlab蒙特卡洛模擬二維伊辛模型相變過程

一、什麼是伊辛模型

伊辛(Ising)模型是描述磁系統相變最簡單的模型,但模型裏自旋之間的相互作用賦予了它奇妙的特性,最有趣的就是對稱性破缺。這一模型可以被推廣用於研究連續的量子相變、基本粒子超弦理論、動力學臨界行爲等,甚至被認爲可以描述深林火災、交通擁堵、輿論傳播等社會經濟現象。
伊辛模型介紹
如圖,每個格點的方向只有向上或向下兩者狀態,但臨近的自旋之間有相互作用,而且點陣可以是一維、二維、三維、甚至更高維,這兩個特點讓伊辛模型的嚴格求解成爲了世紀難題。爲了定量描述這個系統的能量,我們假設第ii個格點的自旋爲sis_isis_i只能取+1或-1,如果相鄰兩個格點同方向,則它們相互作用的能量更小,設爲J-J,如果爲反方向,則爲JJJJ稱爲耦合係數,通常爲正值,代表鐵磁系統,如果JJ爲負值,則代表反鐵磁系統。如果外磁場的強度爲B,格點的自旋磁矩爲μ\mu,那麼可以寫出這個體系的哈密頓量:
H=J<ij>sisjμBi=1Nsi H=-J\sum_{<ij>}s_i s_j-\mu B \sum_{i=1}^N s_i

自發對稱性破缺

我們先定性地瞭解一下這個系統的性質,令外磁場零,當溫度T0T\rightarrow 0時,體系爲了保持能量最低,所用的格點趨向於同方向,系統整體要麼向下,要麼向上,呈現強磁性。當溫度TT\rightarrow \infty時,系統熱運動占主導地位,格點方向呈現隨機性,系統整體不帶磁性,從上或從下觀察體系,呈現出對稱性,或者說無法通過系統磁性區分上或下。現在再考慮,當溫度T從\infty逐漸降溫,那麼系統必定存在某個溫度TcT_c,高於此溫度時系統無磁性,低於此溫度時,系統磁性逐漸加強。這個溫度就是臨界溫度,也是相變點,系統從對稱磁體轉變爲非對稱磁體,而這就是對稱性破缺,因爲這種破缺不是外界擾動(如外加磁場)引起的,而是由內部的關聯作用力造成的,所以稱之爲自發的對稱性破缺。
自發對稱性破缺
上圖就是對自發對稱性破缺的定性描述,當逐漸降溫到TcT_c時,系統磁性開始出現分化,要麼向下要麼向上,最終平均的磁化強度s\overline{s}趨向於+1或-1。

我們感興趣的問題主要有兩個:第一,不同維度、不同分佈的格點,其臨界溫度TcT_c是多少;第二,TcT_c附近,s\overline{s}隨溫度TT以什麼樣的冪指數α\alpha趨近於TcT_c
s(TcT)α \overline{s}\sim(T_c-T)^{\alpha}

統計物理的思路

我們先考慮簡單的9個格點的例子,實際格點數的量級爲102910^{29}
簡單例子
假設格點耦合強度J=1J=1,那麼這個9格點體系的能量爲:
E=[(1+1)+(2+1)+(2)+(21)+(3+1)+(1+2)+(1+1)+(1+2)+2]/2=2 E=[(-1+1)+(-2+1)+(2)+(2-1)+(-3+1)+(-1+2)+(-1+1)+(-1+2)+2]/2=2
第一個格點有兩個相鄰格點,右邊的與其同向,耦合能爲-1,下面的與其反向,耦合能爲1;第二個格點有三個相鄰格點,左和下與其同向,耦合能爲-2,右邊與其反向,耦合能爲1。類似的可以計算其餘格點的耦合能。最後除以2是因爲每個相互作用重複計算了一次。而這一特定分佈以某概率P出現:
PeE/kT P\varpropto e^{-E/kT}
對於9個格點的體系,總共有29=5122^9=512種分佈,每種分佈的出現概率於其總能量有關,所以分佈概率滿足歸一化條件。給定不同溫度,我們可以計算出不同溫度下平均磁化率的數學期望s\overline{s},得到sT\overline{s}-T的曲線。

但是對於粒子爲102910^{29}量級的格點,可能的分佈有210292^{10^{29}}種,根本不可能統計出結果。

一維的情況可以通過數學上的處理,最終可以提出N,並得到Tc=0T_c=0,也就是說一維的伊辛模型不會有自發的對稱性破缺,這是因爲一維的格點只有兩個相鄰格點,相互作用太弱,不足以對抗熱運動,始終表現爲整體0磁化率的對稱狀態。

二維的情況下,如果用平均場近似的方法(具體可以參考林宗涵的熱力學與統計物理),基本思想是將相互作用的耦合能轉化爲外磁場強度,這就可以用近獨立的模型來計算配分函數,進而得到所有的統計量,獲得的臨界溫度爲 Tc=2JkT_c= \frac{2J}{k},平均磁化率:
s(TcT)1/2        (TTc) \overline{s}\sim(T_c-T)^{1/2} ~~~~~~~~(T\rightarrow T_c^-)

1944年,昂薩格推導出了二維伊辛模型的嚴格解,臨界溫度Tc=2.269JkT_c=\frac {2.269J}{k},平均磁化率:
s(TcT)1/8         (TTc) \overline{s}\sim(T_c-T)^{1/8} ~~~~~~~~~(T\rightarrow T_c^-)

二、二維伊辛模型的精確解

平均磁化率s\overline s

這裏只列出二維伊辛模型精確解的結論,推導過於複雜,定義β1kT\beta\equiv \frac{1}{kT},則平均磁化率:
s={0,T>Tc[1sinh(2βJ)4]1/8,TTc \overline{s} =\begin{cases} 0,&{T>T_c} \\ [1-\sinh(2\beta J)^{-4}]^{1/8}, &{T\leq T_c}\end{cases}
sinh(2βJ)=0\sinh(2\beta J)=0可以解得:Tc=2Jkln(1+2)2.269JkT_c=\frac{2J}{k\ln(1+\sqrt{2})}\approx \frac{2.269J}{k},令T=TcδTT=T_c-\delta T,小量泰勒展開化簡可以得到:
s=[42JkTccosh(2JkTc)δTTc]1/8=1.224[1TTc]1/8(TcT)1/8 \overline{s}=[4·\frac{2J}{kT_c}\cosh(\frac{2J}{kT_c})·\frac{\delta T}{T_c}]^{1/8}=1.224[1-\frac{T}{T_c}]^{1/8}\sim(T_c-T)^{1/8}
Tc0T_c \rightarrow 0時,容易得到結果爲1,表面所有的格點同向,平均磁化率爲1。

假設耦合強度JJ等於1開爾文溫度下的熱運動能量,即J=kJ=k,做出sT\overline{s}-T曲線如下:
平均磁化強度s-T

平均能量和比熱

另一個能夠判斷相變的參數是比熱Cv=dEdTC_v=\frac{d \overline{E}}{dT},這裏的E\overline{E}表示單個格點的平均能量,定性來看,當溫度趨於0時,所有格點同向,E=4/2=2\overline{E}=-4/2=-2,當溫度趨於無窮時,格點方向隨機,某格點四周平均有兩個同向和兩個方向,E=0\overline{E}=0。其曲線如下(令J=kJ=k):
能量與比熱隨溫度的變化圖

這裏的比熱在臨界溫度時會突然增大,表面臨界溫度附近變化有個小溫度變化,需要吸收極大能量,這也很符合相變的特點。具體的計算公式和matlab代碼詳見附錄A。

雖然大體瞭解了相變的過程,以及理論上的精確解,我們能否通過實驗的方式,驗證這一結論呢?藉助計算機模擬這一過程來驗證結果呢?

三、二維伊辛模型模擬

因爲不可能遍歷所有的格點組合,我們只能利用採樣的方式去計算平均能量,採樣的條件應該是體系在某個溫度下已經平衡。 計算機模擬的基本思想是,首先隨機給定一種分佈,在特定溫度下,讓體系趨向平衡,再在這個平衡體系中採樣求平均。

  • 假設體系有20×2020\times 20的格點,初始時同一分佈,相當於溫度很低;
  • 我們設定一個希望“加熱”到的平衡溫度T0T_0,接下來是模擬最關鍵的地方,如何改變格點的分佈以趨向於設定溫度T0T_0
    1、我們先任意選擇一個格點,計算改變這個格點的能量變化ΔE\Delta E,因爲體系出現的概率正比於eE/kTe^{-E/kT},那麼格點變化前後兩個體系出現的概率比爲eΔE/kTe^{-\Delta E/kT},或者說格點改變的概率與不改變的概率比爲:1:eΔE/kT1:e^{-\Delta E/kT},那麼格點需要改變的概率爲eΔE/kTe^{-\Delta E/kT},因此我們產生一個(0,1)概率隨機數,如果它小於eΔE/kTe^{-\Delta E/kT}則選擇改變格點;
    2、重複1的步驟,直到體系相對平穩,這個過程稱爲馬爾可夫鏈,之後在平穩的體系下采樣若干次並做統計平均,獲得平均能量E\overline E,平均磁化率s\overline s,以及描述能量方差的比熱CvC_v
    3、設定另一個希望考察的溫度,重複1、2步驟,獲得該溫度下的統計參數,並和理論值比較。

我們同樣假設J=kJ=k,選取格點數爲20×2020\times 20。臨界溫度點附近,馬爾可夫鏈長取5萬次,採樣數爲25萬次;其他溫度點馬爾可夫鏈長1萬次,採樣數爲5萬次。這是因爲臨界溫度附近的漲落很大,需要更長的時間趨向平衡,需要更多的統計樣本獲得較準確平均值。詳細的代碼及解釋可以參看附錄B。

模擬平均磁化率 sT\overline{s}-T

平均磁化率的模擬結果

可以看出平均磁化率在臨界溫度附近很不穩定,這是因爲臨界相變時漲落很大的緣故,高溫時的磁化率不是嚴格的零,可能與格點數少和馬爾可夫鏈較短有關係,如何確定TcT_c呢?通過平均磁化率求TcT_c比較困難,一般是通過比熱CvC_v發散的位置確定Tc2.3T_c\approx 2.3,參考下一部分。

選取T=1.7~2.2的16個數據點,擬合曲線:
lnsαln(TcT) \ln\overline{s}\sim \alpha \ln(T_c-T)
得到α0.12,R2=0.89\alpha \approx 0.12,R^2=0.89,這和理論值1/8=0.1251/8=0.125相當接近。

模擬平均能量 ET\overline{E}-T

平均能量和比熱的模擬結果

在臨界溫度附近進行了較密集的溫度取點,而且加長了馬爾可夫鏈,但是仍能看到較大的漲落,可以通過這個現象來確定臨界溫度Tc2.3T_c\approx 2.3

最後,讓我們欣賞一下格點從同一分佈到臨界溫度的變化過程吧,爲了便於觀察,選擇40X40的格點,馬爾可夫鏈長爲1萬:

初始同一分佈的格點,逐漸趨向於高溫T=5T=5下的平衡態,格點最後呈現隨機分佈:
T=5,初始爲有序

初始同一分佈的格點,溫度降低至T=3T=3的平衡態,格點最後呈現小塊狀:
T=3,初始爲有序

初始無序分佈的格點,溫度降低到臨界溫度T=2.3T=2.3時,格點最後呈現的塊狀增大。
T=2.3,初始爲無序

初始無序分佈的格點,溫度降低到臨界溫度以下T=2T=2,格點最後呈現的大的塊狀,說明已經發生了明顯的相變。
T=2,初始爲無序

初始無序分佈的格點,溫度降低更多至T=1T=1,格點越來越趨向於同一分佈。
T=1,初始爲無序

附錄

A、平均能量和比熱的精確解:(前方高能)

定義β1/kT\beta \equiv 1/kT
E=Jcot(2βJ)×[1+2πAB(λ)] \overline E=-J\cot(2\beta J)\times[1+\frac{2}{\pi}A·B(\lambda)]
{A2tanh(2βJ)21B(λ)0π/2dϕ1λ2sinϕ2λ2sinh(2βJ)cosh(2βJ)2 \begin{cases} A\equiv 2\tanh(2\beta J)^2-1\\ B(\lambda)\equiv \int_0^{\pi/2} \frac{d\phi}{\sqrt{1-\lambda^2\sin\phi ^2}}\\ \lambda\equiv \frac{2\sinh(2\beta J)}{\cosh(2\beta J)^2} \end{cases}
帝國主義都是紙老虎,我們仔細發現,只要確定了溫度TTβ\beta,那麼可以依次確定λ,B(λ),A,E\lambda,B(\lambda),A,\overline E,也就是平均能量和溫度是一一對應的,最後通過求導得到比熱Cv=dE/dTC_v=d \overline E/d T

%matlab code
clear;clc;
beta=0.1:0.01:1; %溫度從10到1
for i=1:1:size(beta,2);%遍歷beta
lambda=2.*sinh(2.*beta(i))./cosh(2.*beta(i)).^2;%計算lambda
phi=linspace(0,pi/2,1000);%求B的積分參數
b=1./sqrt(1-lambda.^2.*sin(phi).^2);
B=trapz(phi,b);%積分B(lambda)
A=2*tanh(2.*beta(i)).^2-1;
e_bar(i)=-coth(2.*beta(i)).*(1+2/pi.*A.*B); %每個格點的平均能量
end
%%
plot(1./beta,e_bar,'k','LineWidth',2);hold on;%E-T曲線
beta1=beta(2:end)/2+beta(1:end-1)/2;
cv=-beta1.^2.*diff(e_bar)./diff(beta); %對能量求導得到比熱
plot(1./beta1,cv,'r','LineWidth',2);

平均能量和比熱隨溫度的變化圖

B、蒙特卡洛馬爾可夫鏈模擬二維伊辛模型相變過程

具體細節詳見代碼:

%matlab code
clear;clc;
n=10000;                       %馬爾可夫鏈長度1萬
ns=20;                          %20*20的格點 
beta_mc=(0.1:0.01:0.4);         %溫度從10到2.5,鏈長1萬,樣品長5萬
%T_mc=(2.1:0.01:2.4);          %第三批模擬溫度設定,臨界溫度附近取點更密集,還要調整n=50000
%beta_mc=1./T_mc;
tic;                               %計時用,n=10000時,通常需要跑一分多鐘
for jj=1:1:size(beta_mc,2)
X=sign(rand(ns,ns));        %所有格點方向一致,相當於從0度開始升溫
%馬爾可夫鏈長度爲5萬次
for j=1:1:n
    %隨機選取一個格點,行列存儲在index[1,2]
    index=unidrnd(ns,1,2);      
    % 利用週期性邊界條件,分別計算格點上下左右四個點行列座標
    tmp1=rem(index(1),ns)+1;tmp2=rem(index(1)+1,ns)+1;tmp3=rem(index(1)-1,ns)+1;
    tmp4=rem(index(2),ns)+1;tmp5=rem(index(2)+1,ns)+1;tmp6=rem(index(2)-1,ns)+1;
    % 計算改變格點方向後的能量變化
    cen=X(tmp1,tmp4);right=X(tmp1,tmp5);left=X(tmp1,tmp6);
    up= X(tmp2,tmp4);down= X(tmp3,tmp4);
    deE=2*cen*(right+left+up+down);
    % 判斷是否改變格點
    if rand<exp(-deE*beta_mc(jj))
        X(tmp1,tmp4)=-X(tmp1,tmp4);
    end
end    

% 取樣5萬次,平衡時同樣需要判斷是否改變格點
for j=1:1:5*n
    index=unidrnd(ns,1,2);
    % 利用週期性邊界條件,分別計算格點上下左右四個點行列座標
    tmp1=rem(index(1),ns)+1;tmp2=rem(index(1)+1,ns)+1;tmp3=rem(index(1)-1,ns)+1;
    tmp4=rem(index(2),ns)+1;tmp5=rem(index(2)+1,ns)+1;tmp6=rem(index(2)-1,ns)+1;
    % 計算改變格點方向後的能量變化
    cen=X(tmp1,tmp4);right=X(tmp1,tmp5);left=X(tmp1,tmp6);
    up= X(tmp2,tmp4);down= X(tmp3,tmp4);
    deE=2*cen*(right+left+up+down);
    % 判斷是否改變格點
    if rand<exp(-deE*beta_mc(jj))
        X(tmp1,tmp4)=-X(tmp1,tmp4);
    end
    %計算一種特定分佈時的平均磁化率
    m(j)=abs(mean(mean(X)));  
	%計算一種特定分佈時的平均能量
    Xt1=X;Xt1(1,:)=[];Xt1=[Xt1; X(1,:)];
    Xt2=X;Xt2(:,1)=[];Xt2=[Xt2, X(:,1)];
    e(j)=-mean(mean(X.*Xt1+X.*Xt2));
end
% 特定溫度下的統計量
m_bar(jj)=mean(m);   
e_bar(jj)=mean(e);
cv_bar(jj)=beta_mc(jj)^2*ns^2*std(e)^2;
end
toc;
% 作圖觀察
figure(1);
plot(1./beta_mc,m_bar,'ko');
figure(2);
plot(1./beta_mc,e_bar,'ko');
figure(3);
plot(1./beta_mc,cv_bar,'ro');

20X20格點,從同一分佈開始升溫,分佈進行了三批溫度選擇:

  • β=(0.1:0.01:0.4)\beta=(0.1:0.01:0.4) 31個溫度點,T[2.5,10]T\in[2.5,10]馬爾可夫鏈長度爲1萬次,採樣5萬次。
  • T=(0.1:0.1:2.1)T=(0.1:0.1:2.1) 21個溫度點,$馬爾可夫鏈長度爲1萬次,採樣5萬次。
  • T=(2.1:0.01:2.4)T=(2.1:0.01:2.4) 31個溫度點,馬爾可夫鏈長度爲5萬次,採樣25萬次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章