공부하는 북극성

[산염기적정, 파이썬] matplotlib를 이용하여 PASCO pH meter로 얻은 적정곡선에서 당량점 pH 구하기 (산점도의 변곡점 구하기)(24.7.13.수정) 본문

나누는 삶/수업자료

[산염기적정, 파이썬] matplotlib를 이용하여 PASCO pH meter로 얻은 적정곡선에서 당량점 pH 구하기 (산점도의 변곡점 구하기)(24.7.13.수정)

북극성 ✰ 2024. 6. 23. 17:16
728x90
반응형

 

들어가며 

 
올해는 고급화학 과목에서 학생들과 산염기에 대해 공부하고 있다. 
작년에 1학기 2학점 동안 화2를 끝내야했던 나는 산염기 도입만 다룰 수 있었고 완충용액과 적정곡선 부분은 아예 시작도 못했다. 
 
그래서 올해 처음 학생들과 산염기 적정을 다룰 수 있게 되었는데 
학교에 PASCO pH meter 라는 아주 좋은 센서가 있어서 그걸 가지고 학생들과 실험 수업을 하려고 했다. 
(쓸 때마다 callibration을 하지 않아도 되는 놀라운 센서다. 오차가 많이 심하지도 않음.)
 
그런데 문제점이 생김. 
 
이 센서가 일정 시간 간격으로 pH 를 측정하는 것이라서, 적정 곡선의 모양은 참 예쁘게 나오는데 
그것이 산점도라는 점이다. 
 
아. 이게 pH만 측정해서는 당량점의 pH를 정확히 구할 수가 없구나. 
 
물론 정확히 당량점에 도달했을 때의 시간을 알 수 있다면 간접적으로 당량점의 pH 를 알 수 있겠지만, 
어차피 아날로그 뷰렛에서 용액이 떨어지는 속도는 갈수록 느려져서 적정시약이 투하되는 간격이 일정하지도 않으며 
이렇게 찾아내는 것이 과연 학생들의 학습면에서 어떤 의미가 있는가? 
 
되려 적정곡선 내에서 우리가 배울 수 있는 점을 이용할 수 있다면 더 좋지 않겠는가? 
 
하는 생각이 들어서 또 코딩에 손을 대게 되었다. 
 
적정곡선 내에서 당량점의 위치는 기울기가 급격하게 변하면서 그 부호가 변하는 변곡점!!!! 
 
산점도로 나타난 그래프의 변곡점만 찾을 수 있다면 당량점의 pH? 구할 수 있겠구나. 
라는 생각이 들어서 시작했는데 이게 이렇게 골이 아플 거라고는 생각도 못했다. 
 
요즘 PASCO 센서는 여러 학교에서 많이 쓰고 있는데 이 센서가 더 예산값 하게 하려면 조금더 의미가 있었으면 해서 
학생들과 수업하기 위해 준비한 내용을 공유해보려고 한다. 
 
 

1. 준비해야 하는 것

 
가. PASCO pH meter (한 대당 약 20만원쯤 합니다. 와이케이사이언스에 문의. 나날이 가격이 오르는 중.) 
나. SPARKvue 어플 (무료입니다. IOS/Android 모두 있음. 컴퓨터용도 있음. 블루투스 기기입니다.) 
 
다. 파이썬 설치하기
라. numpy 설치하기
마. matplotlib 설치하기
바. scipy 설치하기 
사. pandas 설치하기 
 
학생들도 모둠별로 코드 돌릴 수 있는 기기 한대는 있어야 합니다. 
 
 

< 적정곡선 예시 >

2. SPARKvue 어플에서 그린 적정곡선

Titration curve for acetic acid with NaOH


PASCO pH meter를 연결하여 어플에서 작동을 시키면 이런 식으로 나온다. 
 
5 Hz 주기로 측정해서 0.2 초 간격으로 뺵뺵한 것을 볼 수 있다. 
 
사실 여기서 대략적으로 pH 가 치솟는 부분 중간을 따서 
'여기가 당량점의 pH 다!! '라고 해도 되지만 
신빙성이 떨어지니까... 
 
이 자료를 받아서 파이썬보고 그려달라고 하고, pH도 찾아달라고 하면 된다. 
 
 
그러면 이렇게 그려줌. 
 
진짜 나의 고군분투의 결과... 
 
 
 

3. 내가 그린 적정 곡선 

Titration curve for acetic acid with NaOH


반당량점의 pH가 이론적으로 4.76 이 나와야하지만 (아세트산의 pKa = 4.76 at 25℃)
이 정도면 충분히 잘 나왔다고 생각한다. 
 
 

4. 학생들이 적정하고 그린 적정곡선

 
< 손 기술이 좋은 편 >

 
 
 
< 손 기술이 안 좋은 편 >

 
 
학생들이 작성한 모둠 보고서에서 긁어온 그림들이다. 
대부분은 시키는 대로 잘 하기때문에 적정곡선이 예쁘게 나오는 편. 
 
간혹 뷰렛을 마구 조작하는 경우 손 기술이 안 좋은 것으로 포장되는 저런 이상한 적정곡선들이 나오게 된다.
 
그리고 정말정말 이상하게 해서 파이썬으로 변곡점을 찾지 못하는 경우, 수동으로 찾으라고 했는데 
다행히도 160명의 아이들 중에 그런 조는 없었다. (첫날에 코드 에러 떠서 학생이 수정해주기 전까지는 수동으로 찾은 조도 있긴 하다) 
 
 
 

< 파이썬 코드 >

5. 코드 공유

산염기적정곡선 데이터_최종.py
0.00MB
산염기적정곡선_데이터_최종.ipynb
0.05MB
산염기적정곡선_데이터_최종_ver_for_colab.ipynb
0.05MB

(24.07.13. 최종 수정본)

 


내가 만든 코드가 첫날 에러가 뜨는 바람에 그날 오후에 코딩 잘하는 한 학생이 수정해준 코드다. 
그래서 둘째날부터는 무난히 잘 진행됨... 
 
(저 친구는 작년 공개수업 때 기체분자운동론 관련 시뮬레이터를 만들어 발표해서 학부모님들을 놀라게 한 친구다.
교장 선생님은 타이밍 이슈로 못 보고 가신게 참 아쉽. )
 
 
Jupyter notebook 으로 작성한 노트북 파일을 학생들에게 공유했다. 
학생들은 Google Colab 을 많이 쓰고 있어서 거기로 불러와서 코드를 돌렸음. 
 

Teams에 공지한 내용

 
 

6. 코드 사용법

 

가. 일단 적정이 끝나고 나면 SPARKvue 어플 내에서 csv 파일을 Share Data를 통해 다운로드 받으세요. 

 

처음 csv 파일을 받으면 이렇게 생겼습니다.

 

.ipynb 파일을 열면 보이는 모습

 

 

나. CSV 파일의 경로를 복사합니다.

     (Window: 오른쪽 버튼 누르고 [경로 이름으로 복사]

     / Mac: [보기] - [경로 막대 보기] - 경로에서 오른쪽 버튼 누르고 [경로 이름을 복사])

 

다. CSV 파일에서 적정시작시간과 적정종료시간을 파악합니다. 

     (pH가 변화하기 시작하는 시간과 당량점 이후까지 적정한 시간을 입력하면 됩니다.)

라. 〉〉 모두 실행 버튼을 누릅니다.

마. 입력하라는 대로 입력합니다. 

 

바. 스크롤을 내려 밑으로 내리면 완성된 적정곡선이 있습니다. 저장하거나 복사하여 사용하시면 됩니다. 

 

 
 

7. 그래프 수정하기 (그래프 색깔, 범위 등)

 
수정하실만한 부분은 그래프의 색깔이나 축 범위, 축 이름 등의 것일 거라고 생각한다. 

이 부분을 수정하면 된다.

 

가. 적정곡선 두께 및 색깔 수정하기. 

plt.plot(x, y_smooth, linewidth = '3', color = 'blue')

 
linewidth = '숫자' 
부분을 수정하시면 곡선의 두께를 수정할 수 있습니다. 
 
color = 'blue' 
의 blue 부분을 수정하면 곡선의 색상을 바꿀 수 있습니다. 

https://koosco.tistory.com/147

 

[Matplotlib] 그래프 색 지정

Named colors in matplotlib What named colors are available in matplotlib for use in plots? I can find a list on the matplotlib documentation that claims that these are the only names: b: blue g: green r: red c: cyan m: mag... stackoverflow.com matplotlib

koosco.tistory.com

여기서 마음에 드시는 이름을 입력하시면 됩니다. 
 

나. 당량점과 반당량점의 수평 수직선 수정하기 

# 당량점의 수직선 입니다. 
plt.axvline(x=half_target_x, color='pink', linestyle='--')
# 당량점의 수평선 입니다. 
plt.axhline(y=np.median(half_target_y), color='pink', linestyle='--')

# 반당량점의 수직선입니다. 
plt.axvline(x=target_x, color='lightgray', linestyle='--')
# 반당량점의 수평선입니다. 
plt.axhline(y=target_y, color='lightgray', linestyle='--')

 
여기서 color 와 linestyle 을 변경하실 수 있습니다. 
 
color는 위에서처럼 설정하시면 되고 
linestyle 은 선의 모양을 지정하는 것인데, 

https://zephyrus1111.tistory.com/17

 

[기타] Matplotlib 선 종류(Line style) 지정

안녕하세요~ 꽁냥이에요. 이번 포스팅에서는 Matlotlib에서 선 종류를 지정하는 방법에 대해서 알아보려고 합니다. 그래프에서 선은 굉장히 많이 사용되는 요소입니다. 특히 아래 그림처럼 선 그

zephyrus1111.tistory.com

'--' 라고 되어 있는 자리에 위 사이트에서 안내하는 대로 지정하여 넣으시면 됩니다. 
 

다.  당량점과 반당량점의 pH를 안내하는 문구 수정하기

# 반당량점 입니다. 
plt.annotate(f'half equivalance point \n time = {round(half_target_x,1)}, pH = {np.median(half_target_y)}', (half_target_x, np.median(half_target_y)), textcoords="offset points", xytext=(-130, 5))
# 당량점 입니다. 
plt.annotate(f'equivalance point \n time = {round(target_x,1)}, pH = {target_y}', (target_x, target_y), textcoords="offset points", xytext=(-130, 5))

 

이걸 수정하는 건데요, 
 
f'어쩌구저쩌구' 부분에서 ' ' 안을 수정하시면 됩니다. 
원하시는 문구 적으시면 됩니다. 
\n 은 줄바꿈입니다. 
 

※ 주의 ※
한글말 써도 되는 걸 넣어놓지 않아서, 영어로 쓰지 않으시면 다 깨집니다. 
{ } 안에 있는 것은 건들지 않으셨으면 좋겠습니다. 

 

라. 당량점과 반당량점에 점찍힌 것 수정하기

# 당량점입니다. 
plt.scatter(target_x,target_y, c='r', s=25)

# 반당량점 입니다. 
plt.scatter(half_target_x,np.median(half_target_y), c='r', s=25)

 
c 는 색상입니다. 위에 안내된 것과 같이 수정하시면 됩니다. 
현재 c = 'r' 은 red 색상으로 지정한 것입니다. 

s 는 사이즈 입니다. 점백이가 얼마나 크게 찍히는지를 지정하는 것입니다. 
 
 

마.  축 범위, 간격, 이름 지정 

# x 축 범위 지정
plt.xlim(start_time,)   # 현재는 적정 시작 시간부터 보여달라고만 설정되어 있습니다. 

# y 축 범위와 간격 지정
plt.yticks(np.arange(1,15,1))   # 현재 1부터 시작하여 15까지(미포함)를 1간격으로 보여달라는 뜻입니다. pH 14까지 뜹니다. 

# 축 이름
plt.xlabel('Time')
plt.ylabel('pH')

 
축 범위는 lim 이 붙은 것에서 지정하시면 됩니다.
현재 x축 만 범위 지정이 들어갔습니다.
<code>plt.xlim(축 시작 범위, 축 끝 범위)</code> 입니다. 
입력받은 적정 시작 시간부터 보여주도록 되어 있습니다. 
 
축 간격은 ticks 로 되어 있는 부분입니다. 
현재는 1부터 15까지(미포함)를 1 간격으로 보여달라고 되고 있습니다. 
<code> plt.yticks(np.arange(시작하는 숫자,끝나는 숫자(미포함),간격)) </code> 입니다. 
저는 pH 라서 1부터 14까지 보였으면 했고 (더 진한 용액을 사용하실 예정이시라면 시작하는 숫자를 0으로 잡으셔도 됩니다) 
 
축 이름은 label 이 붙은 것에서 지정하시면 됩니다. 
여기도 영어로 적으셔야 합니다... 
 
 
 

나오며

 
작년부터 수업자료를 준비하며 파이썬을 다루고 있지만, 여전히 나는 코딩의 ㅋ도 모르는 상태다. 
일단 배우고자 하는 의지가 따로 있지 않으며, 그냥 지금 여기다가 잘 써먹고 싶을 뿐이다. 
다행인 점은 Chat GPT 선생님께 따박따박 말대꾸를 하다보면 길이 보인다는 점이며
GPT 선생님이 하시는 말씀 보고 검색하다보면 알게 되는 것들이 있다. 
 
그리고 나에게는 든든한 학생들이 있다. 
 
" 나 이거 하고 싶은데 막 이런 에러 뜬다? " 
라고 한 마디하면 코딩 좋아하는 친구들이 찾아와서 고쳐줌. 심지어 뭐가 문제였는지도 알기 쉽게 설명해 줌. 
나의 사랑스러운 아가들. 



+++ 학생들용 안내 영상들 제작한 것들이 있다.
혹시 참고용으로 필요하신 선생님들은 댓글 남겨주시면 공유해드리겠습니다.

728x90
반응형