用Matlab计算二维SSH模型:从紧束缚模型到投影能带与原胞能带
基于紧束缚模型,使用matlab计算二维SSH模型,结果是投影能带和原胞能带 注:这个是对文章的重复结果

在凝聚态物理领域,二维SSH模型是一个非常有趣且重要的研究对象,通过紧束缚模型来对其进行理论计算,能让我们深入了解该模型的电子结构特性。今天就来聊聊如何用Matlab实现基于紧束缚模型的二维SSH模型计算,并得到投影能带和原胞能带。
紧束缚模型基础
紧束缚模型假设电子在原子附近时,主要受到该原子势场的作用,而与其他原子的相互作用相对较弱。对于二维SSH模型,我们考虑一个由两种不同原子(比如A和B)组成的二维晶格结构。在这种模型下,电子的哈密顿量可以写成:

\[ H = \sum{} t{ij} ci^{\dagger} cj \]

基于紧束缚模型,使用matlab计算二维SSH模型,结果是投影能带和原胞能带 注:这个是对文章的重复结果

其中 \( ci^{\dagger} \) 和 \( cj \) 分别是产生和湮灭算符,\( t{ij} \) 是电子在格点 \( i \) 和 \( j \) 之间的跳跃积分。在二维SSH模型中,\( t{ij} \) 会根据格点的类型和位置有所不同。
Matlab实现
定义模型参数
首先,我们在Matlab里定义一些关键参数,比如晶格常数、跳跃积分等。
% 定义晶格常数
a = 1;
% 定义最近邻跳跃积分
t1 = 1;
t2 = 0.8;
% 定义晶格尺寸
Nx = 10;
Ny = 10;
这里我们设定了晶格常数 \( a \),以及两种不同的最近邻跳跃积分 \( t1 \) 和 \( t2 \),并定义了二维晶格在 \( x \) 和 \( y \) 方向的格点数 \( Nx \) 和 \( Ny \)。
构建哈密顿量矩阵
接下来构建哈密顿量矩阵,这是整个计算的核心部分。
% 总格点数
N = Nx * Ny * 2;
H = zeros(N, N);
for i = 1:Nx
for j = 1:Ny
% A格点索引
index_A = (i - 1) * Ny * 2 + (j - 1) * 2 + 1;
% B格点索引
index_B = (i - 1) * Ny * 2 + (j - 1) * 2 + 2;
% 同一原胞内A - B跳跃
H(index_A, index_B) = t1;
H(index_B, index_A) = t1;
% x方向相邻原胞跳跃
if i < Nx
index_A_next = i * Ny * 2 + (j - 1) * 2 + 1;
H(index_A, index_A_next) = t2;
H(index_A_next, index_A) = t2;
end
% y方向相邻原胞跳跃
if j < Ny
index_B_next = (i - 1) * Ny * 2 + j * 2 + 1;
H(index_B, index_B_next) = t2;
H(index_B_next, index_B) = t2;
end
end
end
这段代码中,我们首先计算了总格点数 \( N \),并初始化一个零矩阵 \( H \) 用于存储哈密顿量。然后通过两层循环遍历所有格点,分别处理同一原胞内A - B格点间的跳跃以及相邻原胞间的跳跃,并根据跳跃积分 \( t1 \) 和 \( t2 \) 填充哈密顿量矩阵 \( H \)。
计算能带
有了哈密顿量矩阵,就可以计算能带了。
% 对角化哈密顿量得到本征值
[eigenvectors, eigenvalues] = eig(H);
% 对本征值排序
eigenvalues = sort(diag(eigenvalues));
我们使用Matlab的 eig 函数对哈密顿量矩阵 \( H \) 进行对角化,得到本征向量 eigenvectors 和本征值 eigenvalues,然后对本征值进行排序,这样得到的本征值就是我们所需的能带能量值。
投影能带与原胞能带
投影能带
投影能带是将整个体系的能带投影到特定的子空间,在二维SSH模型中,我们可能关注特定原子类型(如A原子或B原子)相关的能带,这可以通过对本征向量进行一定的处理来实现。假设我们想得到A原子相关的投影能带:
% 提取A原子相关的本征向量分量
A_projection = zeros(Nx * Ny, length(eigenvalues));
for k = 1:length(eigenvalues)
for i = 1:Nx
for j = 1:Ny
index_A = (i - 1) * Ny * 2 + (j - 1) * 2 + 1;
A_projection((i - 1) * Ny + j, k) = eigenvectors(index_A, k);
end
end
end
% 计算投影能带
A_projected_bands = sum(abs(A_projection).^2, 1);
这里我们通过循环提取与A原子相关的本征向量分量,构建投影矩阵 Aprojection,然后通过对投影矩阵分量平方求和得到A原子相关的投影能带 Aprojected_bands。
原胞能带
原胞能带则是从单个原胞的角度来分析能带结构。在我们构建哈密顿量矩阵的过程中其实已经隐含了原胞的信息,通过对哈密顿量矩阵按原胞进行划分和处理,就可以得到原胞能带。不过这部分的计算相对复杂一些,可能需要更多的数学推导和矩阵操作。
% 原胞哈密顿量矩阵(简化示意)
primitive_cell_H = H(1:2, 1:2);
% 对角化原胞哈密顿量得到原胞能带
[primitive_eigenvectors, primitive_eigenvalues] = eig(primitive_cell_H);
primitive_eigenvalues = sort(diag(primitive_eigenvalues));
这里简单示意了提取原胞哈密顿量矩阵(假设只考虑一个原胞内的两个格点,实际情况可能更复杂),并对角化得到原胞能带的本征值。

通过以上步骤,我们就利用Matlab基于紧束缚模型完成了二维SSH模型的计算,并得到了投影能带和原胞能带,这对于理解二维SSH模型的电子结构具有重要意义,也为进一步研究该模型的物理性质打下了基础。

以上代码和分析仅为一个简单示例,实际研究中可能需要更复杂的处理和优化,希望能给大家在相关领域的探索提供一些思路。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)