1. 二维SSH模型与Matlab计算概述
在凝聚态物理研究中,Su-Schrieffer-Heeger(SSH)模型作为拓扑绝缘体的经典范例,因其简单的数学形式和丰富的物理内涵而备受关注。这个一维链模型最初用于描述聚乙炔中的电子行为,而它的二维扩展版本则展现出更复杂的拓扑特性。Matlab凭借其强大的矩阵运算能力和可视化工具,成为实现这类紧束缚模型计算的理想选择。
我最近在复现一篇关于二维SSH模型的论文时,发现现有教程大多聚焦于一维情况,而二维模型的计算流程存在几个关键差异点:首先是原胞的构建需要考虑二维周期性,其次是布里渊区的路径选择会影响能带结构的呈现方式。本文将分享如何用Matlab完整实现从紧束缚哈密顿量构建到两种能带(投影能带和原胞能带)计算的全过程,特别会强调二维情况下特有的参数设置技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二维SSH模型的紧束缚实现
2.1 模型构建与参数设定
二维SSH模型可以看作是两个一维SSH链的交叉组合,其哈密顿量包含胞内 hopping (t1) 和胞间 hopping (t2) 两种跃迁项。在Matlab中,我们首先需要明确定义这些参数:
matlab复制% 基本参数设置
t1 = 1.0; % 胞内跃迁强度
t2 = 0.5; % 胞间跃迁强度
Nx = 50; % x方向原胞数
Ny = 50; % y方向原胞数
这里t1和t2的比值决定了系统的拓扑相:当t2/t1 > 1时系统处于拓扑非平庸相,存在边缘态。为方便后续计算,我建议将晶格常数设为1,这样动量空间的范围就是[-π, π]。
2.2 实空间哈密顿量构建
二维SSH模型的实空间哈密顿量是一个稀疏矩阵,其非零元素对应着电子在不同格点间的跃迁。在Matlab中,我们可以利用sparse矩阵高效存储:
matlab复制% 初始化哈密顿量矩阵
dim = 2*Nx*Ny; % 每个原胞含2个原子
H = sparse(dim, dim);
% 构建跃迁项
for ix = 1:Nx
for iy = 1:Ny
% 计算当前原胞索引
idx = (ix-1)*Ny + iy;
% 胞内跃迁 (A-B)
H(2*idx-1, 2*idx) = t1;
H(2*idx, 2*idx-1) = t1';
% x方向胞间跃迁
if ix < Nx
H(2*idx, 2*idx+1) = t2;
H(2*idx+1, 2*idx) = t2';
end
% y方向胞间跃迁
if iy < Ny
H(2*idx-1, 2*idx+2*Ny-1) = t2;
H(2*idx+2*Ny-1, 2*idx-1) = t2';
end
end
end
注意:在二维情况下,周期性边界条件的处理需要特别小心。上述代码中,我们故意没有闭合x和y方向的边界,这是为了后续能带计算时方便区分体态和边缘态。
3. 动量空间变换与能带计算
3.1 傅里叶变换到动量空间
为了计算能带结构,我们需要将实空间哈密顿量转换到动量空间。对于二维系统,这需要执行二维傅里叶变换:
matlab复制% 设置k点路径 (通常取高对称点路径)
kpts = 100;
kx = linspace(-pi, pi, kpts);
ky = linspace(-pi, pi, kpts);
% 初始化能带存储矩阵
bands = zeros(2, kpts, kpts); % 每个k点有2个能级
for ikx = 1:kpts
for iky = 1:kpts
% 构造动量空间哈密顿量
Hk = zeros(2,2); % 二维SSH每个原胞有2个原子
% 胞内项
Hk(1,2) = t1;
Hk(2,1) = conj(t1);
% x方向跃迁
Hk(2,1) = Hk(2,1) + t2 * exp(1i*kx(ikx));
Hk(1,2) = Hk(1,2) + t2 * exp(-1i*kx(ikx));
% y方向跃迁
Hk(1,2) = Hk(1,2) + t2 * exp(1i*ky(iky));
Hk(2,1) = Hk(2,1) + t2 * exp(-1i*ky(iky));
% 对角化
[V,D] = eig(Hk);
bands(:,ikx,iky) = diag(D);
end
end
3.2 能带可视化技巧
二维系统的能带可视化比一维复杂,常用的有两种方法:
- 投影能带:沿特定高对称路径(如Γ-X-M-Γ)计算
- 原胞能带:在整个布里渊区计算并绘制能带面
matlab复制% 投影能带绘制示例
figure;
hold on;
plot(squeeze(bands(1,:,1)), 'b-'); % 沿kx轴
plot(squeeze(bands(1,1,:)), 'r-'); % 沿ky轴
xlabel('k-path');
ylabel('Energy');
legend({'Γ-X', 'Γ-Y'});
% 原胞能带三维绘图
figure;
[X,Y] = meshgrid(kx,ky);
surf(X,Y,squeeze(bands(1,:,:))');
xlabel('k_x');
ylabel('k_y');
zlabel('Energy');
实操提示:对于大体系计算,建议先用少量k点测试能带形状,确认无误后再增加k点密度。我曾因直接使用200个k点计算导致Matlab内存不足,后来发现100个k点已经能获得平滑的能带曲线。
4. 拓扑特性分析与边缘态
4.1 威尔逊环计算
二维SSH模型的拓扑性质可以通过威尔逊环(Wilson loop)来表征。这需要计算贝里联络(Berry connection)的积分:
matlab复制% 计算贝里联络
berry_connection = zeros(kpts,kpts);
for ikx = 1:kpts-1
for iky = 1:kpts-1
% 获取相邻k点的波函数
psi1 = V(:,1,ikx,iky);
psi2 = V(:,1,ikx+1,iky);
psi3 = V(:,1,ikx,iky+1);
% 计算贝里联络
berry_connection(ikx,iky) = angle(psi1'*psi2 * psi2'*psi3 * psi3'*psi1);
end
end
% 计算威尔逊环
wilson_loop = exp(1i * sum(sum(berry_connection)));
4.2 边缘态可视化
为观察边缘态,我们需要在实空间计算并绘制局域态密度(LDOS):
matlab复制% 计算实空间LDOS
[V,D] = eig(full(H));
ldos = sum(abs(V(:,1:10)).^2, 2); % 取前10个本征态
% 重新排列为空间分布
ldos_map = reshape(ldos, [2, Nx, Ny]);
ldos_A = squeeze(ldos_map(1,:,:));
ldos_B = squeeze(ldos_map(2,:,:));
% 绘制边缘态
figure;
imagesc(ldos_A + ldos_B);
colorbar;
title('Local Density of States');
5. 常见问题与调试技巧
在实际计算过程中,我遇到过几个典型问题及解决方案:
-
能带出现虚部:
- 原因:哈密顿量不是厄米的
- 检查:确保H - H' ≈ 0
- 解决:仔细检查hopping项的共轭对称性
-
边缘态不明显:
- 原因:系统尺寸太小或t2/t1比值不合适
- 解决:增大Nx,Ny至至少50,调整t2/t1 > 1
-
内存不足:
- 原因:直接使用full矩阵存储
- 解决:尽可能使用sparse矩阵格式
-
能带折叠:
- 原因:原胞定义不正确
- 解决:检查哈密顿量中原胞间的连接方式
一个实用的调试技巧是先用小系统(如4×4原胞)计算,手动验证几个k点的结果是否正确。我曾通过这种方法发现了一个hopping项相位符号的错误。
6. 性能优化建议
对于大体系计算,以下优化措施可以显著提升计算效率:
- 矢量化计算:将k点循环改为矩阵运算
matlab复制% 矢量化示例
[kx_grid, ky_grid] = meshgrid(kx, ky);
Hk11 = zeros(size(kx_grid));
Hk12 = t1 + t2*(exp(1i*kx_grid) + exp(1i*ky_grid));
Hk = arrayfun(@(h12) [0 h12; conj(h12) 0], Hk12, 'UniformOutput', false);
- 并行计算:利用parfor并行化k点循环
matlab复制parfor ikx = 1:kpts
% 并行计算每个kx
end
- GPU加速:将矩阵运算迁移到GPU
matlab复制H_gpu = gpuArray(H);
[V_gpu, D_gpu] = eig(H_gpu);
在我的测试中,对于100×100的超胞计算,使用GPU加速可以将对角化时间从30分钟缩短到2分钟。不过要注意GPU内存限制,必要时可以分批计算。
通过这个二维SSH模型的实现过程,我们不仅能够研究其拓扑性质,还可以将此方法推广到其他二维晶格模型的计算中。掌握这些技巧后,尝试修改模型参数(如加入次近邻跃迁或在位能项),观察能带结构和拓扑特性的变化,会是很好的延伸学习方向。
