В этом блоге я решил рассмотреть некоторую квантовую химию на уровне колледжа для получения электронных орбиталей. Дополнительная забавная часть в том, что мы собираемся визуализировать волновые функции и вероятности электронов ... используя Python!
В 1926 году Эрвин Шредингер выдвинул знаменитое волновое уравнение, которое связывает энергию системы с ее волновыми свойствами. Поскольку его применение к атому водорода довольно сложно, мы сначала используем волновое уравнение для решения частицы в коробке. Волновое уравнение Шредингера, выраженное в 1D
Теперь, чтобы упростить наше уравнение, мы предполагаемЧастица в коробке,
Проблема частиц в коробке не соответствует какой-либо реальной химической системе. Его полезность в нашем контексте заключается в том, что он иллюстрирует некоторые квантово-механические особенности. Потенциальная энергия на барьере установлена на бесконечность (т.е. частица не может вырваться), а потенциальная энергия внутри барьера установлена на 0. В этих условиях классическая механика предсказывает, что частица имеет равную вероятность нахождения в любой части коробка и кинетическая энергия частицы могут иметь любое значение. Принимая это предположение во внимание, мы получаем различные уравнения для энергии частицы на барьере и внутри коробки.
На барьере V бесконечно и, следовательно, частица не существует:
Внутри прямоугольника V равно нулю и, следовательно, волна может иметь любое конечное значение:
Внутри коробки мы можем изменить уравнение следующим образом:
Как мы видим выше, волновая функция должна быть такой, чтобы при двукратном дифференцировании она давала ту же функцию, умноженную на E. Функция синуса обладает таким поведением.
Теперь нам нужно оценить значения констант, α и A. Для α мы используем волновые уравнения на барьерах, где волновые функции равны 0.
Теперь добавьте значение для α:
Мы можем определить значение A, потребовав нормализовать волновую функцию. Это потому, что частица должна существовать где-то в коробке. Следовательно, сумма вероятности нахождения частицы в коробке равна 1:
Включая значения, окончательные волновые и энергетические уравнения:
Визуализация энергии и волновых функций с помощью Python:
import matplotlib.pyplot as plt
import numpy as np#Constants
h = 6.626e-34
m = 9.11e-31#Values for L and x
x_list = np.linspace(0,1,100)
L = 1def psi(n,L,x):
return np.sqrt(2/L)*np.sin(n*np.pi*x/L)def psi_2(n,L,x):
return np.square(psi(n,L,x))plt.figure(figsize=(15,10))
plt.suptitle("Wave Functions", fontsize=18)for n in range(1,4):
#Empty lists for energy and psi wave
psi_2_list = []
psi_list = []
for x in x_list:
psi_2_list.append(psi_2(n,L,x))
psi_list.append(psi(n,L,x)) plt.subplot(3,2,2*n-1)
plt.plot(x_list, psi_list)
plt.xlabel("L", fontsize=13)
plt.ylabel("Ψ", fontsize=13)
plt.xticks(np.arange(0, 1, step=0.5))
plt.title("n="+str(n), fontsize=16)
plt.grid() plt.subplot(3,2,2*n)
plt.plot(x_list, psi_2_list)
plt.xlabel("L", fontsize=13)
plt.ylabel("Ψ*Ψ", fontsize=13)
plt.xticks(np.arange(0, 1, step=0.5))
plt.title("n="+str(n), fontsize=16)
plt.grid()plt.tight_layout(rect=[0, 0.03, 1, 0.95])
Обратите внимание, что есть регионы, где оба Ψи Ψ*Zero равны нулю в тех же регионах. Это известно как узел. Энергетические уровни орбиталей не являются непрерывными. Они существуют на дискретных уровнях, представленных расположением узлов. Кроме того, по мере увеличения значения n плотность волны внутри прямоугольника также увеличивается.
Теперь, чтобы получить волновое уравнение относительно квантовых чисел, оно должно быть в следующем трехмерном формате:
Теперь разделение переменных зависит от типа атома и является слишком сложным, чтобы охватить это сообщение в блоге. Вместо этого мы просто напишем решение непосредственно для построения графика. В дальнейшем мы будем использовать функции R и Y для атома водорода, не выводя их.
Во-первых, давайте посмотрим на орбиту 1 с:
Волновая функция 1s показывает, что вероятность появления электрона уменьшается экспоненциально по мере удаления от ядра. Это также показывает сферическую форму.
import matplotlib.pyplot as plt
import numpy as np#Probability of 1s
def prob_1s(x,y,z):
r=np.sqrt(np.square(x)+np.square(y)+np.square(z))
#Remember.. probability is psi squared!
return np.square(np.exp(-r)/np.sqrt(np.pi))#Random coordinates
x=np.linspace(0,1,30)
y=np.linspace(0,1,30)
z=np.linspace(0,1,30)elements = []
probability = []for ix in x:
for iy in y:
for iz in z:
#Serialize into 1D object
elements.append(str((ix,iy,iz)))
probability.append(prob_1s(ix,iy,iz))
#Ensure sum of probability is 1
probability = probability/sum(probability)#Getting electron coordinates based on probabiliy
coord = np.random.choice(elements, size=100000, replace=True, p=probability)
elem_mat = [i.split(',') for i in coord]
elem_mat = np.matrix(elem_mat)
x_coords = [float(i.item()[1:]) for i in elem_mat[:,0]]
y_coords = [float(i.item()) for i in elem_mat[:,1]]
z_coords = [float(i.item()[0:-1]) for i in elem_mat[:,2]]#Plotting
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_coords, y_coords, z_coords, alpha=0.05, s=2)
ax.set_title("Hydrogen 1s density")
plt.show()
Немного трудно увидеть на графике электронной плотности выше. Тем не менее, вы можете видеть, что он имеет сферическую форму. По мере удаления от центра плотность уменьшается. Как правило, точка отсечения - это когда вероятность появления электрона составляет 99%.
Графики той же плотности могут быть получены и для других spdf-орбиталей. Надеюсь, этот блог мотивировал вас повеселиться с квантовой физикой и программированием на Python! Чтобы узнать больше о визуализации на основе Python, посетите мой блог: Плоттинг на основе Python с Matplotlib