matlab计算石墨烯能带结构的算法是什么

matlab计算石墨烯能带结构的算法是什么,第1张

这个程序是初步优化后的matlab版本,主要思路是先生成体系的格点坐标,再运用坐标生成体系的哈密顿量,然后进行对角化计算能带,能带的计算使用一维体系超原胞的处理方法。可以进一步优化

主程序

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、运行结果


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12160229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存