공부하는 북극성

[양자화학, 파이썬] matplotlib를 이용하여 궤도함수 별 가리움 효과를 설명하기 위한 확률 밀도 함수 그래프 그리기 본문

나누는 삶/수업자료

[양자화학, 파이썬] matplotlib를 이용하여 궤도함수 별 가리움 효과를 설명하기 위한 확률 밀도 함수 그래프 그리기

북극성 ✰ 2023. 8. 12. 13:59
728x90
반응형

0. 들어가며 


학생들과 양자역학을 공부하게 되면서 필요한 자료들이 많이 생겼다. 
한국어로 검색하면 나오지 않는 그래프들도 많고, 
영어로 검색해서 얻어내도 썩 마음에 들지 않는 데다가 
서적이나 논문에 있는 자료가 아닌데, 이 자료를 믿으라고 제시하는 것이 썩 꺼림칙해서 
직접 주어져있는 수식을 이용하여 그래프나 오비탈의 등가곡선을 구현하여 이해를 도와보고자 했다. 
 
코딩의 ㅋ도 모르는 내가 파이썬을 이용하여 구현할 수 있게 용기를 준 소스는

KMOOC 에서 제공하는 이 강의이다. 
교수님께서 설명을 엄청 잘하셔서 정말 1도 모르는 사람도 잘 따라갈 수 있기 때문에 관심 있으면 추천한다. 
http://www.kmooc.kr/courses/course-v1:POSTECHk+CHEM101+2021_T1/course/ 

 

강좌 | CHEM101 | K-MOOC

www.kmooc.kr

 
 
 
 
 

1. 준비해야하는 것 

 
가. 파이썬 설치하기
나. numpy 설치하기 
다. matplotlib 설치하기
라. plotly 설치하기 
 
다. matplotlib까지 설치하면 확률 밀도 함수 그래프까지 그릴 수 있고 
라. plotly까지 설치하면 오비탈 등가곡면을 그려서 다양한 오비탈 모양을 구현해 줄 수 있다. 
 
 
 
 
 

 

2. 내가 그린 확률 밀도 함수 

고등학교 교육과정 내에서는 궤도함수의 에너지 준위는 유효 핵전하 Zeff 와 주 양자수  n 만을 이용하여 Zeff2n2 를 통해 비교하기 때문에 더 나아간 식을 계산하지 않고, 유효 핵전하 Zeff 에 영향을 미치는 조건들만 확인하면 된다. 
 
 

가. 주 양자수 n 에 의한 가리움 효과

주 양자수 n 을 1에서 4까지 바꾸면서 핵에 얼마나 전자가 가까이에서 발견될 수 있는지 확률 밀도 함수를 그려보았다.
(※ 확률을 P(r)dr 로 설정하였기 때문에, 방사 부분의 확률 밀도가 P(r) 이다. 세로축을 확률로 착각하지 않도록 한다.)

1s vs 2s vs 3s vs 4s

이렇게 보면 딱히 도움이 되지 않는다. 
 
확대해 보자. 

딱히 도움이 되는 것 같지 않다. 
이거는 극대값 구하는 거 배우고 나서 ㅎㅎㅎ 적용을 해보겠다. 
 
 
 

나. 각운동량 양자수 l 에 의한 가리움 효과

교과서나 전공서적에서 자주 등장하는 2s 와 2p 궤도함수를 비교하면 다음과 같다. 

2p vs 3p

 
하지만, 학생들이 d 궤도함수까지 공부하는데, 여기서 멈추기에는 아쉽다. 
그래서 s, p, d 궤도함수의 가리움 효과를 비교하기 위하여 주 양자수 n 이 3인 궤도함수의 확률밀도를 비교해 보았다.

3s vs 3p vs 3d (radial part)

 
 

다.  4s 궤도함수와 3d 궤도함수의 에너지 준위 역전

3d vs 4s

 
여기서 주의해야 할 점은 전자가 발견될 확률이 핵으로부터 가장 가까운 지점에 있는 궤도함수는 덜 가려져있어 유효 핵전하가 크다고 설명하면 된다. 
간혹 최대 전자 발견 확률이라고 설명하는 경우가 있는데, 3d의 전자 발견 최대 지점 은 맞지만 4s에서는 맞지 않는다. 
확률 밀도의 봉우리 위치를 비교해주어야 한다.
(침투효과로 이야기하기도 함.)
 
 
 
 
 
 
 

3. 수업시간 활용

이번 학기에 사용할 예정이라 아직 경험이 없지만, 
학생들은 중학생 때부터 코딩 공부가 잘 되어 있기 때문에 코드를 보여주고 나눔 하면 금방 이해할 것이라고 생각한다. 
 
수업 시간에 보여줄 때는 Carnets라는 IOS 어플을 이용하여 아이패드에서 구현해서 보여줄 예정이다. 
Carnets라는 어플은 주피터 노트북을 모바일에서 쓸 수 있게 해 준다.

아이패드에서 Carnets 구동 화면

 
 
 
 
 
 

4. 코드 공유 (2023.0916. 업데이트)

KMOOC 보며 배운 것에다가 내가 전공서적 뒤져가며 방사파트의 파동함수를 입력한 코드를 공유한다. 
코드 내에서 보여주고 싶은 파동함수를 고르고, 그래프 색을 지정하고, 보여줄 축의 범위만 지정하면 된다. 

# plot radial wave function
import plotly.graph_objects as go
import matplotlib.pyplot as plt
import numpy as np

r = np.arange(0,50,0.1)
a0 = 0.529 # in A
sig = r/a0

row_1 = 2 * sig
R1s = a0 **(-3/2) * np.exp(-row_1/2) * 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

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) * (16/(81*81*6))**(1/2) * (6*sig - sig**2) * np.exp(-sig/3)
R3d = a0**(-3/2) * np.exp(-row_3/2) * (81*30)**(-1/2) * row_3**2
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)



#필요한 오비탈 식 앞에서는 #를 지우면 됩니다. 
#plt.plot(r,(R1s*r)**2,'b-',label='1s')
#plt.plot(r,(R2s*r)**2,'skyblue',label='2s')
#plt.plot(r,(R2p*r)**2,'r-',label='2p')
plt.plot(sig,a0*(R3s*r)**2,color='#1f77b4',label='3s')                        
plt.plot(sig,a0*(R3p*r)**2,color='#e35f62',label='3p')
plt.plot(sig,a0*(R3d*r)**2,color='#ff7f0e',label='3d')
#plt.plot(r,(R4s*r)**2,'violet',label='4s')

plt.legend()

#축 눈금 범위입니다. 
plt.ylim(0,0.115)
plt.xlim(0,20)

#축 이름이에요. 수식으로 써서 이렇게 나타나져있습니다. 문자로 쓰시려먼 괄호 안에 "" 치고 쓰시면 됩니다. 
plt.ylabel(r'$r^2*{R(r)}^2$')
plt.xlabel(r'$r/{a_0}$')
#plt.xlabel("r in Å")


plt.grid()
plt.plot()

#아래는 그림이 저장되게 하는 코드입니다. 필요없다면 앞에 # 처리해주세요. 
plt.savefig('n이 3인 s,p,d 오비탈.png')



plt.show()

 
 
 
 

5. 파일 나눔

주피터 노트북에서 작성한 코드(2023.09.16. 업데이트)

궤도함수 확률밀도 .ipynb
0.25MB

 
 
 
 
 
 

나가며

일단 극대값 구하여 표시하는 것을 알게 되면 업데이트할 예정. 
수업 시간에 쓰고 나면 경험 나눔도 할 예정. 
 
다음은 오비탈 등가곡면 구현하는 것을 공유해보고자 한다. 
 
 
 
모두에게 도움이 되길. 
 
 
 
 
 
 
 
 
 
 
 
 

728x90
반응형