공부하는 북극성
[양자화학, 파이썬] plotly를 이용한 혼성 오비탈, 혼성 궤도함수 3D plot, 109.5˚의 이유 본문
들어가며
드디어 2학기가 시작되고, 학생들이 화학결합을 양자적 관점에서 바라보는 때가 되었다.
이제 3개 반 수업을 했는데, 첫 반에서부터 선형 결합 결과에 대한 의문을 많이 품길래
이미지화를 시켜줄 필요가 있다고 생각했다.
그래서 이전에 만들어 두었던 궤도함수 코드를 이용하여 간단하게 혼성 궤도함수를 3D로 구현해보았다.
코드 공유
1. 참고한 혼성 오비탈 선형결합 식
<혼성 궤도함수 >
<혼성 궤도함수>
출처: 물리화학 11판, Peter Atkins 외 2명, 안운선 옮김, 교보문고
2. 코드
import plotly.graph_objects as go
import numpy as np
L = 10
a0 = 0.529 # in A
X, Y, Z = np.mgrid[-L:L:40j, -L:L:40j, -L:L:40j]
r = (X**2 + Y**2 + Z**2) **0.5
theta = np.arccos(Z/r)
phi = np.arctan(Y/X) + np.where(X<0, np.pi, 0)
sig = r/a0
# radial part
# n=1
row_1 = 2 * sig
R1s = a0 **(-3/2) * np.exp(-row_1/2) * 2
# n=2
row_2 = sig
R2s = a0 **(-3/2) * np.exp(-row_2/2) * 8 ** (-1/2) * (2-row_2)
R2p = a0 **(-3/2) * np.exp(-row_2/2) * 24**(-1/2) * row_2
# n=3
row_3 = (2/3)*sig
R3s = a0 **(-3/2) * np.exp(-row_3/2) * (81*3)**(-1/2) * (6-6*row_3+row_3**2)
R3p = a0 **(-3/2) * np.exp(-row_2/2) * (81*6)**(-1/2) * (4-row_3)*row_3
R3d = a0**(-3/2) * np.exp(-row_3/2) * (81*30)**(-1/2) * row_3**2
# n=4
row_4 = (1/2)*sig
R4s = a0**(-3/2) * np.exp(-row_4/2) * (1/96) * (24-(36*row_4)+12*row_4**2-row_4**3)
# R4p = 16/(16*a0)**(-3/2) * (1 - ((3/2)*row_4) + (2*((1/2)*row_4)**2) -((2/5)*(row_4)**3)) * np.exp(-(1/2)*row_4)
R4p = a0**(-3/2) * np.exp(-row_4/2) * row_4 * (15/9)**(1/2) * (1/8) * (1 - row_4/2 + (3/64)*(row_4**2))
R4d = (8/15)*(5**(1/2))*(4*row_4)**(3/2) * np.exp(-(1/2)*row_4) * (2*row_4 - ((1/4)*row_4)**2 + (8/3)*((1/4)*row_4)**3)
# Angular part
As=(4*np.pi)**(-1/2)
Apz=(3/4*np.pi)**(1/2) * np.cos(theta)
Apy=(3/4*np.pi)**(1/2) * np.sin(theta) * np.sin(phi)
Apx=(3/4*np.pi)**(1/2) * np.sin(theta) * np.cos(phi)
Adz2=(5/4*np.pi)**(1/2) * (3*np.cos(theta)**2-1)
Adxz=(15/4*np.pi)**(1/2) * np.cos(theta) * np.sin(theta) * np.cos(phi)
Adyz=(15/4*np.pi)**(1/2) * np.cos(theta) * np.sin(theta) * np.sin(phi)
Adxxyy=(5/4*np.pi)**(1/2) * np.sin(theta)**2 * np.cos(2*phi)
Adxy=(5/4*np.pi)**(1/2) * np.sin(theta)**2 * np.sin(2*phi)
def plot_orbital():
# print(np.max(values))
# print(np.min(values))
fig = go.Figure(data=go.Isosurface(
x=X.flatten(),
y=Y.flatten(),
z=Z.flatten(),
value=values.flatten(),
colorscale='bluered',
opacity=0.3,
isomin=np.min(values)*0.05,
isomax=np.max(values)*0.05,
caps=dict(x_show=False, y_show=False, z_show=False)
))
fig.show()
#sp3 혼성 오비탈
h_1 = (R2s*As) + (R2p*Apz) + (R2p*Apy) + (R2p*Apx)
h_2 = (R2s*As) - (R2p*Apz) - (R2p*Apy) + (R2p*Apx)
h_3 = (R2s*As) - (R2p*Apz) + (R2p*Apy) - (R2p*Apx)
h_4 = (R2s*As) + (R2p*Apz) - (R2p*Apy) - (R2p*Apx)
#sp2 혼성 오비탈
sp2_1 = (R2s*As) + (2**(1/2)*(R2p*Apy))
sp2_2 = (R2s*As) + ((3/2)**(1/2)*(R2p*Apx)) - ((3/2)**(1/2)*(R2p*Apy))
sp2_3 = (R2s*As) - ((3/2)**(1/2)*(R2p*Apx)) - ((3/2)**(1/2)*(R2p*Apy))
values = h_2
plot_orbital()
ipnb 파일로 공유하고 싶은데 용량 초과로 인해... txt 파일로 공유한다.
jupyter notebook에서 각각의 오비탈에 대해 적고 실행시키면 된다.

결과물
1. 혼성 궤도함수








캡쳐해서 보니까 이들 사이의 각도나 위치가 다 다르다는 게 잘 안 보이는데,
3D plot 되어 있는 상태에서 이리저리 돌려보면서 보면 이 관계가 잘 보인다.
학생들한테 공유해주고 돌려보라고 뿌린 상태임.
2. 혼성 궤도함수



120˚ 각도를 두고 같은 평면에 있는게 한눈에 잘 보여서 굉장함.
로브 사이즈가 다른 것도 언뜻 보이기는 하는데, 엄청 차이가 나 보이지는 않아서
상쇄간섭이 얼마나 일어나는지가 잘 안 보이는 게 아쉬운 점이다.
학생질문
이걸 공부하면서 학생들이 질문한 것이 있었다.
그런데 90˚ 관계 있던 것이 s 오비탈 하나 추가되었다고 어디 듣도보도 못한 109.5˚ 라는 각도가 나왔냐는 것이다.
미술 실력이 아주 형편 없는 나는,
그 자리에서 학생들한테 그림을 그려 설며해주다가 포기하고
아이패드로 정리해서 학생들에게 뿌려주었는데
여전히 이것도 나의 표현 능력 이슈로, 애들이 최대한의 공간지각 능력을 이용하여 이해했다...
ㅋㅋㅋㅋㅋ ...
혹여나 필요할까 하여 그렸던 자료 올려본다.



과학교사이지만,
수포자이면 안되는 이유...
나오며
나는 대학다니면서 양자화학을 접하고 너무 재밌었기때문에
우리 학생들도 재밌길 바라면서 수업 준비를 시작했는데,
주어진 시간이 너무 촉박하여 뭐... 개념만 다루는 데에도 좀 벅찬감이 매우x10000000 있다.
원자가 결합 이론을 1시간, 분자 궤도함수 이론을 2시간 내에 끝내야하는데
이게... 교육인가...?
우리 아이들 너무 훌륭하고 대단한데,
그 훌륭한 아이들을 이런 식으로 소비해도 되는지에 대한 의문이 너무 크다.
이렇게나 훌륭한 아이들이 과학에서의 가치를 느낄 틈도 없이
다른 외부적 요인에 의한 가치만 더더욱 깨닫게 되면서
우리나라 이공계의 미래가 더욱이 어두워지는 것이 아닐까?
... 푸념이었다.
얘들아, 우리 그냥 행복하자.