Hartree Fock 迭代问题

计算科学 迭代法
2021-12-20 16:40:52

我正在编写一个程序来计算任何封闭壳原子的基态能量,使用 Hartree Fock Roothaan 方法,以 GTO 为基础。该代码适用于最简单的情况,即氦,但它因铍 (z=4) 而失败。

我知道我有两个正交轨道的两个 Roothaan 方程:

Fci=Sciϵi

像往常一样,我对系数矩阵有初步的猜测。使用它来生成 Fock 矩阵并通过解决广义特征值问题来找到第一个轨道的系数,只选择最小的能量。

F(0)c1=Sc1ϵ1

比我使用新的 1_st 轨道的系数(第 2_nd 轨道还没有改变)生成一个新的 Fock 矩阵来找到 2_nd 轨道的系数

F(1)c2=Sc2ϵ2

并使用新的 2_nd 轨道再次找到新的 1_st 轨道,直到能量收敛。

我的问题是,使用该算法,我总是生成具有相同系数的轨道。但是不同的轨道被认为是相互正交的。

如果我通过对系数向量进行 gram-schmidting 施加正交条件,我会得到一个振荡的结果,但获得的能量范围甚至没有接近正确的答案。

我解决广义特征值问题的代码会自动生成相应的特征向量,并根据我的基础对其进行归一化。

我真的希望一些知识渊博的人能给我指出正确的方法。

2个回答

如果您选择一次只做一个轨道,则需要求解第二个轨道,以获得与第一个轨道正交的空间中的最低能量解以及相同的 Fock 算子在更新 Fock 算子之前,您需要解决所有的轨道问题。

您基本上是一遍又一遍地解决相同的轨道,并将迭代之间的轨道变化作为第二个轨道。

与其一次做一个轨道,不如同时解决所有轨道更容易。基本上你正在解决FC=SCϵ每次迭代。

标准方法是执行分解 S=UΛU并使用S1/2=UΛ1/2U 改变你的基础和福克算子。

这样你得到一个更标准的特征值问题F~C~=C~ϵ你可以简单地取出你最喜欢的 LAPACK 实现并相当快地获得轨道。

Hartree-Fock 过程可能会振荡或发散。然而,对于铍来说,它真的不应该这样做。HOMO LUMO 间隙相当大,您的基础中只需要 s 个轨道。