![](https://habrastorage.org/getpro/habr/upload_files/736/c47/e2b/736c47e2b9103bb8f669ea37d702238b.jpg)
В этой статье, переводом которой мы делимся к старту курса о Fullstack-разработке на Python, автор решил рассмотреть некоторые вопросы квантовой химии уровня колледжа для выведения электронных орбиталей. В чём интерес? Волновые функции и вероятности электронов будут визуализироваться при помощи Python.
Уравнение Шрёдингера
В 1926 году Эрвин Шрёдингер вывел знаменитое волновое уравнение, связывающее энергию системы с её волновыми свойствами. Его применение к атому водорода довольно сложно, поэтому сначала воспользуемся волновым уравнением, чтобы решить задачу о «частице в коробке». Выраженное в одномерном пространстве волновое уравнение Шрёдингера имеет вид:
![](https://habrastorage.org/getpro/habr/upload_files/d1c/df3/00d/d1cdf300dee4e29fa782f723e943b74e.png)
Визуализация частицы в коробке
Теперь для упрощения мы предположим о частице в коробке, что:
![Частица в коробке Частица в коробке](https://habrastorage.org/getpro/habr/upload_files/8d9/6cc/bd5/8d96ccbd565fb3848adc378541fb7ffd.png)
Задача о «частице в коробке» не соответствует ни одной реальной химической системе. Её полезность в контексте ситуации заключается в иллюстрировании нескольких квантово-механических особенностей. Потенциальная энергия на барьере по условию бесконечна (т. е. частица не может вырваться), а потенциальная энергия внутри коробки равна 0. В этих условиях классическая механика предсказывает, что частица имеет равную вероятность оказаться в любой точке коробки, а кинетическая энергия частицы может оказаться любой. Принимая во внимание это предположение, мы получаем различные уравнения энергии частицы у барьера и внутри коробки. На барьере V бесконечно, и, следовательно, частица не существует:
![](https://habrastorage.org/getpro/habr/upload_files/359/05d/d24/35905dd24643d580ae286da467faf6e1.png)
Внутри коробки V равно нулю, и, следовательно, волна может иметь любое конечное значение:
![](https://habrastorage.org/getpro/habr/upload_files/6d8/67e/b0a/6d867eb0ae8399ca4b7833ccda2a0ecd.png)
Уравнение условий внутри коробки можно переписать так:
![](https://habrastorage.org/getpro/habr/upload_files/94e/6f4/2d7/94e6f42d7ee5a966536491dc67024103.png)
Выше видно, что волновая функция окажется такой, что при двойном дифференцировании получится та же функция, умноженная на E. Таким поведением обладает функция синуса:
![](https://habrastorage.org/getpro/habr/upload_files/5e0/b2f/f6f/5e0b2ff6fc95eb23c48b5ba49db4dfa3.png)
![](https://habrastorage.org/getpro/habr/upload_files/4e1/8d5/3e6/4e18d53e6307ab34d153810e7b04c10d.png)
![](https://habrastorage.org/getpro/habr/upload_files/c67/387/fb4/c67387fb498040f3ea06230c98b2e149.png)
Теперь нужно вычислить значения констант ? и A. В случае воспользуемся волновыми уравнениями на барьерах, где волновые функции равны 0.
![](https://habrastorage.org/getpro/habr/upload_files/647/1b7/2ea/6471b72ea84da1c0c7a54064ce7a39f0.png)
![](https://habrastorage.org/getpro/habr/upload_files/53f/0c4/a91/53f0c4a9183c8475f4d2a1728973048d.png)
Подставляем значение для ?:
![](https://habrastorage.org/getpro/habr/upload_files/326/9d4/a39/3269d4a39e0b2dc274df162587a6191d.png)
![](https://habrastorage.org/getpro/habr/upload_files/5fa/d3a/ba4/5fad3aba4ab48aaa74054d0c536c050a.png)
Требуя нормализации волновой функции можно определить значение A. Это утверждение верно потому, что частица должна существовать где-то в коробке. Следовательно, сумма вероятностей нахождения частицы в коробке равна 1:
![](https://habrastorage.org/getpro/habr/upload_files/36d/2cd/6e3/36d2cd6e3e0913e1b49add1aece3160e.png)
![](https://habrastorage.org/getpro/habr/upload_files/0e7/eb4/679/0e7eb4679345fcd1d2b072684b7ad53b.png)
Подставляя значения, получаем окончательные уравнения волны и энергии:
![](https://habrastorage.org/getpro/habr/upload_files/f16/57d/03d/f1657d03da784abb9aa6cc9bc7a48f8c.png)
![](https://habrastorage.org/getpro/habr/upload_files/2ac/8e7/ed8/2ac8e7ed8e786cfb88f209817fcca9bb.png)
Визуализируем энергию и волновые функций при помощи 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 = 1
def 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])
![](https://habrastorage.org/getpro/habr/upload_files/423/8e4/5ba/4238e45ba3d903f8c0dabde58e8a8512.png)
![](https://habrastorage.org/getpro/habr/upload_files/ec8/5f2/e33/ec85f2e330557f96f6dc959dbc4e5256.png)
Обратите внимание, что есть области, где одновременно ? и ? * ? равны нулю. Они известны как узлы. Уровни энергии орбиталей не являются непрерывными. Они существуют на разных уровнях, что демонстрируется их расположением. Кроме того, с увеличением значения n плотность волны внутри коробки также увеличивается.
Визуализация орбиталей
Теперь, чтобы получить волновое уравнение относительно квантовых чисел, мы должны привести его в следующий трёхмерный формат:
![](https://habrastorage.org/getpro/habr/upload_files/962/55b/1ef/96255b1efd4b521e94236fea7b684fd1.png)
Разделение переменных зависит от типа атома, и для данной статьи оно слишком сложно. Вместо этого просто запишем решение непосредственно для построения графика. Далее воспользуемся функциями R и Y для атома водорода, не выводя их. Сначала рассмотрим орбиталь 1s:
![](https://habrastorage.org/getpro/habr/upload_files/f6c/a3a/e83/f6ca3ae8338a3cb0d08c88242f18b798.png)
Волновая функция 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()
![](https://habrastorage.org/getpro/habr/upload_files/e57/9b2/e7a/e579b2e7a4b0b2bb1640869bd2d2299a.png)
Разглядеть её на графике электронной плотности выше немного затруднительно, однако сферу в целом увидеть возможно. Плотность уменьшается по мере удаления от центра. Как правило, точкой отсчёта является момент, когда вероятность появления электрона составляет 99 %. Такие же графики плотности возможно получить и для других орбиталей: s, p, d и f.
Статья показывает, как Python может применяться в науке и как визуализация тех или иных данных помогает делать выводы, а значит получать знания. Если вы хотите углубиться в вероятности, анализ данных, но применять его в прикладных задачах, вы можете присмотреться к специализации Аналитик данных, а если вас интересуют возможности и гибкость Python, то можете обратить внимание на курс о Fullstack разработке на Python.
![](https://habrastorage.org/getpro/habr/upload_files/9f2/681/a01/9f2681a01aabb7898abb0dad07253dc1.png)
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
Другие профессии и курсы
ПРОФЕССИИ
КУРСЫ
addewyd
Статья показывает, как с помощью numpy и matplotlib нарисовать синусоиду.