5. Perturbation Theory
Perturbation theory is a collection of versatile methods used in many branches of science, and it divides the system into a model part \(\hat{H}_0\) which is a known approximation to the real system \(\hat{H}\) and a perturbation part \(\hat{V}\).
where \(\lambda\) is a parameter that is small enough to guarantee convergence.
Møller–Plesset perturbation theory is a particular case of perturbation theory, where we take the Fock operator \(\hat{F}\) as the model operator, and the perturbation operator is given by
As the cornerstone of ab initio quantum chemistry, Hartree–Fock calculation results in the wavefunction \(\Phi_{HF}\), the Fock operator \(\hat{F}\), ground state energy \(E_{HF}\) and the orbital energies \(\{\epsilon_i\}\). Thus, the zeroth–order time–independent Schrodinger equation is defined as:
here the zeroth–order Hamiltonian \(\hat{H}^{(0)}\) is taken as the Fock operator,
and the zeroth–order wavefunction \(\Phi_{0}\) refers to the Hartree–Fock wavefunction,
furthermore, the corresponding energy \(E^{(0)}_0\) is the sum of orbital energies \(\{\epsilon_i\}\), which is the eigenvalues of the Fock operator \(\hat{F}\).
As the solution of the zeroth–order equation is known, one expects that the Møller–Plesset theory performs on top of the previous result. Therefore we can determine the various nth–order corrections.
5.1. Algorithm
Step 1: Build The Integral
The pre–computed quantities for the SCF algorithm include:
The nuclear repulsion energy \(E_{nuc}\).
One–electron integrals overlap \(\mathbf{S}\), kinetic energy \(\mathbf{T}\), and nuclear attraction \(\mathbf{V}\).
Two–electron integral, the electron repulsion \((\mu\nu\vert\lambda\sigma)\).
Please check out the Hamiltonian section for further information to learn more about the pre–computed quantities.
Step 2: Optimized the molecular orbital coefficients by SCF Calculation
The Hartree–Fock method is an uncorrelated mean–field theory that offers a qualitative description of chemical systems. Although Hartree–Fock theory is only qualitatively correct, it forms the basis for more accurate models and becomes the cornerstone of ab initio quantum chemistry.
Please check out the Hartree-Fock section for further information.
Step 3: Transformation of atomic orbital to molecular orbital
With the optimized LCAO_MO coefficients, we can transform the operators from the atomic orbital basis to the molecular orbital basis.
For the one electron operators:
For the two electron operators:
Step 4: Calculate the Correction Energy to n–th Order
Perturbation theory applies a biased bi–partition of the Hamiltonian \(\hat{H}\). The whole Hilbert space \(\mathcal{H}\) is also split into two parts: model space \(\mathcal{P}\) and the orthogonal space \(\mathcal{Q}\).
The model space \(\mathcal{P}\) is spanned by the reference function \(\{\Phi_{0}\}\), and the complementary space \(\mathcal{Q}\) is spanned by the excitation configurations \(\{S, D, T, \dots\}\).
Given the Møller–Plesset perturbation operator \(\hat{V}\), with a reasonably accurate reference \(\Phi_{HF}\), we can calculate the electron correlation energy to arbitrary order in a non–iterative way. Here list the equation of correlation energy from orders one up to three:
MP1
MP2
MP3
5.2. Examples
MP2
Depending on the choice of Møller–Plesset perturbation operator \(\hat{V}\), the first order correction energy \(E_{MP1}\) might be zero or none zero, but \(E_{MP0} + E_{MP1}\) is always equal to the Hartree–Fock energy \(E_{HF}\). Hence, the first meaningful correction in Møller–Plesset perturbation theory is second-order energy.
from moha import *
mol,orbs = IOSystem.from_file('../data/water.xyz','sto-3g.nwchem')
ham = ChemicalHamiltonian.build(mol,orbs)
wfn = HFWaveFunction(10,7,{'alpha':5,'beta':5})
scfsolver = PlainSCFSolver(ham,wfn)
hf_results = scfsolver.kernel()
ptsolver = MP2Solver(ham,wfn,hf_results)
pt_results = ptsolver.kernel()
MP3
After the second-order energy, the involvement of third-order correction still improves the Hartree-Fock method with cheap costs.
from moha import *
mol,orbs = IOSystem.from_file('../data/water.xyz','sto-3g.nwchem')
ham = ChemicalHamiltonian.build(mol,orbs)
wfn = HFWaveFunction(10,7,{'alpha':5,'beta':5})
scfsolver = PlainSCFSolver(ham,wfn)
hf_results = scfsolver.kernel()
ptsolver = MP3Solver(ham,wfn,hf_results)
pt_results = ptsolver.kernel()