主程序
nx=3%
ny=100% 体系宽度(y方向的长度)
[x,y]=zigzag_graphene(nx,ny)
%plot(x,y,'.','MarkerSize',20)
t1=-2.7
t2=0.0038/3/sqrt(3)
H=Hamiltonian_NN_graphene(x,y,t1)
Hsp=Hamiltonian_Haldane(x,y,sqrt(3),t2)
H=H+Hsp
N=length(H)
HDL=H(N/3+1:N*2/3,1:N/3)
HD=H(N/3+1:N*2/3,N/3+1:N*2/3)
HDR=H(N/3+1:N*2/3,N*2/3+1:N)
n = length(HD)
dk = 0.01
kx=0:dk:2*pi% k空间路径
Ek=band_calculate(kx,HD,HDL,HDR)
plot(kx,Ek,'.')
set(gca,'YLim',[-0.5 0.5])%X轴的数据显示范围
坐标生成函数
function [x,y]=zigzag_graphene(nx,ny)
x1=zeros(4,1)
y1=zeros(4,1)
x1(1,1)=sqrt(3)/2
x1(2,1)=0
x1(3,1)=0
x1(4,1)=sqrt(3)/2
y1(1,1)=0
y1(2,1)=0.5
y1(3,1)=1.5
y1(4,1)=2
x2=x1
y2=y1
for i=1:ny-1
x2=[x2x1]
y2=[y2y1+i*ones(4,1)*3]
end
x=x2
y=y2
n=length(x2)
for i=1:nx-1
x=[xx2+i*ones(n,1)*sqrt(3)]
y=[yy2]
end
最近邻相互作用哈密顿量的生成
function H=Hamiltonian_NN_graphene(x,y,t)
%t=-2.7
N=length(x)
H=zeros(N,N)
eps=0.01
for i=1:N
for j=1:N
if abs(sqrt((x(i)-x(j))^2+(y(i)-y(j))^2)-1)
Haldane模型哈密顿量
function H=Hamiltonian_Haldane(x,y,a,t2)
N=length(x)
H=zeros(N,N)
for l=1:N
for j=1:N
if x(l)>x(j)&&y(l)==y(j)&&mod(j,2)==1&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=-1i*t2
end
if x(l)x(j)&&y(l)>y(j)&&mod(j,2)==1&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=1i*t2
end
if x(l)y(j)&&mod(j,2)==1&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=-1i*t2
end
if x(l)>x(j)&&y(l)x(j)&&y(l)==y(j)&&mod(j,2)==0&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=1i*t2
end
if x(l)x(j)&&y(l)>y(j)&&mod(j,2)==0&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=-1i*t2
end
if x(l)y(j)&&mod(j,2)==0&&abs(sqrt((x(j)-x(l))^2+(y(j)-y(l))^2)-a)<0.001
H(j,l)=1i*t2
end
if x(l)>x(j)&&y(l)
能带计算函数
function Ek=band_calculate(kx,HD,HDL,HDR)
dN = length(kx)
n = length(HD)
Ek = zeros(n,dN)
for i = 1:dN
Hk=HDL*exp(-1i*kx(i))+HD+HDR*exp(1i*kx(i))
[~,E]=eig(Hk)
Ek(:,i) = diag(E)
end
1、在matlab *** 作界面,word表格不可能调用,尽量用excel表格。2、matlab使用excel表格时,可又通过在界面 *** 作窗口的左上方,用创建新表格的方式创建一个空表格,再将excel表格调入即可转化为matlab可使用的数据矩阵。
3、从问题上看,x,y两个变量的维数应该一致,是一个n*1的n列1行的矩阵。
4、matlab关于函数式的表达,与代数式完全一样:a=((1/y)^(1/2))*x
5、如果x y两个变量的取值是正交方式,那么就要引入循环变量:for i=1:n,j=1:n,上式变为
aij==((1/yij)^(1/2))*xij
6、在matlab窗口下,可以先编程序,也可一条一条命令输入。如果是新手,建议一条一条输入,以便检查每一条的语法是否正确。
1、首先,建立一个自定义函数文件,如fun.m文件。文件内容为
function c=fun(a,b)
c=a+b
2、然后,在当前文件目录下,执行窗口命令
a=2b=5
c=fun(a,b)
3、运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)