数值方法
本节介绍 AtomSCF 中实现的数值离散化方法和求解技术。
径向网格生成
线性网格
均匀间距:
其中 $h = (r_{\text{max}} - r_{\text{min}}) / (N-1)$。
优点: - 简单易实现 - 近核区域精细
缺点: - 远程需要大量网格点 - 效率低
对数网格
对数等间距:
或等价地 $\ln r_i = \ln r_0 + i \delta$。
优点: - 自适应:近核密集,远程稀疏 - 波函数衰减区域覆盖好
缺点: - 不包含 $r=0$ 点 - 变换后的微分算子复杂
指数变换网格
基于 [ExpGridTransform] 的方法:
变量变换推导
原始径向 Schrödinger 方程:
引入变量代换 \(u(r) = v(r) \\cdot w(r)\),其中 \(w(r) = \\exp(-r/(2R_p))\)。
一阶导数:
二阶导数:
代入原方程并消去 \(w\):
在指数网格上离散化:
取 \(R_p = 1/\\delta\),则:
关键特性:一阶导数项消失,Hamiltonian 矩阵对称。
数值实现:
在网格点 \(r_j\) 上:
反解:
优点:
- 精度提升 ~7x(相比线性网格)
- 速度提升 ~3x
- 包含 \(r=0\) 点(\(j=0 \\Rightarrow r=0\))
- 对称矩阵可用 scipy.linalg.eigh()
求解
缺点: - 需要额外参数 \((\\delta, R_p)\) - 变换后有效势包含常数项 \(-\\delta^2/8\)
参数选择:
有限差分方法
二阶中心差分 (FD2)
二阶导数近似(非均匀网格):
其中: - $\Delta r_{i-} = r_i - r_{i-1}$ - $\Delta r_{i+} = r_{i+1} - r_i$
精度:$O(h^2)$(均匀网格)
五阶中心差分 (FD5)
等间距线性网格专用:
精度:$O(h^4)$
要求:必须为等间距网格
Numerov 方法
特别适用于形如 $u'' + k^2(r) u = 0$ 的方程(对数网格)。
递推公式:
其中 $k^2(r) = 2[v(r) - E] - \ell(\ell+1)/r^2$。
精度:$O(h^6)$(局域截断误差)
应用:边界值问题(打靶法 + 二分法)
Hamiltonian 矩阵构造
标准 FD2 方法
三对角矩阵(内部点):
边界条件:$u_0 = u_{N-1} = 0$(Dirichlet)
变换 Hamiltonian
指数变换网格的 $v$ 空间 Hamiltonian:
其中基函数:$v_j(r) = \delta_{jj'} / \sqrt{w(j\delta)}$
权重:$w(r) = \exp(-r/R_p)$
优势:消除一阶导数项,提高精度
本征值问题求解
标准对角化
对称矩阵:
使用 numpy.linalg.eigh() 或 scipy.linalg.eigh()
广义本征值问题
变换网格需求解:
其中 $B$ 为重叠矩阵(非单位)
使用 scipy.linalg.eigh(H, B)
自洽场迭代
SCF 循环框架
初始猜测:类氢轨道或原子密度叠加
迭代:
后处理:计算总能量和其他性质
密度混合策略
线性混合:
典型值:$\alpha \in [0.1, 0.7]$
DIIS (Direct Inversion in Iterative Subspace):
使用历史密度的线性组合,最小化残差:
求解最优系数:
收敛判据
常用标准:
密度变化:$\|\Delta n\|_2 < 10^{-6}$
能量变化:$|\Delta E| < 10^{-8}$ Ha
轨道变化:$\sum_i \|\psi_i^{(k+1)} - \psi_i^{(k)}\|^2 < 10^{-6}$
Hartree 势计算
泊松方程求解
径向形式(球对称):
解析解(分段积分):
数值实现(梯形积分):
其中 $w_j$ 为积分权重。
交换积分计算
Slater 径向积分
定义:
其中:
两段累积算法:
# 向外累积 Y^k
Y[0] = 0
for i in range(1, N):
Y[i] = Y[i-1] + u_i[i] * u_j[i] * r[i]**k * w[i]
Y /= r # 除以 r
# 向内累积 Z^k
Z[N-1] = 0
for i in range(N-2, -1, -1):
Z[i] = Z[i+1] + u_i[i] * u_j[i] * r[i]**(k-1) * w[i]
数值积分
梯形公式
非均匀网格:
权重:
Simpson 公式
等间距网格,$N$ 为奇数:
精度:$O(h^4)$
边界条件处理
Dirichlet 边界
固定值:$u(r_0) = u(r_N) = 0$
实现: - 不求解边界点 - 内部矩阵维度 $(N-2) \times (N-2)$
Neumann 边界
固定导数:$u'(r_0) = 0$(s 轨道在原点)
实现:镜像点法或单侧差分
性能优化
缓存 Slater 积分
Slater 积分仅依赖占据态对 $(i, j)$ 和多极指标 $k$,可预计算并缓存:
cache = {}
key = (i, j, k)
if key not in cache:
cache[key] = compute_slater_integral(u_i, u_j, k)
return cache[key]
并行化
多角动量通道可并行求解:
from multiprocessing import Pool
with Pool(ncpu) as pool:
results = pool.map(solve_channel, l_values)
数值稳定性检查
归一化
每次迭代检查:
电子数守恒
Virial 定理
HF 基态满足:
DFT:
参考文献
Computational Physics Fall 2024, Assignment 7, Problem 2 https://github.com/bud-primordium/Computational-Physics-Fall-2024/
Press, W. H. et al. Numerical Recipes (2007)
Johnson, D. D. Phys. Rev. B 38, 12807 (1988) [DIIS]
Lehtola, S. et al. J. Chem. Theory Comput. 15, 1593 (2019) [SCF 算法综述]