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'])
No description has been provided for this image
InĀ [9]:
hfscf.orbital2D(orbitals['C'], orbitals['X'], orbitals['F'])
No description has been provided for this image