1. 课程导入与仿真环境搭建

周期晶格紧束缚模型是凝聚态物理中最基础、也最具延展性的可解模型之一。它把晶体中电子的运动抽象为“格点上的局域轨道 + 格点之间的跃迁积分”,用一组离散的哈密顿量矩阵元素描述能带结构。相比连续空间中的薛定谔方程,紧束缚模型把问题转化为有限维或周期性的矩阵本征值问题,天然适合数值计算,也是理解能带、态密度、拓扑不变量、无序局域化等概念的起点。

本节的目标不是推导某个具体能带公式,而是建立三件事:第一,明确紧束缚模型在数值仿真中“输入什么、输出什么”;第二,理解周期边界与有限开边界在数值实现上的差别;第三,搭建一个可复现、可版本管理的 Python 科学计算环境,为后续三十节的仿真实验打好地基。

紧束缚模型的基本结构与数值对象

以最简单的一维单轨道链为例,设晶格常数为 a,每个格点 i 上有一个能量为 ε₀ 的局域轨道,最近邻跃迁积分为 t(取 t > 0 表示跃迁振幅为正,具体符号约定在后续章节统一说明)。在二次量子化表象下,哈密顿量写作:

H = Σ_i ε₀ c†_i c_i − t Σ_<i,j> (c†_i c_j + h.c.)

对数值仿真而言,真正需要构造的是一个 N×N 的厄米矩阵。对角元为 ε₀,最近邻非对角元为 −t。若采用周期边界条件(PBC),则首尾格点之间也存在跃迁项;若采用开边界条件(OBC),则矩阵为三对角形式。这个差别看似微小,却直接决定了后续能否观察到边缘态、能否用傅里叶变换得到解析能带。

下图展示了本节需要建立的整体认识:从物理模型到数值矩阵,再到本征值求解与结果判读的完整链路,以及周期/开边界两条分支。

周期晶格紧束缚模型:从物理设定到数值结果 物理设定 格点 i、轨道能量 ε₀ 最近邻跃迁 t 晶格常数 a、格点数 N 周期边界 PBC 首尾格点相连 开边界 OBC 首尾断开,三对角 哈密顿矩阵 H 对角元 ε₀ 非对角元 −t 厄米矩阵 N×N 数值求解 numpy.linalg eigh / eigvalsh 本征值 E_n、本征矢 结果判读 PBC:能带色散 E(k) 与解析式对照 OBC:能谱分布、边缘态、态密度 检查厄米性、本征值实数性、收敛性 可复现环境层:Python 3.11 + numpy / scipy / matplotlib + venv + requirements.txt 固定版本号 → 记录依赖 → 同一脚本在不同机器上得到一致的本征值结果 建议同时记录:N、t、ε₀、边界条件、随机种子(若引入无序)

数值仿真的目标与可验证输出

对一维单轨道链,若取 ε₀ = 0、t = 1、a = 1,周期边界下的解析色散为 E(k) = −2t cos(ka),k 取 2πn/(Na),n = 0,1,…,N−1。这给了我们一个极好的“数值正确性锚点”:数值对角化得到的本征值排序后,应当与解析式在对应 k 点上的取值一致(允许浮点误差量级 10⁻¹² 左右)。

因此本节建议的仿真目标是可检验的,而不是笼统的“跑通程序”:

  • 构造 N = 50 的一维链哈密顿矩阵,分别实现 PBC 与 OBC 两个版本;
  • 用 numpy.linalg.eigvalsh 求本征值,验证全部为实数且矩阵厄米;
  • 将 PBC 本征值与解析色散逐点比对,报告最大绝对误差;
  • 输出 OBC 能谱,观察 N 增大时能谱向 [−2t, 2t] 区间填充的趋势。

下面是一段可直接运行的最小实现,用于建立“矩阵构造—求解—比对”的完整闭环:

import numpy as np

def hamiltonian_1d(N, t=1.0, eps0=0.0, pbc=True):
    H = np.zeros((N, N), dtype=float)
    for i in range(N):
        H[i, i] = eps0
        if i + 1 < N:
            H[i, i+1] = -t
            H[i+1, i] = -t
    if pbc and N > 2:
        H[0, N-1] = -t
        H[N-1, 0] = -t
    return H

N, t = 50, 1.0
H_pbc = hamiltonian_1d(N, t, pbc=True)
H_obc = hamiltonian_1d(N, t, pbc=False)

assert np.allclose(H_pbc, H_pbc.T.conj()), "矩阵必须厄米"
E_pbc = np.linalg.eigvalsh(H_pbc)
E_obc = np.linalg.eigvalsh(H_obc)

k = 2 * np.pi * np.arange(N) / N
E_analytic = -2 * t * np.cos(k)
err = np.max(np.abs(np.sort(E_pbc) - np.sort(E_analytic)))
print("PBC 最大绝对误差:", err)
print("OBC 能谱范围:", E_obc.min(), E_obc.max())

在一台普通笔记本上,这段代码应在毫秒级完成。若 err 处于 10⁻¹⁴ 至 10⁻¹² 量级,说明矩阵构造与边界条件处理正确;若误差明显偏大,最常见的原因是 PBC 的 (0, N−1) 元素漏写,或把 −t 写成了 +t 导致色散整体反号。这类“符号与边界”错误在后续二维、多轨道模型中会被放大,因此值得在第一节就建立检查习惯。

Python 科学计算环境与版本管理

数值仿真最怕的不是算错,而是“上次能跑、这次不能跑”。紧束缚模型涉及矩阵构造、稀疏对角化、绘图与可能的并行计算,依赖较多,因此建议从第一天起就用虚拟环境隔离项目,并固定版本号。推荐组合为 Python 3.11、numpy 1.26、scipy 1.11、matplotlib 3.8,这些版本在数值稳定性与 API 兼容性上较为成熟。

python -m venv .venv
source .venv/bin/activate        # Windows 使用 .venv\Scripts\activate
pip install "numpy==1.26.4" "scipy==1.11.4" "matplotlib==3.8.4"
pip freeze > requirements.txt

把 requirements.txt 与仿真脚本一起纳入 Git 管理,并在脚本开头固定随机种子(若后续引入无序或随机相位)。对于更大规模的问题(如 N = 10⁴ 的一维链或二维方格),应改用 scipy.sparse 构造稀疏矩阵,并用 scipy.sparse.linalg.eigsh 只求部分本征值,避免稠密矩阵的内存爆炸。这一取舍在后续章节会反复出现,本节只需先建立“稠密小规模验证 + 稀疏大规模计算”的双轨意识。

建议在项目根目录建立 config.py,集中存放 N、t、ε₀、边界条件等参数,所有脚本从同一处读取。这样后续做参数扫描时,只需改一处即可复现整组结果。
不要用系统全局 Python 直接安装科学计算包。不同项目对 numpy 版本要求可能冲突,一旦全局环境被污染,排查成本远高于一开始就使用虚拟环境。

完成本节后,你应当拥有一个可运行的最小工程:一个能构造 PBC/OBC 哈密顿矩阵的函数、一段能输出本征值并与解析色散比对的脚本、一份锁定版本的依赖清单。这三样东西构成了后续所有仿真的基线,也是判断“模型实现是否正确”的第一道关卡。