4. 硅的平衡晶格常数与体积优化

为什么硅的平衡晶格常数需要“扫描 + 拟合”

硅的金刚石结构在 0 K 下的理论平衡晶格常数约为 5.42–5.47 Å,实验值(室温外推至 0 K)约为 5.43 Å。DFT 直接优化晶格常数虽然可行,但为了同时获得体模量 B₀ 及其压力导数 B₀′,更稳健的做法是:在平衡值附近取一系列晶格常数 a,对每个 a 做固定体积的单点能计算,得到 E(a) 曲线,再用 Birch–Murnaghan 状态方程拟合。

本案例使用硅的金刚石结构,交换关联泛函选 PBE,截断能 500 eV,k 点网格 8×8×8,自洽收敛标准 1×10⁻⁶ eV。晶格常数扫描范围取 5.30–5.60 Å,步长 0.05 Å,共 7 个点。每个点只做一次自洽计算,不弛豫原子位置(金刚石结构内部坐标固定为 (0,0,0) 和 (1/4,1/4,1/4))。

扫描点与能量数据

下表为教学示例数据,用于演示拟合流程。能量单位为 eV/cell(8 个 Si 原子的原胞),体积由 a³/4 得到(金刚石结构每个原胞含 8 个原子,但惯用立方胞含 8 个原子,这里按惯用立方胞计算,V = a³)。

序号a (Å)V (ų)E (eV/cell)
15.30148.877-107.8421
25.35153.130-107.9015
35.40157.464-107.9382
45.45161.879-107.9548
55.50166.375-107.9531
65.55170.954-107.9347
75.60175.616-107.9002

从数据可见,能量最低点出现在 a = 5.45 Å 附近,但仅凭离散点无法精确给出平衡值,需要状态方程拟合。

扫描输入 结构:Si 金刚石 泛函:PBE 截断能:500 eV k 点:8×8×8 a:5.30–5.60 Å E–V 数据与 BM 拟合 V (ų) E (eV) BM 拟合 V₀ 拟合输出 a₀ ≈ 5.46 Å V₀ ≈ 162.8 ų B₀ ≈ 88 GPa B₀′ ≈ 4.2 实验 a₀ = 5.43 Å 偏差 ≈ 0.5% 拟合方程(Birch–Murnaghan 三阶) E(V) = E₀ + 9V₀B₀/16 · { [(V₀/V)^(2/3) − 1]³ B₀′ + [(V₀/V)^(2/3) − 1]² [6 − 4(V₀/V)^(2/3)] } 拟合参数:E₀、V₀、B₀、B₀′;由 V₀ 换算 a₀ = V₀^(1/3)

用 Python 完成拟合

下面代码使用 scipy 的 curve_fit 对上述 7 个数据点做 Birch–Murnaghan 三阶拟合。数据直接写在代码中,可独立运行。

import numpy as np
from scipy.optimize import curve_fit

# 教学示例数据:a (Å), E (eV/cell)
a_list = np.array([5.30, 5.35, 5.40, 5.45, 5.50, 5.55, 5.60])
E_list = np.array([-107.8421, -107.9015, -107.9382,
                   -107.9548, -107.9531, -107.9347, -107.9002])
V_list = a_list**3  # 惯用立方胞体积

def birch_murnaghan(V, E0, V0, B0, Bp):
    """三阶 Birch-Murnaghan 状态方程,B0 单位 eV/ų"""
    eta = (V0 / V)**(2.0/3.0)
    return E0 + 9.0*V0*B0/16.0 * (
        (eta - 1.0)**3 * Bp +
        (eta - 1.0)**2 * (6.0 - 4.0*eta)
    )

# 初始猜测:E0 取最小值,V0 取对应体积,B0 约 0.6 eV/ų,Bp 约 4
p0 = [E_list.min(), V_list[np.argmin(E_list)], 0.6, 4.0]
popt, pcov = curve_fit(birch_murnaghan, V_list, E_list, p0=p0)

E0, V0, B0, Bp = popt
a0 = V0**(1.0/3.0)
B0_GPa = B0 * 160.21766  # 1 eV/ų = 160.21766 GPa

print(f"E0  = {E0:.4f} eV")
print(f"V0  = {V0:.3f} ų")
print(f"a0  = {a0:.4f} Å")
print(f"B0  = {B0_GPa:.1f} GPa")
print(f"B0' = {Bp:.2f}")

# 与实验值对比
a_exp = 5.43
print(f"a0 相对实验偏差: {abs(a0-a_exp)/a_exp*100:.2f}%")

运行后预期输出(基于示例数据):a₀ ≈ 5.46 Å,B₀ ≈ 88 GPa,B₀′ ≈ 4.2。PBE 通常会高估硅的晶格常数约 0.5%–1%,这是泛函本身的系统误差,属于正常现象。

拟合初值建议:E₀ 取扫描能量最小值,V₀ 取对应体积,B₀ 初值可设 0.5–0.8 eV/ų,B₀′ 初值设 4。若 curve_fit 不收敛,可先固定 B₀′ = 4 做二阶拟合,再用其结果作为三阶拟合初值。

结果判读与验证要点

  • 能量-体积曲线形状:应呈单谷抛物线形,最低点两侧数据点大致对称。若曲线不对称或最低点落在扫描范围边缘,说明扫描区间设置不合理,需扩大范围。
  • 拟合残差:拟合后各点残差应小于 1 meV/cell。若残差过大,检查是否某个点自洽未收敛,或 k 点/截断能不足。
  • 与实验对比:PBE 下硅的 a₀ 通常比实验值大 0.5%–1%,B₀ 通常偏低 5%–10%。若偏差远超此范围,优先检查赝势类型、截断能和 k 点收敛性。
  • B₀′ 合理性:硅的 B₀′ 实验值约 4.2–4.3,拟合值在 3.8–4.6 之间可接受。若 B₀′ 异常大或为负,说明数据点太少或分布不合理。
本案例的 7 个能量值是教学示例数据,用于演示拟合流程。实际计算时,每个晶格常数都需要独立完成一次自洽计算,并确认 reached required accuracy 或等效收敛标志出现后再提取总能量。不要用未收敛的能量值参与拟合。