手把手教石墨烯紧束缚能带推导与实现

360影视 国产动漫 2025-05-15 23:09 1

摘要:本教程将带你逐步推导二维蜂窝格(以石墨烯为例)的紧束缚能带结构,结合物理原理、数学推导与 Python 代码实现,帮助你系统掌握石墨烯电子结构的核心概念。我们将从晶格结构和哈密顿量入手,深入解析紧束缚模型的基本假设和计算步骤,并通过简洁的代码示例实现能带计算与

本教程将带你逐步推导二维蜂窝格(以石墨烯为例)的紧束缚能带结构,结合物理原理、数学推导与 Python 代码实现,帮助你系统掌握石墨烯电子结构的核心概念。我们将从晶格结构和哈密顿量入手,深入解析紧束缚模型的基本假设和计算步骤,并通过简洁的代码示例实现能带计算与绘制。

石墨烯的原胞包含两个碳原子,分别位于A、B子格。我们首先定义布拉伐格矢量、原子基以及自动搜索最近邻跃迁。

为最近邻原子间距。

为二维布拉伐格矢。

basis数组表示单位胞内A、B原子的位置。

cutoff用于最近邻搜索的距离阈值(略大于 ,避免数值误差)。

Python 代码与注释importnumpyasnp
importmatplotlib.pyplotasplt
fromitertoolsimportproduct

# 参数
a =1.42# 最近邻距离(Å)
t =-2.7# 跃迁能(eV)
a1 = np.array([np.sqrt(3) * a,0]) # 第一布拉伐矢
a2 = np.array([np.sqrt(3) * a /23* a /2]) # 第二布拉伐矢
basis = [np.array([0.00.0]), np.array([0.0, a])] # 原胞两原子的坐标
cutoff =1.1* a # 最近邻阈值,略大于a

自动搜索最近邻:

遍历所有原胞内原子与其邻居(包括周期性延拓),如果距离满足最近邻条件,则记为一个跃迁。

deffind_nearest_neighbors(basis, a1, a2, cutoff=1.1* a):
"""
自动寻找所有最近邻:返回 (i, j, d),
表示从i号原子到j号原子,跃迁矢量为d。
"""
delta_list =
fori, riinenumerate(basis):
forj, rjinenumerate(basis):
forRinproduct(range(-12), repeat=2): # -1,0,1单元格
Rvec = R[0]*a1 + R[1]*a2
disp = rj + Rvec - ri
dist = np.linalg.norm(disp)
if1e-5< dist <= cutoff:
delta_list.append((i, j, disp))
returndelta_list

对于任意动量 ,哈密顿量矩阵通过所有最近邻跃迁自动生成。

defhamiltonian(kx, ky, basis, delta_list):
"""
构建动量空间哈密顿量。返回 N×N 复矩阵。
"""
N = len(basis)
H = np.zeros((N, N), dtype=complex)
fori, j, dindelta_list:
phase = np.exp(1j* (kx * d[0] + ky * d[1]))
H[i, j] += t * phase
returnH

我们选取 K–Γ–M–K 路径(布里渊区内常用高对称点),生成平滑的 k 路径采样用于绘制能带。

# 倒格矢计算
b1 =2* np.pi * np.array([a2[1], -a2[0]]) / np.cross(a1, a2)
b2 =2* np.pi * np.array([-a1[1], a1[0
Gamma = [00]
K = (2* b1 + b2) /3
M = (b1 + b2) /2
high_symmetry_points = [K, Gamma, M, K]

defgenerate_k_path(points, steps):
"""
生成高对称点路径,每段插值steps个点。
"""
k_path =
foriinrange(len(points) -1):
start = np.array(points[i])
end = np.array(points[i +1])
forjinrange(steps):
k_path.append(start + (end - start) * j / steps)
k_path.append(np.array(points[-1]))
returnnp.array(k_path)

遍历 k 路径,每个 k 上对哈密顿量对角化,得到所有能带本征值。

defcalculate_band_structure(k_path, basis, delta_list):
"""
沿k路径计算能带本征值。
"""
energies =
forkink_path:
kx, ky = k
H = hamiltonian(kx, ky, basis, delta_list)
e_vals = np.linalg.eigvalsh(H)
energies.append(e_vals)
returnnp.array(energies)

本节展示原胞与最近邻示意图,以及能带结构图。

# 计算准备
k_path = generate_k_path(high_symmetry_points,100)
delta_list = find_nearest_neighbors(basis, a1, a2)
energies = calculate_band_structure(k_path, basis, delta_list)

# 子图绘制
fig, axs = plt.subplots(12, figsize=(125))

# ---- 子图 1: 原胞与最近邻 ----
rep_range = range(-12)
atoms =
colors =
forRinproduct(rep_range, repeat=2):
Rvec = R[0] * a1 + R[1] * a2
forbinbasis:
atoms.append(Rvec + b)
colors.append('tab:blue'ifnp.allclose(b, [00])else'tab:orange')
atoms = np.array(atoms)

# 绘制所有格点原子
forpos, cinzip(atoms, colors):
axs[0].plot(pos[0], pos[1], 'o', color=c, markersize=8)

# 原胞边框
cell = np.array([basis[0], basis[0] + a1, basis[0] + a1 + a2, basis[0] + a2, basis[0]])
axs[0].plot(cell[:,0], cell[:,1], 'k--', lw=1)

# 晶格矢量箭头
origin = basis[0]
axs[0].arrow(*origin, *a1, head_width=0.15, head_length=0.25, fc='gray', ec='gray')
axs[0].arrow(*origin, *a2, head_width=0.15, head_length=0.25
axs[0].text(*(origin + a1 *0.5), '$\\vec{a}_1$', fontsize=12, color='gray')
axs[0].text(*(origin + a2 *0.5), '$\\vec{a}_2$', fontsize=12, color='gray')

# 最近邻连线
fori, j, dindelta_list:
ri = basis[i]
rj = ri + d
axs[0].plot([ri[0], rj[0]], [ri[1], rj[1]], color='red', linewidth=1.2)

axs[0].set_title("原胞与最近邻示意")
axs[0].set_aspect('equal')
axs[0].set_xlim(-3.53.5)
axs[0].set_ylim(-3.53.5)
axs[0].set_xlabel("x (Å)")
axs[0].set_ylabel("y (Å)")

# ---- 子图 2: 能带结构 ----
forbandinenergies.T:
axs[1].plot(band, color='blue')

num_segments = len(high_symmetry_points) -1
steps =100
ticks = [i * stepsforiinrange(num_segments +1)]
labels = ['K', 'Γ', 'M', 'K']

axs[1].set_xticks(ticks)
axs[1].set_xticklabels(labels)
forxinticks:
axs[1].axvline(x, color='gray', linestyle='--', linewidth=0.5)

axs[1].axhline(0, color='black', linestyle='--', linewidth=0.5)
axs[1].set_ylabel('能量 (eV)')
axs[1].set_title('紧束缚能带结构')
axs[1].grid(alpha=0.3)

plt.tight_layout
plt.show

进阶建议

更改 或加入二次邻近/原位能,探索能带变化。

尝试自定义格子、增加杂质/边界,模拟实际材料新现象。

结合颜色/密度图等更丰富的可视化方式。

来源:不寻常科学

相关推荐