sisl专题

sisl 混合迭代:Linear、DIIS与Anderson

用可独立求根的固定点方程理解混合器输入、残差、历史与迭代停止。

更新于 2026-11-12约 3 分钟阅读按任务与环境选择适用配置
阅读本篇目录

使用集群 sisl/0.16.4,环境为 Python 3.11、NumPy、SciPy、netCDF4 和 Matplotlib,不需要加载 SIESTA 的 MPI 编译环境。本文是明确给定参数的教学模型,在集群实际运行并与独立公式比较;不是新的材料 DFT 或 TBtrans 自洽计算。

下载本组完整脚本、原生矩阵、CSV和配图。解压后进入 sisl-core-model-examples:

module load sisl/0.16.4
bash results.sh
bash plot.sh

参考数据在 reference-results、CSV在 reference-data。要运行全部短模型,用 bash run.sh,新结果写入 work/results,已完成小项自动跳过;图由参考数据重画到 figures。脚本限制数学库为1线程。

先分清输入值与残差#

sisl混合器接收 mixer(x, residual);这里残差是 F(x)−x,不是直接把F(x)当第二个参数。若把两者弄反,程序仍可能产生数字,但迭代含义已变。

采用可独立验证的标量方程 x=cos(x),从x=0.1开始。它不是材料自洽电子计算,只用于说明混合器的终端操作与停止条件。

cat > mix.py <<'EOF'
import numpy as np
from sisl.mixing import LinearMixer, DIISMixer, AndersonMixer
methods = [('Linear',LinearMixer(0.5)),
           ('DIIS',DIISMixer(0.5,history=3)),
           ('Anderson',AndersonMixer(0.5))]
for name,mixer in methods:
    x = np.array([0.1])
    for step in range(100):
        residual = np.cos(x)-x
        print(name,step,float(x[0]),float(residual[0]))
        if abs(residual[0]) < 1e-10:
            break
        x = np.asarray(mixer(x,residual))
    else:
        raise RuntimeError(name+'没有在给定步数内收敛')
EOF
python mix.py > mixing.txt

三个实例分别创建自己的混合器,避免把一个计算的历史带进另一个计算。处理真实网格或矩阵时也一样:方法、变量尺寸或问题本身改变后,应明确重建/清理历史。

本例实际迭代结果#

独立求根得到x=0.7390851332151612。采用相同起点、权重和残差阈值,实际结果为:

方法 最后step 最后残差
Linear 14 2.42×10⁻¹¹
DIIS,history=3 7 −1.93×10⁻¹²
Anderson默认历史约定 14 2.42×10⁻¹¹

step=0是初始输入的残差,所以14表示进行了14次更新,不能把15行记录说成15次更新。DIIS在这个标量例子中更快;Anderson的实际配置没有比Linear减少步数。这里没有“某个混合器对所有材料总是更快”的结论。

三种实际混合器的残差和输入值序列

head -n 10 reference-data/Sisl-mixing-fixed-point.csv
bash plot.sh

CSV保存每一步x和残差,不只给最终收敛值。遇到振荡时先看残差曲线,再调整权重、历史长度或变量尺度。

向真实自洽问题迁移#

Linear更新为 x_new=x+weight*(F(x)−x);权重0.5表示旧输入和本次输出各占一半。DIIS使用历史残差构造子空间外推,历史不是越长越好,接近线性相关时还要关注数值稳定性。

本例的10⁻¹⁰阈值是标量方程的绝对残差,不能照搬成密度网格、能量或力的收敛阈值。真实电子计算还需要相应物理收敛判据,混合器本身不会替你判断电子态、磁态或结构是否正确。

本包不更改SIESTA/VASP内部混合参数,也没有把这个独立Python混合器注入正在运行的用户计算。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗