symfc 二、三、四阶拟合
给出实际Symfc API与终端入口,用独立测试比较模型阶数和相互作用范围。
阅读本篇目录
有了可靠的位移—力数据后,选择拟合阶数和截断半径,再分别检查训练、验证和测试误差。高阶模型并不自动保证更好的泛化,也不能替代足够的相互作用范围。
下载完整Si实例包,解压到自己的工作目录。包内保留123个真实静态力条件、独立训练/验证/测试划分、14个拟合条件、原生导出文件与绘图脚本。
1. 运行一个拟合#
新解压目录需要先在计算资源上运行 bash static-all.sh 得到 labels/;若只想用包内参考标签练习,可执行:
cp -r reference/labels labels
bash fit.sh Si16-fc23-c4p2
结果保存在 fits/Si16-fc23-c4p2/。同名目录已存在时不覆盖,重新计算请换新目录。
2. 关键API#
完整脚本 fit_case.py 的核心为:
from symfc import Symfc
from symfc.utils.utils import SymfcAtoms
supercell = SymfcAtoms(numbers, scaled_positions, cell)
model = Symfc(
supercell,
displacements=train_displacements,
forces=train_forces,
cutoff={2: 4.2, 3: 4.2},
)
model.run(orders=[2, 3], is_compact_fc=False, batch_size=16)
fc2 = model.force_constants[2]
fc3 = model.force_constants[3]
numbers、scaled_positions、cell描述同一个参考超胞;位移是笛卡尔坐标,不能把分数位移直接作为Å输入。只用训练部分建立系数,验证/测试用于模型之外的检查。
3. 比较不同阶数#
bash fit.sh Si16-fc2-c3p0
bash fit.sh Si16-fc23-c3p0
bash fit.sh Si16-fc234-c3p0
三者分别使用 [2]、[2,3]、[2,3,4]。Si16完整FC2、FC3、FC4形状依次为16²×3²、16³×3³、16⁴×3⁴,单位eV/Ų、eV/ų、eV/Å⁴。张量阶数增加后存储很快增大,应先用小体系估算资源。
| 条件 | 训练RMSE | 验证RMSE | 测试RMSE |
|---|---|---|---|
| Si16-fc2-c3p0 | 0.099914 | 0.078504 | 0.066355 |
| Si16-fc23-c3p0 | 0.052762 | 0.054777 | 0.048971 |
| Si16-fc234-c3p0 | 0.050963 | 0.054208 | 0.048717 |
| Si16-fc23-c4p2 | 0.018643 | 0.015999 | 0.014436 |
表中单位均为eV/Å。最后一行扩大到4.2 Å,并未增加到四阶,却明显改善了这个独立测试集的误差。

4. 独立回算的公式#
F = -FC2·u - (1/2)FC3·u·u - (1/6)FC4·u·u·u
三阶项的1/2和四阶项的1/6来自对能量泰勒展开求导。漏掉这些系数会把模型误差和单位弄错。配套分析脚本独立计算这个表达式,再与真实NEP力比较。

5. 读结果与导出文件#
cat fits/Si16-fc23-c4p2/RESULTS.json
ls fits/Si16-fc23-c4p2/
model.npz保存原始symfc顺序的完整张量、观测与回算力;fc2.hdf5、fc3.hdf5和 FORCE_CONSTANTS则按Phonopy原子顺序导出,映射在 ATOM-MAPPING.json。
四阶例子的 fc4.hdf5明确保存完整FC4和单位,仍是原始symfc顺序;它不是可以直接交给Phono3py三声子输运的输入。使用FourPhonon等其他程序时,还需要按其格式和原子索引转换。