Решение уравнения Шрёдингера для одноэлектронного атома:
$$\psi_{nlm}(r, \vartheta, \varphi) = \sqrt{{\left(\frac{2}{n a_0}\right)}^3\frac{(n-l-1)!}{2n(n+l)!}} \: e^{- \rho / 2} \: {\rho}^l \: L_{n-l-1}^{2l+1}(\rho) \: Y_l^m (\vartheta, \varphi)$$
$\rho = \frac{2r}{n a_0};$
При подстановке $\rho$ получаем:
$$\psi_{nlm}(r, \vartheta, \varphi) = \sqrt{{\left(\frac{2}{n a_0}\right)}^3\frac{(n-l-1)!}{2n(n+l)!}} \: e^{- r / na_0} \: {\left(\frac{2r}{na_0}\right)}^l \: L_{n-l-1}^{2l+1}{\left(\frac{2r}{na_0}\right)} \: Y_l^m (\vartheta, \varphi)$$
$L_{n-l-1}^{2l+1}(\rho)$ - обобщённый полином Лагерра степени $n-l-1;$
$Y_l^m (\vartheta, \varphi)$ - сферическая гармоника;
$n, \: l, \: m$ - квантовые числа:
import os
import numpy as np
import scipy.special
import scipy.misc
import npy2cube as n2c
import pymol
from pymol import cmd
from IPython.display import display, Image
Зададим волновую функцию:
def w(n,l,m,d):
# The meshgrid function is useful for creating coordinate arrays to vectorize function evaluations over a grid.
# nj - step length, integer part of its magnitude is interpreted as specifying
# the number of points to create between the -d and d values
x, y, z = np.mgrid[-d:d:30j, -d:d:30j, -d:d:30j]
# кратчайшее расстояние до начала координат
r = lambda x,y,z: np.sqrt(x**2+y**2+z**2)
# полярный угол
theta = lambda x,y,z: np.arccos(z/r(x,y,z))
# азимутальный угол
phi = lambda x,y,z: np.arctan(y/x)
# боровский радиус
a0 = 0.529
# множитель с корнем
sqrt_part = lambda n,l: np.sqrt((2/n/a0)**3 * scipy.special.factorial(n-l-1)/scipy.special.factorial(n+l)/2/n)
# произведение всех множителей волнового уравнения, за исключением сферической гармоники
R = lambda r,n,l: sqrt_part(n,l) * (2*r/n/a0)**l * np.exp(-r/n/a0) * scipy.special.genlaguerre(n-l-1,2*l+1)(2*r/n/a0)
# волновая функция: произведение определенной выше функции R и сферической гармоники
WF = lambda r,theta,phi,n,l,m: R(r,n,l) * scipy.special.sph_harm(m,l,phi,theta)
# абсолютное значение WF
absWF = lambda r,theta,phi,n,l,m: np.absolute(WF(r,theta,phi,n,l,m))**2
return absWF(r(x,y,z),theta(x,y,z),phi(x,y,z),n,l,m)
Сгенерируем .cube файлы для отображения:
d = 15
step = 1
for n in range(0, 3):
for l in range(0, n):
# посмотрим также, что будет при отрицательных значениях m
for m in range(-l, l+1, 1):
name='%s-%s-%s' % (n,l,m)
n2c.npy2cube(w(n,l,m,d), (-d,-d,-d), (step,step,step), name + '.cube')
Скрипт для отображения в pymol:
with open('draw_mgrids.pml', 'w') as f:
for n in range(0, 3):
for l in range(0, n):
for m in range(-l, l+1, 1):
name = '%s-%s-%s' % (n, l ,m)
f.write('load /Users/marinavol/Desktop/hse/drug_design/hw4/%s, %s\n' % (name + '.cube', name))
f.write('volume %s, %s\n' % (name + '_v', name))
f.write('disable all\n')
f.write('enable %s\n' % (name + '_v'))
f.write('zoom\n')
f.write('png %s.png, dpi=500\n' % (name))
Визуализация результатов для первых трех уровней:
for f in [f for f in os.listdir("/Users/marinavol/Desktop/hse/drug_design/hw4/") if f.endswith(".png")]:
print f
display(Image("/Users/marinavol/Desktop/hse/drug_design/hw4/" + f))
Создадим входной файл для пакета ORCA и сгенерим изображения.
# ssh -p 22025 shad@vsb.fbb.msu.ru
# mkdir ./hse/volosnikova
# cd ./hse/volosnikova
# nano h.inp
# orca h.inp
# scp -P 22025 shad@vsb.fbb.msu.ru:/home/shad/hse/volosnikova/*.cube ./Desktop/hse/drug_design/hw4/cubes/
Входной файл h.inp
# # ! UHF SVP XYZFile
# %plots Format Cube
# MO("1-0-0.cube",1,0);
# MO("2-0-0.cube",2,0);
# MO("2-1-0.cube",3,0);
# MO("2-1-1.cube",4,0);
# end
# * xyz 0 4
# H 0 0 0
# *
Получили .cube файлы.
Визуализируем с помощью pymol.
with open('draw_mgrids_orca.pml', 'w') as f:
for n in range(0, 3):
for l in range(0, n):
for m in range(0, l+1, 1):
name = '%s-%s-%s' % (n, l ,m)
f.write('load /Users/marinavol/Desktop/hse/drug_design/hw4/cubes/%s, %s\n' % (name + '.cube', name))
f.write('volume %s, %s\n' % (name + '_v', name))
f.write('disable all\n')
f.write('enable %s\n' % (name + '_v'))
f.write('zoom\n')
f.write('png %s_orca.png, dpi=500\n' % (name))
for f in [f for f in os.listdir("/Users/marinavol/Desktop/hse/drug_design/hw4/cubes/") if f.endswith(".png")]:
print f
display(Image("/Users/marinavol/Desktop/hse/drug_design/hw4/cubes/" + f))