5. Ab initio Š²ŃŃŠøŃŠ»ŠµŠ½ŠøŠµ Š¼Š¾Š»ŠµŠŗŃŠ»Ń Š²Š¾Š“Š¾ŃŠ¾Š“Š°Ā¶
InĀ [3]:
import numpy as np
import hfscf
InĀ [4]:
def SCF (r = 1.4632, Z=[1,1], b1 = hfscf.GTO["H"], b2 = hfscf.GTO["H"], b = 3):
#Š”ŠæŠøŃŠ¾Šŗ ŃŠµŠ½ŃŃŠ¾Š² Š°ŃŠ¾Š¼Š¾Š²
R = [0, r]
# ŠŠµŠ½ŠµŃŠøŃŃŠµŠ¼ S - Š¼Š°ŃŃŠøŃŃ ŠæŠµŃŠµŠŗŃŃŠ²Š°Š½ŠøŃ
s_scf = hfscf.S(R, b1, b2, b)
# ŠŠµŠ½ŠµŃŠøŃŃŠµŠ¼ H - Š³Š°Š¼ŠøŠ»ŃŃŠ¾Š½ŠøŠ°Š½
h_scf = hfscf.H(R, Z, b1, b2, b)
# ŠŠøŠ°Š¾Š³Š½Š°Š»ŠøŠ·Š°ŃŠøŃ Š¼Š°ŃŃŠøŃŃ S Šø ŠæŠ¾ŠøŃŠŗ Š¼Š°ŃŃŠøŃŃ X (X = S**(-1/2))
X = hfscf.diagon(m=s_scf)
# Xa - ŃŠ¾ŠæŃŃŠ¶ŠµŠ½Š½Š°Ń ŃŃŠ°Š½ŃŠæŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½Š°Ń Š¼Š°ŃŃŠøŃŠ°
Xa = X.getH()
# ŠŠµŠ½ŠµŃŠøŃŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ ŠæŠ»Š¾ŃŠ½Š¾ŃŃŠø P
p_scf = np.matrix([[0,0],[0,0]], dtype=np.float64)
# ŠŃŠ¾Š²ŠµŃŃŠµŠ¼ ŃŃ
Š¾Š“ŠøŠ¼Š¾ŃŃŃ SCF
for iteracion in range(50):
# ŠŃŃŠøŃŠ»ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ Š¤Š¾ŠŗŠ° F
# F = H + G
g_scf = hfscf.G(r, p_scf, b1, b2, b)
f_scf = h_scf + g_scf
# ŠŃŃŠøŃŠ»ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ F'
# F' = X_adj * F * X
f_tra = Xa * f_scf * X
# ŠŠøŠ°Š³Š¾Š½Š°Š»ŠøŠ·ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ F Šø Š²ŃŃŠøŃŠ»ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ C'
c_tra = hfscf.diagon2(m=f_tra)
# ŠŃŃŠøŃŠ»ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ C
# C = X * C'
c_scf = X * c_tra
# ŠŃŃŠøŃŠ»ŃŠµŠ¼ Š¼Š°ŃŃŠøŃŃ ŠæŠ»Š¾ŃŠ½Š¾ŃŃŠø P Š½Š° Š¾ŃŠ½Š¾Š²Š°Š½ŠøŠø Š¼Š°ŃŃŠøŃŃ C
p_temp = hfscf.P(C=c_scf)
print("ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ " + str(iteracion + 1) + ".\n")
# ŠŃŠ¾Š²ŠµŃŃŠµŠ¼ ŃŃ
Š¾Š“ŠøŠ¼Š¾ŃŃŃ
if np.linalg.norm(p_temp - p_scf) < 1E-4: # Referencia (7) p. 148
print("SCF ŃŃ
Š¾Š“ŠøŃŃŃ!")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
else:
p_scf = p_temp
print("SCF Š½Šµ ŃŃ
Š¾Š“ŠøŃŃŃ.")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
ŠŠ¾ŃŃŠøŃŠ°ŠµŠ¼ ŠæŠ¾Š»ŃŃŠµŠ½Š½ŃŃ ŃŃŠ½ŠŗŃŠøŃ
InĀ [5]:
orbitals = SCF()
ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 1. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 2. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 3. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 4. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 5. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 6. ŠŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠøŃŠµŃŠ°ŃŠøŃ 7. SCF ŃŃ Š¾Š“ŠøŃŃŃ!
Š ŠµŠ·ŃŠ»ŃŃŠ°Ń ŃŠ°Š±Š¾ŃŃ ŃŃŠ½ŠŗŃŠøŠø:
InĀ [6]:
orbitals
Out[6]:
{'S': matrix([[0.99999999, 0.63749012], [0.63749012, 0.99999999]]), 'H': matrix([[-1.09920375, -0.91954841], [-0.91954841, -1.09920375]]), 'X': matrix([[ 0.55258063, 1.17442445], [ 0.55258063, -1.17442445]]), 'F': matrix([[-0.34684107, -0.57771139], [-0.57771139, -0.34684028]]), 'C': matrix([[ 0.55258114, -1.17442421], [ 0.55258013, 1.17442468]]), 'P': matrix([[0.61069182, 0.61069071], [0.61069071, 0.6106896 ]])}
ŠŠ¾ŃŃŠøŃŠ°ŠµŠ¼ ŃŠ½ŠµŃŠ³ŠøŠø:
InĀ [7]:
orbital_energy = hfscf.ener_orbs(orbitals['X'], orbitals['F'])
electron_energy = hfscf.ener_elec(orbitals['P'], orbitals['H'], orbitals['F'])
total_energy = hfscf.ener_tot()
print(f'ŠŠ½ŠµŃŠ³ŠøŠø Š¾ŃŠ±ŠøŃŠ°Š»ŠµŠ¹: {orbital_energy[0]} Šø {orbital_energy[1]}')
print(f'ŠŠ»ŠµŠŗŃŃŠ¾Š½Š½Š°Ń ŃŠ½ŠµŃŠ³ŠøŃ Š¼Š¾Š»ŠµŠŗŃŠ»Ń: {electron_energy}')
print(f'ŠŠ¾Š»Š½Š°Ń ŃŠ½ŠµŃŠ³ŠøŃ Š¼Š¾Š»ŠµŠŗŃŠ»Ń: {total_energy}')
ŠŠ½ŠµŃŠ³ŠøŠø Š¾ŃŠ±ŠøŃŠ°Š»ŠµŠ¹: -0.5646153594583119 Šø 0.6368673980935621 ŠŠ»ŠµŠŗŃŃŠ¾Š½Š½Š°Ń ŃŠ½ŠµŃŠ³ŠøŃ Š¼Š¾Š»ŠµŠŗŃŠ»Ń: -1.7974485548087507 ŠŠ¾Š»Š½Š°Ń ŃŠ½ŠµŃŠ³ŠøŃ Š¼Š¾Š»ŠµŠŗŃŠ»Ń: 0.683433570256971
ŠŃŠ°ŃŠøŠŗŠø Š¾ŃŠ±ŠøŃŠ°Š»ŠµŠ¹
ŃŠ½Š°ŃŠ°Š»Š° 1D
ŠæŠ¾ŃŠ¾Š¼ 2D (ŃŠ»ŠµŠ²Š° ŃŠ²ŃŠ·ŃŠ²Š°ŃŃŠøŠµ Š¾ŃŠ±ŠøŃŠ°Š»Šø, ŃŠæŃŠ°Š²Š°- ŃŠ°Š·ŃŃŃ Š»ŃŃŃŠøŠµ)
InĀ [8]:
hfscf.orbital(orbitals['C'])
InĀ [9]:
hfscf.orbital2D(orbitals['C'], orbitals['X'], orbitals['F'])