给出一个用傅里叶展开法求二维能带结构的matlab代码
时间: 2024-03-01 13:51:01 浏览: 171
fuliye.m 傅里叶展开matlab代码
以下是一个用傅里叶展开法求解二维能带结构的Matlab代码示例:
```
% 建立晶格
a = 1; % 晶格常数
N = 50; % 晶格尺寸
[x,y] = meshgrid(-N/2:N/2-1); % 建立坐标系
r = sqrt(x.^2+y.^2); % 计算每个格点到原点的距离
theta = atan2(y,x); % 计算每个格点的极角
a1 = 2*pi/a*[1,0]; % 第一条倒格矢
a2 = 2*pi/a*[0,1]; % 第二条倒格矢
% 计算能量本征值
kx = linspace(-pi/a,pi/a,201); % 在第一布里渊区中均匀取201个点
ky = linspace(-pi/a,pi/a,201); % 在第二布里渊区中均匀取201个点
[E1,E2] = meshgrid(kx,ky); % 构建二维矩阵
E = zeros(size(E1)); % 初始化能量本征值矩阵
for i = 1:numel(kx)
for j = 1:numel(ky)
K = E1(i,j)*a1+E2(i,j)*a2; % 计算k点位置
psi = exp(1i*K(1)*x).*exp(1i*K(2)*y); % 计算平面波系数
H = 0.5*(cos(K(1)*a)+cos(K(2)*a))*eye(size(psi)) + ...
0.5*(cos(K(1)*a)-cos(K(2)*a))*circshift(eye(size(psi)),[1,0]) + ...
0.5*(cos(K(1)*a)+cos(K(2)*a))*circshift(eye(size(psi)),[0,1]); % 计算哈密顿量
[V,D] = eig(H); % 求解本征值和本征向量
E(i,j) = min(diag(D)); % 取最小本征值作为该点的能量本征值
end
end
% 绘制能带图
figure;
surf(E);
shading interp;
colormap(jet);
xlabel('k_x');
ylabel('k_y');
zlabel('Energy');
```
这段代码将在一个正方形二维晶格上计算能带结构,并绘制能带图。代码中的哈密顿量采用了最简单的二维紧束缚模型,只考虑了相邻格点之间的跃迁。实际应用中,哈密顿量的形式会更加复杂,需要根据具体情况进行调整。
阅读全文