小白,这个很easy的模型我的算法比较冗杂,而且以前主要用的mma,第一次用matlab…主要是想说明一下物理思路
先上图
%第一次用matlab,物理系学生,没有系统的接触过编程,不是很熟悉,很多算法很冗杂,甚至有些公式不是很精确,望见谅
%缺点:循环有两个,运算较慢
%建立一个随机矩阵,再选取任意一点比较反向和不反向的能量差别,确定是否翻转
clear all
S=2*(randi([0,1],100,100)-0.5)%建立随机1,-1矩阵,由于是伪随机数,可能有很大误差
J=1
H=0.2
for l=1:9
x=[400,600,800,1000,1200,1400,1600,1800,2000]
T=x(l)
E=0
for t=1:6500
i=randi([2,99])%忽略边界,如果需要讨论,分别取i,j等于1,100即可
j=randi([2,99])
a=[i-1,j;i+1,j;i,j-1;i,j+1]
%随机取一个相邻原子
b=randi([1,4])
c=a(b,:)
i1=c(1)
j1=c(2)
Energybefore=-J*S(i,j)*S(i1,j1)-H*S(i,j)*S(i1,j1)
Energyafter=J*S(i,j)*S(i1,j1)+H*S(i,j)*S(i1,j1)
Energydifference=Energyafter-Energybefore
p=1/(1+exp(Energydifference/T));
if (Energydifference<0)
S(i,j)=-S(i,j)
e=p*Energyafter+(1-p)* Energybefore%期望值
else S(i,j)=S(i,j)
e=Energybefore;
end
if t>1000 %1000次以后可以认为达到了热平衡
E=E+e/5500
end
end
if (l==1)
E1=E
S1=S
elseif (l==2)
E2=E
S2=S
elseif (l==3)
E3=E
S3=S
elseif (l==4)
E4=E
S4=S
elseif (l==5)
E5=E
S5=S
elseif (l==6)
E6=E
S6=S
elseif (l==7)
E7=E
S7=S
elseif (l==8)
E8=E
S8=S
elseif (l==9)
E9=E
S9=S
end
end
y=[E1,E2,E3,E4,E5,E6,E7,E8,E9]
figure(1)
scatter(x,y,'filled')
xlabel('温度')
ylabel('平均势能')
figure(2)
subplot(3,3,1)
imshow(S1)
title('在400k的磁矩分布')
subplot(3,3,2)
imshow(S2)
title('在600k的磁矩分布')
subplot(3,3,3)
imshow(S3)
title('在800k的磁矩分布')
subplot(3,3,4)
imshow(S4)
title('在1000k的磁矩分布')
subplot(3,3,5)
imshow(S5)
title('在1200k的磁矩分布')
subplot(3,3,6)
imshow(S6)
title('在1400k的磁矩分布')
subplot(3,3,7)
imshow(S7)
title('在1600k的磁矩分布')
subplot(3,3,8)
imshow(S8)
title('在1800k的磁矩分布')
subplot(3,3,9)
imshow(S9)
title('在2000k的磁矩分布')