import numpy
import scipy.special
import scipy.misc
import npy2cube
from os import listdir
from IPython.display import display,Image
Волновая функция атома водорода
def w(n,l,m,d):
x,y,z = numpy.mgrid[-d:d:50j,-d:d:50j,-d:d:50j]
# transition to radial coordinates
r = lambda x,y,z: numpy.sqrt(x**2+y**2+z**2) # radial distance
theta = lambda x,y,z: numpy.arccos(z/r(x,y,z)) # polar angle
phi = lambda x,y,z: numpy.arctan(y/x) # azimutal angle
a0 = 1.
# R = Radial function
# r = radial distance, n,l = quantum numbers
# genlaguerre = Laguerre polynomial
R = lambda r,n,l: (2*r/n/a0)**l * numpy.exp(-r/n/a0) * scipy.special.genlaguerre(n-l-1,2*l+1)(2*r/n/a0)
# Wave function = Radial function * Angle function (approximated by spherical harmonic)
WF = lambda r,theta,phi,n,l,m: R(r,n,l) * scipy.special.sph_harm(m,l,phi,theta)
# Wave function squared = probability density
#absWF = lambda r,theta,phi,n,l,m: numpy.absolute(WF(r,theta,phi,n,l,m))**2
return WF(r(x,y,z),theta(x,y,z),phi(x,y,z),n,l,m)
step=1
Сгенерируем орбитали для n = 1,2,3,4
for n in range(1,5):
d = 10*n
for l in range(0,n):
for m in range(0,l+1,1):
grid= w(n,l,m,d)
sd = numpy.std(grid.flatten())
mn = numpy.mean(grid.flatten())
grid = (grid - mn)/sd # Нормализация для удобства работы с рампой
name='%s-%s-%s' % (n,l,m)
npy2cube.npy2cube(grid,(-d,-d,-d),(step,step,step),name+'.cube')
Как распределены нормализованные значения? (случай орбитали 4-3-3)
%matplotlib inline
import pylab as plt
plt.hist(grid.flatten(),bins=100)
plt.show()
Используемая рампа
cmd.volume_ramp_new('ramp1', [ -1.15, 1.00, 1.00, 1.00, 0.00, -1.10, 1.00, 1.00, 1.00, 0.10, -1.05, 0.00, 0.00, 1.00, 0.20, -0.95, 0.00, 0.00, 1.00, 0.20, -0.90, 1.00, 1.00, 1.00, 0.10, -0.85, 1.00, 1.00, 1.00, 0.00, 0.85, 1.00, 1.00, 1.00, 0.00, 0.90, 1.00, 1.00, 1.00, 0.10, 0.95, 1.00, 0.00, 0.00, 0.20, 1.05, 1.00, 0.00, 0.00, 0.20, 1.10, 1.00, 1.00, 1.00, 0.10, 1.15, 1.00, 1.00, 1.00, 0.00 ])
Орбитали в порядке, но не в масштабе:
1-0-0
2-0-0
2-1-0
2-1-1
3-0-0
3-1-0
3-1-1
3-2-0
3-2-1
3-2-2
4-0-0
4-1-0
4-1-1
4-2-0
4-2-1
4-2-2
4-3-0
4-3-1
4-3-2
4-3-3
images = []
for fig in sorted(listdir('./')):
if fig[:3] == 'fig':
images.append(Image('./'+fig))
display(*images)