In [48]:
#Вычисление параметров молекулы водорода
#Опишите :
#Добавьте коментарии в код функции
#Опишите объекты S,F,X,H,C
#Рассчитайте:
#Элеткронную энергию молекулы
#Полную энергию молекулы
#Постройте :
#1D плот орбиталей
#2D плот орбиталей
In [46]:
import hfscf as a
In [47]:
import numpy as np
In [49]:
# S - Матрица перекрытий. Описывает наложение базисных функций друг на друга.
# F - Матрица Фока. Описывает поле, действующее на электрон со стороны остальных электронов.
# X - Матрица трансформации. Перевод в ортононрмированный базис.
# H - Core Hamiltionian. Гамильтониан описывает энергию системы.
# C - Матрица коэффициентов. Помогает расчитать молекулярные орбитали из базисных функций (атомных орбиталей).
def SCF (r = 1.4632, Z=[1,1], b1 = a.GTO["H"], b2 = a.GTO["H"], b = 3, vbs=False):
R = [0, r]
if vbs: print("*) Создание матрицы перехода S.")
s_scf = a.S(R, b1, b2, b)
if vbs: print("\n*) Создание гамильтониана H.")
h_scf = a.H(R, Z, b1, b2, b)
# Диагонализируем матрицу S и найдём матрицу X
if vbs: print("\n*) Диагонализация матрицы S и нахождение диагональной матрицы X.")
X = a.diagon(m=s_scf)
Xa = X.getH()
# Оценим матрицу плотности P
if vbs: print("\n*) Создадим матрицу плотности P.")
p_scf = np.matrix([[0,0],[0,0]], dtype=np.float64)
# Начнём итерацию
if vbs: print("\n*) Вычислим SCF (Self-Consistent Field).")
for iteracion in range(50):
# Сделаем матрицу Фока - F
# F = H + G
if vbs: print("\n**) Создание матрицы Фока: вычисление \
двухэлектронных интегралов.")
g_scf = a.G(r, p_scf, b1, b2, b)
f_scf = h_scf + g_scf
# Построим матрицу F'
# F' = X_adj * F * X
if vbs: print("**) Изменение базиса матрицы F.")
f_tra = Xa * f_scf * X
# Диагонализируем матрицу F' и построим матрицу C'
if vbs: print("**) Диагонализация матрицы F' и создание матрицы C'")
c_tra = a.diagon2(m=f_tra)
# Создадим матрицу C
# C = X * C'
if vbs: print("**) Построение матрицы коэффициентов C.")
c_scf = X * c_tra
# Построим матрицу P на основе матрицы C
if vbs: print("**) Пересчёт матрицы плотности P.")
p_temp = a.P(C=c_scf)
print("\nИтерация " + str(iteracion + 1) + ". завершена.\n")
# Проверка сходимости
if np.linalg.norm(p_temp - p_scf) < 1E-4:
print("\n\n-->Есть сходимость.")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
else:
p_scf = p_temp
print("\n\n-->Сходимость не обнаружена\nНеобходимо пересмотреть параметры.")
return {"S":s_scf,"H":h_scf,"X": X,"F":f_scf,"C":c_scf,"P":p_temp}
In [50]:
c = SCF()
Итерация 1. завершена. Итерация 2. завершена. Итерация 3. завершена. Итерация 4. завершена. Итерация 5. завершена. Итерация 6. завершена. Итерация 7. завершена. -->Есть сходимость.
In [51]:
print(c)
{'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 [52]:
#Посчитаем энергии
en1 = a.ener_orbs(c['X'], c['F'])
en2 = a.ener_elec(c['P'], c['H'], c['F'])
full_en = a.ener_tot(r=1.4632, Z=[1,1], elec=0)
print(f'Орбитальная энергия: {en1}')
print(f'Электронная энергия: {en2}')
print(f'Полная энергия молекулы: {full_en}')
Орбитальная энергия: [-0.56461536 0.6368674 ] Электронная энергия: -1.7974485548087507 Полная энергия молекулы: 0.683433570256971
In [53]:
a.orbital(c['C'], r=1.4632, b1=a.GTO["H"], b2=a.GTO["H"], b=3) #1D плот орбиталей
In [54]:
a.orbital2D(c['C'], c['X'], c['F'], r=1.4632, b1=a.GTO["H"], b2=a.GTO["H"], b=3, delta=0.02) #2D плот орбиталей
In [ ]: