1. 二维SSH模型计算概述
在凝聚态物理研究中,Su-Schrieffer-Heeger(SSH)模型作为研究拓扑绝缘体的经典模型,其二维扩展形式展现出更丰富的物理特性。本文将详细介绍如何利用Matlab从紧束缚模型出发,完整实现二维SSH模型的能带计算,包括投影能带和原胞能带的绘制方法。
2. 紧束缚模型理论基础
2.1 模型物理背景
二维SSH模型描述的是电子在具有二聚化结构的二维晶格中的运动行为。与一维情况不同,二维SSH模型中存在两个空间维度的耦合,这使得其能带结构展现出更复杂的拓扑特性。模型中的每个原胞包含两个不等价的格点(A和B),通过调节格点间的跳跃积分参数,可以研究系统的拓扑相变。
2.2 哈密顿量构建
系统的完整哈密顿量可表示为:
[ H = \sum_{\langle i,j\rangle} t_{ij} c_i^\dagger c_j + h.c. ]
其中:
- ( t_{ij} ) 表示格点i和j之间的跳跃积分
- ( c_i^\dagger ) 和 ( c_j ) 分别为产生和湮灭算符
- h.c. 表示厄米共轭项
在二维SSH模型中,我们通常考虑两种不同的跳跃积分:
- 原胞内跳跃积分 ( t_1 )
- 原胞间跳跃积分 ( t_2 )
3. Matlab实现细节
3.1 参数初始化
matlab复制% 基本参数设置
a = 1; % 晶格常数(单位:Å)
t1 = 1.0; % 原胞内跳跃积分(eV)
t2 = 0.8; % 原胞间跳跃积分(eV)
Nx = 20; % x方向原胞数
Ny = 20; % y方向原胞数
参数选择说明:
- 晶格常数a归一化为1简化计算
- t1 > t2的设置对应于拓扑非平庸相
- 系统尺寸需足够大以避免有限尺寸效应
3.2 哈密顿量矩阵构建
matlab复制% 总格点数计算(每个原胞含2个格点)
N = 2 * Nx * Ny;
H = zeros(N, N);
% 格点索引映射函数
get_index = @(nx, ny, sublattice) 2*( (nx-1)*Ny + (ny-1) ) + sublattice;
for nx = 1:Nx
for ny = 1:Ny
% 原胞内A-B耦合
idx_A = get_index(nx, ny, 1);
idx_B = get_index(nx, ny, 2);
H(idx_A, idx_B) = t1;
H(idx_B, idx_A) = t1;
% x方向原胞间耦合
if nx < Nx
idx_Ax = get_index(nx+1, ny, 1);
H(idx_B, idx_Ax) = t2;
H(idx_Ax, idx_B) = t2;
end
% y方向原胞间耦合
if ny < Ny
idx_By = get_index(nx, ny+1, 2);
H(idx_A, idx_By) = t2;
H(idx_By, idx_A) = t2;
end
end
end
关键点说明:
- 使用匿名函数简化格点索引计算
- 周期性边界条件可通过修改边界耦合项实现
- 矩阵构建时需确保厄米性
3.3 能带计算与可视化
matlab复制% 对角化哈密顿量
[V, D] = eig(H);
eigenvalues = diag(D);
% 能带可视化
figure;
histogram(eigenvalues, 100, 'Normalization','probability');
xlabel('能量(eV)');
ylabel('态密度');
title('二维SSH模型能带结构');
grid on;
4. 投影能带计算
4.1 投影算符构建
投影能带计算需要构造投影算符P_A:
[ P_A = \sum_{i\in A} |i\rangle\langle i| ]
matlab复制% 初始化投影矩阵
PA = zeros(N, N);
for nx = 1:Nx
for ny = 1:Ny
idx_A = get_index(nx, ny, 1);
PA(idx_A, idx_A) = 1;
end
end
% 计算投影能带
projected_bands = diag(V' * PA * V);
4.2 投影能带可视化
matlab复制figure;
scatter(1:N, eigenvalues, 20, projected_bands, 'filled');
colorbar;
xlabel('状态索引');
ylabel('能量(eV)');
title('A原子投影能带');
colormap(jet);
5. 原胞能带计算
5.1 动量空间表示
通过傅里叶变换将实空间哈密顿量转换为动量空间表示:
matlab复制% 布里渊区采样
nk = 50;
kx = linspace(-pi, pi, nk);
ky = linspace(-pi, pi, nk);
% 初始化能带存储
bands = zeros(nk, nk, 2);
for i = 1:nk
for j = 1:nk
% 动量空间哈密顿量
Hk = [0, t1 + t2*exp(-1i*kx(i)) + t2*exp(-1i*ky(j));
t1 + t2*exp(1i*kx(i)) + t2*exp(1i*ky(j)), 0];
% 对角化
[~, Dk] = eig(Hk);
bands(i,j,:) = diag(Dk);
end
end
5.2 能带三维可视化
matlab复制figure;
[X, Y] = meshgrid(kx, ky);
surf(X, Y, bands(:,:,1), 'EdgeColor', 'none');
hold on;
surf(X, Y, bands(:,:,2), 'EdgeColor', 'none');
xlabel('k_x');
ylabel('k_y');
zlabel('能量(eV)');
title('二维SSH模型原胞能带');
view(45, 30);
6. 计算优化与注意事项
6.1 稀疏矩阵优化
对于大系统尺寸,建议使用稀疏矩阵存储:
matlab复制H = sparse(N, N);
% ...矩阵构建过程相同...
[V, D] = eigs(H, 100, 'smallestreal'); % 只计算部分本征值
6.2 并行计算加速
利用parfor循环加速动量空间计算:
matlab复制bands = zeros(nk, nk, 2);
parfor i = 1:nk
for j = 1:nk
% 并行计算每个k点
end
end
6.3 常见问题排查
-
能带出现异常简并:
- 检查边界条件是否正确实现
- 确认跳跃积分参数设置合理
-
投影权重分布异常:
- 验证投影算符构建是否正确
- 检查本征态归一化
-
计算速度过慢:
- 转换为稀疏矩阵格式
- 减少不必要的存储操作
7. 物理结果分析
通过上述计算,我们可以观察到:
- 当t1 > t2时,系统处于拓扑非平庸相,存在边缘态
- 能带结构中可能出现狄拉克锥等特征
- 投影能带显示不同原子对能带的贡献差异
matlab复制% 拓扑不变量计算示例
Chern_number = 0;
for i = 1:nk-1
for j = 1:nk-1
% 计算贝里曲率并积分
end
end
8. 扩展应用
本方法可进一步扩展用于:
- 研究无序对拓扑相的影响
- 加入电子-声子耦合效应
- 研究非线性光学响应
matlab复制% 示例:加入在位能扰动
delta = 0.2; % 在位能差异
H = H + delta * kron(eye(N/2), [1, 0; 0, -1]);
在实际研究中,建议先在小系统上验证代码正确性,再逐步扩大系统尺寸。对于更复杂的模型,可以考虑使用专业的第一性原理计算软件作为补充。