function Exapmple_Ising_model
clear all
close all
clc
NX=16;NY=16; %格子尺寸
J=[0.0:0.05:0.3,0.305:0.005:0.605,0.61:0.05:0.92];
%耦合强度,并不等间隔的原因是为了加强0.3-0.6段的计算
B=0.0; %外磁场强度
N_therm=50; %热化扫描步数
N_group=10; %数据分组数目
N_size=50; %每组样本数
N_freq=5; %抽样间隔步数
S=zeros(NX,NY);
[N,S]=initialize(NX,NY); %初始化格子的自旋
S1=S
for iii=1:length(J)
JJ=J(iii); %依次取不同的J值,即不同的耦合强度
R=zeros(5,2); %R数组用于存放接受概率值,有10个矩阵元,即PPT中的(2)式
R=flip_probs(JJ,B);% %初始化R数组
for i=1:N_therm %做热化扫描
[S,accept]=thermal_sweep(NX,NY,S,R);
%accept/N %反转操作接受率
end
S2=S;
Sum_M=0; Sum_M2=0; Sum_SigM=0; %初始化待求物理量M, E,Chi,CB
Sum_E=0; Sum_E2=0; Sum_SigE=0;
Sum_Chi=0; Sum_Chi2=0;
Sum_CB=0; Sum_CB2=0;
for igroup=1:N_group
Group_M=0; Group_M2=0;
Group_E=0; Group_E2=0;
for sweep=1:N_size*N_freq %完成此轮循环,就完成了一组数值的计算
[S,accept]=thermal_sweep(NX,NY,S,R); %抽样前,先做热化扫描
%accept/N %反转操作接受率
if mod(sweep,N_freq)==0
[Magic,Energy]=Magic_Energy(B,JJ,NX,NY,S); %求出一种情况下的磁化强度和能量E
%一次抽样,获得M和E
Group_M=Group_M+Magic;
Group_M2=Group_M2+Magic^2;
Group_E=Group_E+Energy;
Group_E2=Group_E2+Energy^2;
end
end
%===================================
Group_M=Group_M/N_size; %组内抽样的平均,即期望值,PPT中的(1)式,教材中的(8.21a)
Group_M2=Group_M2/N_size;
Group_E=Group_E/N_size;
Group_E2=Group_E2/N_size;
Chi=Group_M2-Group_M^2; %(8.21b),一个组里面求得的磁化率
CB=Group_E2-Group_E^2; %(8.21d)
Sum_M=Sum_M+Group_M;
Sum_E=Sum_E+Group_E;
Sum_Chi=Sum_Chi+Chi;
Sum_CB=Sum_CB+CB;
end
E=Sum_E/N_group;
M=Sum_M/N_group;
Chi=Sum_Chi/N_group; %几个组求得的磁化率的平均
CB=Sum_CB/N_group;
CBB(iii)=CB; %用于存储不同J值对应的CB比热容
EE(iii)=E/N; %N为总格子数
MM(iii)=M/N;
Chi_1(iii)=Chi/N;
end %对应于for iii=1:length(J)
figure;plot(1./J,CBB,'r*-') %注意:由于1/0为无穷大,程序没有画出该点
title('比热随耦合强度的倒数的变化关系')
xlabel('1/J'); ylabel('C_B');
figure;plot(1./J,EE,'b') %J值大,意味着温度低,M值大
title('能量随耦合强度的倒数的变化关系')
xlabel('1/J'); ylabel('能量E');
figure;plot(1./J,MM,'r') %注意,磁化强度可以朝不同方向,因此可以为负
title('磁化强度随耦合强度的倒数的变化关系')
xlabel('1/J'); ylabel('磁化强度M');
figure;plot(1./J,Chi_1,'k')
title('磁化率随耦合强度的倒数的变化关系')
xlabel('1/J'); ylabel('磁化率Chi');
S
function [N,S]=initialize(NX,NY) %初始化每个格子的自旋
N=NX*NY;
for i=1:NY
for j=1:NX
if rand < 0.5
S(i,j)=1;
else
S(i,j)=-1;
end
end
end
function [Magic,Energy]=Magic_Energy(B,JJ,NX,NY,S) %求出一种情况下的磁化强度和能量E
Magic=0;
Sum_ss=0;
for i=1:NY
if i>1
IM=i-1;
else
IM=NY;
end
%====================
for j=1:NX
if j>1
JM=j-1;
else
JM=NX;
end
%==================
Magic=Magic+S(i,j);
Sum_ss=Sum_ss+S(i,j)*(S(IM,j)+S(i,JM));
%注意上式求和实际上是进行(8.18)式第一项的运算,但S(i,j)只与左格点和上格点相乘求和
%是因为如果上下左右四个格点都相乘求和,则存在重复计算的现象
end
end
Energy=-JJ*Sum_ss-B*Magic; %(8.18)式
function R=flip_probs(JJ,B) %设定翻转判定矩阵
for i=1:5
R(i,2)=exp(-2*(JJ*(2*i-6)+B)); %Sa为1
%自旋反转判定因子,page 147页的(8.23)式,PPT中的(2)式,R(:,2)代表中心点自旋向上
R(i,1)=exp(2*(JJ*(2*i-6)+B)); %分别对应于f=-4,-2, 0, 2, 4
end
function [S,accept]=thermal_sweep(NX,NY,S,R)
%热化扫描函数,每次热化扫描后,所有的点都被遍历一次
accept=0;
for i=1:NY
if i<NY %采用周期性边界条件,此if循环给定(i,j)粒子下面的相邻格点(i+1,j)
IP=i+1;
else
IP=1;
end
if i>1 %采用周期性边界条件,此if循环给定(i,j)粒子上面的相邻格点(i-1,j)
IM=i-1;
else
IM=NY;
end
%==================
for j=1:NX
if j<NX %采用周期性边界条件,此if循环给定(i,j)粒子右边的相邻格点(i,j+1)
JP=j+1;
else
JP=1;
end
if j>1 %采用周期性边界条件,此if循环给定(i,j)粒子左边的相邻格点(i,j-1)
JM=j-1;
else
JM=NX;
end
%==================
spin=S(i,j);
f=S(IP,j)+S(IM,j)+S(i,JP)+S(i,JM);
if rand>R(3+f/2,(3+spin)/2) %如果反转概率比随机数小,则不反转
%注意:f的取值只有-4,-2,0,2,4五种,spin只有-1,1两种,
%因此用R(5,2)二维数组即可以判定是否反转
% 这里的3+f/2, (3+spin)/2是将自旋转换到指标
else
S(i,j)=-spin; %反转(i,j)点的自旋
accept=accept+1;
end
end
end