8장 증기압과 Antoine 식
이번 주의 도구: 증기압 계산기
다음 상황을 생각해 보자. 시험1을 막 끝낸 학생이 화공양론 과제를 풀다가 100 °C에서 물의 증기압이 필요해졌고, AI에게 계산을 맡겼다. 돌아온 답은 0.76 bar. 그런데 일반화학에서 배운 대로라면 물은 1 atm(= 101.325 kPa)에서 100 °C에 끓으므로, 그 온도의 증기압은 1 bar 근처여야 한다.
코드를 아무리 읽어도 버그가 없다. 식도 맞고, 상수도 AI가 준 표 그대로다. 문제는 코드가 아니라 상수의 유효 온도범위였다. 이 25% 오차가 어디서 왔는지 해부하는 일이 이 장의 출발점이다.
- 증기압을 분자 수준의 직관으로 정의한다
- Clausius-Clapeyron 식에서 Antoine 식이 나온 맥락을 형태 수준에서 잇는다
- Antoine 상수의 4종 확인 규칙과 외삽의 위험을 실제 오차 수치로 보인다
- matplotlib로 단위 라벨과 대조점이 있는 증기압 곡선을 그린다
- 도구⑤ Antoine 증기압 계산기를 45분 mini practical로 만든다
이 장을 마치면 다음을 할 수 있다.
- 증기압과 끓음의 관계를 분자 수준에서 설명할 수 있다.
- Antoine 식으로 주어진 온도에서 순수 물질의 증기압을 계산할 수 있다.
- Antoine 상수 표에서 로그 밑·압력 단위·온도 단위·유효 온도범위 4종을 확인하고, 하나라도 빠진 표를 결함으로 지적할 수 있다.
- 유효범위 밖 외삽이 만드는 오차를 정량적으로 보이고 원인을 설명할 수 있다.
- matplotlib로 축 라벨·단위·대조점이 있는 증기압 곡선을 그릴 수 있다.
- 유효범위 검사가 내장된 증기압 계산기를 AI와 함께 만들고 검증할 수 있다.
이번 주 실습은 8.2~8.4절을 사용해 도구⑤ Antoine 증기압 계산기를 만든다(45분 타이머, 학번별 물질). 최종 시험의 주제 예시 ①(학번별 이성분계의 기포점/이슬점 계산기 + T-xy 작도, NIST 대조 검증 포함)이 바로 이 함수 위에 선다. 이번 실습의 형식은 그 시험의 축소판이다.
8.1 증기압: 액체에서 탈출하는 분자들
책상 위에 둔 컵의 물은 끓이지 않아도 며칠이면 줄어든다. 액체 속 분자들의 속도는 제각각이고, 표면 근처의 평균보다 빠른 분자는 이웃 분자가 붙잡는 인력을 이기고 기체로 빠져나간다. 온도가 오르면 이 빠른 분자의 비율이 늘어나므로 탈출도 잦아진다.
이번에는 컵 대신 밀폐 용기를 생각해 보자. 탈출한 분자는 용기 안에 갇혀 있다가 일부는 다시 액면으로 돌아온다. 시간이 지나면 나가는 속도와 돌아오는 속도가 같아지는 상태, 즉 동적 평형(dynamic equilibrium)에 도달한다. 이때 기체가 자신의 액체(또는 고체)와 공존하며 만드는 압력을 증기압(vapor pressure)이라 한다.
증기압은 물질과 온도에만 의존하고, 온도가 오르면 커진다. 물질마다 값이 다른 이유는 분자간 인력의 세기가 다르기 때문이다. 인력이 약한 물질일수록 같은 온도에서 더 많이 탈출하고, 증기압이 높다.
끓음은 이 그림의 특수한 경우다. 액체 내부에서 기포가 자라려면 기포 속 증기의 압력이 외부 압력을 밀어낼 만큼 커야 하므로, p*가 외부 압력과 같아지는 온도에서 액체 전체가 끓는다. 이 온도를 끓는점(boiling point)이라 하고, 외부 압력이 1 atm일 때의 끓는점을 정상 끓는점(normal boiling point)이라 한다. 20 °C의 물도 압력을 0.023 atm 아래로 낮추면 끓는다. 20 °C에서 물의 증기압이 그 값이기 때문이다.
화공 계산에서 증기압은 도처에 나타난다. 저장 탱크의 증발 손실, 용매 회수, 그리고 9장에서 만날 증류가 전부 증기압 곡선 위에서 움직인다. 이 곡선을 온도의 함수로 계산해 주는 것이 이번 주의 도구다.
생각해보기 높은 산에서는 물이 100 °C보다 낮은 온도에서 끓는다. 이 사실을 증기압 곡선 하나로 설명하는 방법을 두 가지 제안하라(하나는 말로, 하나는 곡선 위의 점과 선으로).
스스로 점검 (해답은 권말)
- 밀폐 용기 속 액체의 증발이 멈춘 것처럼 보일 때, 분자 수준에서는 무슨 일이 일어나고 있는가?
- 외부 압력이 0.5 atm이라면 물은 100 °C보다 높은 온도에서 끓는가, 낮은 온도에서 끓는가?
8.2 Clausius-Clapeyron에서 Antoine으로
증기압이 온도에 따라 어떻게 변하는지는 열역학이 답을 준다. 액체-기체 평형에 열역학 법칙을 적용하면 Clausius-Clapeyron 식이 나오고, 몇 가지 근사를 거친 적분형은 다음과 같다.
ln(p*₂/p*₁) = (ΔHvap/R)(1/T₁ − 1/T₂) (8.1)
유도는 3학년 열역학에서 만난다. 여기서는 형태에서 읽을 수 있는 것 하나만 가져가자. ln p*는 1/T에 대해 대략 직선이라는 점이다. 그래서 좁은 온도 구간의 증기압 데이터는 다음 꼴로 잘 맞춰진다.
ln p* = A − B/T (8.2)
이때 B는 물리 상수가 아니라 데이터를 맞추기 위한 곡선 맞춤 파라미터다. 실제 데이터는 넓은 구간에서 완전한 직선이 아니므로, 분모에 보정 상수 C를 하나 더 넣어 휘어짐을 흡수한 것이 Antoine 식(Antoine equation)이다.
log₁₀ p* = A − B/(T + C) (8.3)
식 (8.3)은 이론에서 유도된 법칙이 아니라 측정 데이터에 맞춘 경험식(empirical correlation)이다. 이 구별을 이 장 전체에서 계속 쓴다. 법칙은 적용 범위를 물리가 정하지만, 경험식의 적용 범위는 맞춤에 사용한 데이터가 정한다.
8.2.1 Antoine 상수를 읽는 법: 반드시 확인할 네 가지
상수 A, B, C는 물질마다, 그리고 온도 구간마다 다르다. 더 성가신 문제는 출처마다 표기 약속이 다르다는 점이다. NIST WebBook 자료를 정리한 LibreTexts 교재조차 "출처에 따라 온도 단위가 다르거나 log₁₀ 대신 ln을 쓰기도 한다"고 경고를 달아 둔다. 같은 물질의 상수라도 압력이 bar인 표와 mmHg인 표, 온도가 K인 표와 °C인 표가 섞여 돌아다닌다.
그래서 이 책은 Antoine 상수 표에 네 가지(로그 밑, 압력 단위, 온도 단위, 유효 온도범위)를 반드시 명기한다. 표 8-1은 NIST WebBook이 주는 물의 상수다. 같은 물인데 행이 여러 개인 이유가 보이는가? 각 행은 서로 다른 연구진이 서로 다른 온도 구간에서 측정한 데이터에 맞춘 결과이기 때문이다.
| 유효 온도범위 (K) | A | B | C | 원 데이터 |
|---|---|---|---|---|
| 273 ~ 303 | 5.40221 | 1838.675 | −31.737 | Bridgeman & Aldrich (1964) |
| 304 ~ 333 | 5.20389 | 1733.926 | −39.485 | Bridgeman & Aldrich (1964) |
| 334 ~ 363 | 5.0768 | 1659.793 | −45.854 | Bridgeman & Aldrich (1964) |
| 344 ~ 373 | 5.08354 | 1663.125 | −45.622 | Bridgeman & Aldrich (1964) |
| 379 ~ 573 | 3.55959 | 643.748 | −198.043 | Liu & Lindsay (1970) |
NIST 원본에는 이 밖에 두 행(293~343 K, 255.9~373 K)이 더 있다. 행끼리 범위가 겹치기도 하고, 뒤에서 보겠지만 어느 행도 덮지 않는 틈도 있다. 물성 데이터의 실제 모습이 이렇다. 교과서의 매끈한 표 한 줄보다는 출처와 범위가 제각각인 조각들의 모음에 가깝다.
예제 8.2-1 물의 증기압 계산과 NIST 대조
문제 표 8-1의 상수를 사용해 25 °C(298.15 K)와 373 K에서 물의 증기압을 bar 단위로 구하라. 결과를 NIST의 정상 끓는점 데이터(373.17 ± 0.04 K에서 1 atm)와 대조하라.
풀이 전략 역할을 나눈다. 계산 함수를 짜는 일은 AI에게 맡기고, 온도에 맞는 상수 행을 고르는 일과 결과 검증은 직접 한다. 298.15 K는 273~303 K 행 안에, 373 K는 344~373 K 행 안에 들어가므로 각각 그 행을 쓴다. 프롬프트에는 로그 밑과 입출력 단위를 명시한다(8.2.1절의 4종 확인 규칙을 프롬프트에도 그대로 싣는 셈이다).
Antoine 식 log10(p*) = A − B/(T+C)로 증기압을 계산하는 파이썬 함수를 만들어 줘. 입력 온도는 켈빈, 출력은 bar. 상수 A, B, C는 인자로 받게 하고, 주석은 한국어로 달아 줘.
def antoine_p_bar(T_K, A, B, C):
"""Antoine 식: log10(p*) = A - B/(T + C)
T_K : 온도 [K]
A, B, C : Antoine 상수 (log10, bar, K 기준 세트)
반환 : 증기압 p* [bar]
"""
return 10 ** (A - B / (T_K + C))
✔ 밑이 10인 지수(10 **)를 썼는지 확인했다. 프롬프트의 log10 요구와 일치한다. 입출력 단위가 docstring에 남아 있고, 매직 넘버가 없다. 다만 유효범위 검사가 없다. 이 결함은 8.3절에서 다룬다.
온도에 맞는 행을 골라 실행해 보자.
# 25 °C = 298.15 K → 273~303 K 행 (Bridgeman & Aldrich, NIST)
p_25 = antoine_p_bar(298.15, 5.40221, 1838.675, -31.737) # bar
# 373 K → 344~373 K 행
p_100 = antoine_p_bar(373.0, 5.08354, 1663.125, -45.622) # bar
print(f"25 °C: {p_25:.4f} bar / 373 K: {p_100:.3f} bar")
실행 결과는 다음과 같다.
25 °C: 0.0317 bar / 373 K: 1.008 bar
- ✔ 단위 체크: 입력 T [K], 출력 p* [bar]로 표 8-1의 상수 세트 정의와 일치한다. C는 T에 더해지므로 온도 단위(K)를 가진다.
- ✔ 대조값: NIST 정상 끓는점 373.17 K에서 p* = 1 atm = 1.013 bar여야 한다. 373 K 계산값은 1.008 bar이며 0.5% 이내로 일치한다.
- ✔ 극한값 sanity: 온도를 75 K 내리자 증기압이 1/30 이하로 급감했다. 8.1절의 분자 직관(저온일수록 탈출 급감)과 방향이 맞다.
분석 계산 자체는 한 줄이다. 이 예제의 노동은 전부 상수 행 선택과 검증에 있었고, 실제로 그 부분이 사람 몫이다. 상수 조회를 건너뛰고 "AI가 준 상수"로 바로 계산했다면 어떤 값이 와도 믿을 근거가 없다. What-if: 코드 8-2에서 373 K 계산의 상수만 379~573 K 행(A = 3.55959)으로 바꿔 다시 실행해 보라. 그 결과가 다음 절의 주인공이다.
스스로 점검 (해답은 권말)
- 식 (8.3)에서 상수 C의 단위는 무엇인가?
- 표 8-1에서 350 K는 334~363 K 행과 344~373 K 행이 동시에 덮는다. 두 행의 계산값이 조금 다르다면, 이 차이는 버그인가 데이터의 성질인가?
8.3 유효범위와 외삽: 25% 오차의 해부
예제 8.2-1의 What-if를 실행했다면 373 K에서 0.759 bar를 얻었을 것이다. 장 도입의 0.76 bar가 바로 이것이다. 같은 식, 같은 온도, 같은 NIST 출처의 상수인데 결과가 25% 어긋난다. 379~573 K용 상수를 그 범위 밖인 373 K에 썼기 때문이다.
유효범위 안쪽 온도에서 상관식을 쓰는 일을 내삽(interpolation), 범위 밖으로 벗어나 쓰는 일을 외삽(extrapolation)이라 한다. Antoine 식은 데이터에 맞춘 경험식이므로, 데이터가 없는 구간에서는 아무것도 보증하지 않는다. 범위에서 겨우 6 K 벗어난 373 K에서 이미 25%가 깨졌다. 더 멀리 가면 어떻게 되는가? 같은 행으로 298.15 K를 계산하면 0.0013 bar가 나온다. 올바른 행의 계산값 0.0317 bar의 1/23이다.
이 함정은 문헌에도 그대로 기록되어 있다. LibreTexts 교재는 379~573 K 행으로 100 °C의 물 증기압을 계산해 0.76 bar를 얻고는, 실측 1.013 bar와 25.1% 어긋남을 표로 보여 주며 원인을 유효범위 밖 외삽으로 짚는다. 같은 자료에서 200 °C(473 K, 범위 안)의 계산값 16.53 bar는 실측 15.55 bar와 6.3% 차이였다. 표 8-2에 이 해부 결과를 모았다.
| 계산 온도 | 범위 판정 | 계산 p* | 비교 기준 | 어긋남 |
|---|---|---|---|---|
| 373 K | 6 K 밖 (외삽) | 0.759 bar | 1.013 bar (1 atm에서 끓음) | −25% |
| 298.15 K | 81 K 밖 (외삽) | 0.0013 bar | 0.0317 bar (범위 내 행 계산값) | 1/23로 붕괴 |
| 473 K | 범위 안 (내삽) | 16.53 bar | 15.55 bar (실측) | +6.3% |
표의 마지막 행이 보여 주듯 범위 안이라고 오차가 0이 되지는 않는다. 상관식은 어디까지나 데이터의 근사이고, 범위 안에서는 오차가 몇 % 수준으로 관리되는 반면 범위 밖에서는 오차의 상한을 말하기 어려워진다.
표 8-1을 다시 보면 더 불편한 사실이 하나 있다. NIST가 주는 물의 행 일곱 개를 전부 모아도 373~379 K 구간을 덮는 행이 없다. 하필 정상 끓는점 373.17 K가 이 틈에 걸린다. 이런 경우의 정직한 태도는 "가장 가까운 행을 쓰되, 몇 K의 외삽이 있었고 오차가 커질 수 있음을 기록에 남긴다"이다. 예제 8.2-1에서 344~373 K 행으로 373 K를 계산한 것이 이 태도에 해당한다.
범위 검사를 함수 안에 넣어 두면 미래의 나와 팀원이 같은 함정에 빠지는 일을 코드가 막아 준다. AI에게 교정을 요구해 보자.
코드 8-1 함수에 유효 온도범위 검사를 추가해 줘. 범위 최소·최대를 인자로 받고, 범위 밖 온도가 들어오면 계산하지 말고 에러를 던지게. 에러 메시지에 입력 온도와 유효범위를 포함해 줘.
def antoine_p_bar(T_K, A, B, C, t_min, t_max):
"""유효범위 검사가 있는 Antoine 계산.
T_K [K] 입력, p* [bar] 반환. t_min~t_max [K] = 상수의 유효범위."""
if not (t_min <= T_K <= t_max): # 범위 밖 = 외삽 → 거부
raise ValueError(
f"T = {T_K} K는 유효범위 {t_min}~{t_max} K 밖이다. "
"다른 상수 행을 찾거나 출처를 다시 확인하라.")
return 10 ** (A - B / (T_K + C))
✔ 범위 밖에서 값을 돌려주지 않고 ValueError를 던지는지 확인했다. 379~573 K 행에 373 K를 넣자 에러 메시지에 입력 온도와 범위가 그대로 찍혔다. 경계값 T = t_min, t_max는 통과된다(등호 포함). 의도와 일치한다.
생각해보기 범위 밖 온도가 들어왔을 때 계산기가 취할 수 있는 설계는 적어도 세 가지다. ① 에러를 던지고 멈춘다 ② 경고만 출력하고 값은 돌려준다 ③ 말없이 가장 가까운 범위의 상수로 바꿔 계산한다. 각 설계가 어떤 사용자에게 어떤 사고를 일으킬 수 있는지 논하라. 코드 8-3이 ①을 고른 이유는 무엇이라고 생각하는가?
스스로 점검 (해답은 권말)
- 내삽과 외삽 중 Antoine 식에서 허용되는 쪽은 어느 것인가?
- 계산 온도가 유효범위 안이라면 결과의 오차는 0인가?
8.4 matplotlib로 증기압 곡선 그리기
수치 하나는 한 점만 검증하지만, 곡선은 경향 전체를 한눈에 검증하게 해 준다. 기울기가 물리적 직관과 맞는 방향인지, 대조점이 곡선 위에 앉는지, 상수 행이 바뀌는 경계에서 곡선이 어긋나지는 않는지가 전부 그래프에서 보인다. 파이썬의 표준 시각화 라이브러리 matplotlib로 시작해 보자.
가장 작은 코드부터 그려 본다.
import numpy as np
import matplotlib.pyplot as plt
A, B, C = 5.08354, 1663.125, -45.622 # 물, 344~373 K 행 (NIST, log10·bar·K)
T = np.linspace(344, 373, 60) # K — 유효범위 안에서만 생성
p = 10 ** (A - B / (T + C)) # bar
plt.plot(T, p)
plt.show()
곡선은 나왔다. 그런데 이 그림을 일주일 뒤에 다시 열면 가로축이 K인지 °C인지, 세로축이 bar인지 kPa인지 알 길이 없다. 축 라벨과 단위가 없으면 그 그래프는 검증하기 어렵다. 라벨을 달고, 대조점을 함께 찍고, 여러 상수 행을 겹쳐 넓은 온도 구간을 덮도록 개선을 요구해 보자.
물의 Antoine 상수 행 4개(273~303, 304~333, 334~363, 344~373 K)를 각각 자기 범위 안에서만 그려서 한 그래프에 겹쳐 줘. 세로축은 로그 스케일, 축 라벨에 단위 포함, NIST 정상 끓는점(373.17 K, 1.013 bar)을 대조점으로 표시하고 png로 저장해 줘.
rows = [ # 물 상수 (log10·bar·K, NIST WebBook)
(273, 303, 5.40221, 1838.675, -31.737),
(304, 333, 5.20389, 1733.926, -39.485),
(334, 363, 5.0768, 1659.793, -45.854),
(344, 373, 5.08354, 1663.125, -45.622),
]
for t_min, t_max, A, B, C in rows:
T = np.linspace(t_min, t_max, 60) # K
plt.semilogy(T, 10 ** (A - B / (T + C)), label=f"{t_min}~{t_max} K")
plt.scatter([373.17], [1.013], marker="x", color="k", # NIST 끓는점 = 대조점
zorder=3, label="NIST 정상 끓는점")
plt.xlabel("T (K)")
plt.ylabel("p* (bar)")
plt.legend(); plt.grid(True)
plt.savefig("water_vapor_pressure.png", dpi=150)
✔ 각 행이 자기 유효범위 안에서만 그려지는지 np.linspace의 경계로 확인했다(외삽 없음). 실행하면 네 조각 곡선이 매끄럽게 이어지고, 검은 ×(끓는점 대조점)가 마지막 조각의 끝에 정확히 얹힌다. 겹치는 구간(344~363 K)에서 두 행의 곡선이 거의 포개진다. 행 간 일관성까지 눈으로 검증된 셈이다.
세로축을 로그로 그린 데는 이유가 있다. 식 (8.2)에서 ln p*가 1/T에 대략 직선이었으므로, 로그 축에서는 곡선이 완만해져 전 구간의 경향과 이탈점이 함께 보인다. 100 K 구간에서 증기압이 30배 넘게 변하므로 선형 축으로는 저온부가 바닥에 붙어 아무것도 읽을 수 없다.
AI 협업 사이클 ① 문제 정의 → ② 분해 → ③ 프롬프트 → ④ 생성 코드 읽기 → ⑤ 테스트 → ⑥ 화공 검증
스스로 점검 (해답은 권말)
- 코드 8-5에서 세로축을 로그 스케일로 그린 이유는 무엇인가?
- 코드 8-6은 끓는점 검증을 통과했다. 그런데도 틀린 코드인 이유는 무엇인가?
실습 8: 도구⑤ Antoine 증기압 계산기 (45분)
이번 실습부터 Phase 3의 도구 사다리가 시작된다. 타이머는 45분, 물질은 학번별 배정이다. 빈 손으로 시작해 작동하는 도구와 검증 기록을 남기고 커밋으로 마감한다.
준비물
- 5주차 도구④(단위환산 + 물성 조회기) repo. NIST 조회 흐름을 재사용한다.
- 파이썬 환경에 numpy, matplotlib, pytest 설치 확인 (
python -c "import numpy, matplotlib, pytest"가 조용히 끝나면 정상). - 강의 repo의 학번별 물질 배정표. 본인 학번의 물질을 확인하라.
과제
- 실습 8.1 배정된 물질의 Antoine 상수를 NIST WebBook에서 직접 찾아
constants.py에 기록하라(로그 밑·압력 단위·온도 단위·유효범위·출처 주석 포함). (완료 확인: 4종+출처가 주석으로 남은 파일이 커밋된다) - 실습 8.2 유효범위 검사가 내장된 증기압 함수를 바이브코딩으로 만들라(코드 8-3과 같은 동작으로, 범위 밖이면
ValueError). (완료 확인: 범위 밖 온도에서 에러 메시지에 입력 온도와 범위가 찍힌다) - 실습 8.3 pytest 테스트 3개를 AI에게 생성시키고 직접 읽어 승인하라(① 범위 안 정상 계산 ② 대조값(끓는점) 허용오차 내 일치 ③ 범위 밖
ValueError발생). (완료 확인:pytest test_antoine.py3개 통과 후 커밋) - 실습 8.4 본인 물질의 증기압 곡선을 그려 png로 저장하라(축 라벨+단위, 유효범위 안에서만, NIST 대조점 1개 표시). (완료 확인: png 파일이 repo에 커밋된다)
- 실습 8.5 README에 검증 루틴 3종(단위·대조값·극한값)의 수행 결과를 기록하고 최종 커밋하라. (완료 확인: README에 세 항목이 값과 함께 남는다)
완성 기준
pytest test_antoine.py3개 통과- README에 검증 3종 기록 (대조값의 출처 명기 포함)
- 커밋 ≥ 3 (단계마다 1커밋이 자연스럽다)
- 45분 내 push. 미완이어도 push하라(통과/재도전 판정 기준은 부록 E 참조).
막혔는가?
- 에러가 났다면, 메시지 전문을 그대로 붙여넣고 물어라. "이 에러의 원인 후보 3개와 각각의 확인 방법을 알려 줘."
- 테스트가 안 짜진다면 이렇게 물어라. "pytest로 ValueError 발생을 검사하는 테스트를 짜 줘. pytest.raises를 쓰고, 왜 그렇게 쓰는지 주석으로 설명해 줘."
- 그래프가 이상하다면 이렇게 물어라. "이 코드가 그리는 곡선의 세로축 범위를 예측해 줘. 내 실행 결과와 다른데, 단위가 어디서 바뀌는지 짚어 줘."
퇴실 전 기록 오늘 만든 것·막힌 것·틀린 것 중 1건을 위키에 커밋해야 퇴실이다. 오늘의 후보: 본인 물질의 상수 4종 표, 외삽 에러를 처음 만난 순간의 스크린샷.
요약
- S 8-1 Antoine 식: log₁₀ p* = A − B/(T + C). 경험식이므로 상수의 로그 밑·압력 단위·온도 단위·유효 온도범위 4종을 확인한 뒤에만 쓴다.
- S 8-2 외삽 금지의 코드화: 범위 밖 입력은 값을 돌려주지 않고
ValueError를 던진다 (코드 8-3 패턴). - S 8-3 대조값은 두 점 이상, 앵커에서 먼 점을 포함하라. 앵커 한 점에서만 맞는 오류(코드 8-6)가 존재한다.
- S 8-4 상수 요구 프롬프트 패턴: "로그 밑·단위·유효범위·출처를 함께. 확인 불가면 모른다고 답하라."
| 실수 유형 | 373 K 근방 결과 | 어느 검증에 걸리는가 |
|---|---|---|
| 없음 (범위 내 행 + log₁₀) | 1.008 bar | 걸리지 않음 (0.5% 이내 일치) |
| 범위 밖 행 사용 (외삽) | 0.759 bar | 대조값(끓는점 한 점에서 즉시 발각) |
ln 오독 (math.exp) | 1.003 bar(통과처럼 보임) | 대조값 2점째 (25 °C에서 7배) + 극한값 sanity |
| °C를 K 자리에 입력 | ~10⁻²⁶ bar | 단위 체크 + 극한값 sanity(곡선이 0에 붙는다) |
시험1로 멈췄던 도구 사다리가 다시 움직였다. 도구④의 물성 조회 위에 오늘 증기압 계산기가 올라섰고, AI 협업 사이클에서는 ⑥ 화공 검증이 구체적인 기술(상수 4종 확인, 두 점 대조, 외삽 거부)로 바뀌었다. 다음 장에서 이 함수는 혼자가 아니라 둘씩 쓰인다. 두 물질의 증기압이 만나는 곳에서 증류가 시작된다.
용어 정리
- 증기압(vapor pressure)
- 기체가 자신의 액체 또는 고체와 동적 평형으로 공존할 때의 압력. 물질과 온도의 함수.
- 동적 평형(dynamic equilibrium)
- 분자의 탈출과 복귀가 같은 속도로 계속되어 거시적으로는 변화가 없어 보이는 상태.
- 끓는점(boiling point)
- 증기압이 외부 압력과 같아져 액체 내부에서 기포가 자랄 수 있는 온도.
- 정상 끓는점(normal boiling point)
- 외부 압력 1 atm(= 101.325 kPa)에서의 끓는점.
- 경험식(empirical correlation)
- 이론 유도가 아니라 측정 데이터에 맞춰 만든 식. 적용 범위를 데이터가 결정한다.
- Antoine 식(Antoine equation)
- log₁₀ p* = A − B/(T + C) 꼴의 증기압 경험식.
- 유효 온도범위(valid temperature range)
- 상수를 맞출 때 사용한 데이터가 덮는 온도 구간. 이 밖에서는 식의 정확도가 보증되지 않는다.
- 내삽(interpolation)
- 데이터(유효범위) 안쪽에서 상관식을 사용하는 것.
- 외삽(extrapolation)
- 데이터(유효범위) 밖에서 상관식을 사용하는 것. 이 장의 금지 대상.
연습문제
Q군: 개념·읽기 (AI 없이 풀 것)
- Q8.1 코드 8-1의 목적과 동작을 한국어 2~3문장으로 설명하라. 인자 4개가 각각 무엇이고 어떤 단위 약속을 지는지 포함하라.
- Q8.2 표 8-1의 273~303 K 행으로 T = 298.15 K를 계산하면 결과의 자릿수는 어느 쪽에 가까운가? 0.03 bar인가, 0.3 bar인가? 계산기 없이 지수부의 부호와 크기만으로 추정하고 근거를 설명하라.
- Q8.3 코드 8-3의 계산기를 일부러 틀리게 만드는 방법을 두 가지 제시하고, 각각이 검증 루틴 3종(단위·대조값·극한값) 중 무엇에 가장 먼저 걸리는지 설명하라. 두 방법 중 하나는 "끓는점 한 점 대조만으로는 잡히지 않는 오류"여야 한다.
P군: 제작·계산 (AI 사용 전제)
- P8.1 학번별 배정 물질의 Antoine 상수를 NIST WebBook에서 확보해 세 온도(유효범위의 하단·중앙·상단)에서 증기압을 계산하고, 검증 루틴 3종의 수행 결과를 README 형식으로 작성하라. 대조값의 출처를 명기하라.
- P8.2 아래 벤젠 상수로 정상 끓는점(p* = 1.013 bar가 되는 온도)을 역산하는 코드를 만들라. 계산 결과는 약 349 K가 나온다. 문헌의 벤젠 정상 끓는점은 약 80 °C(약 353 K)다. 4 K 차이의 원인 후보를 두 가지 제시하고, NIST WebBook에서 이 상수의 유효범위를 직접 확인하는 절차를 서술하라.
벤젠 Antoine 상수: log₁₀ p* = A − B/(T + C), p* [bar], T [K] (출처: LibreTexts Foundations 3.09, 유효범위 미명시. 이 표가 4종 확인 규칙의 무엇을 위반하는지부터 지적하라.) A B C 4.60362 1701.073 20.806 - P8.3 표 8-1의 다섯 행을 모두 내장하고, 입력 온도에 맞는 행을 자동 선택하는 증기압 함수를 만들라. 요구 사항: ① 어느 행도 덮지 않는 온도(예: 375 K)에서는 에러와 함께 가장 가까운 행을 안내할 것 ② 두 행이 겹치는 온도(예: 350 K)의 처리 방침을 스스로 정하고 docstring에 근거와 함께 기록할 것 ③ 273~573 K 전체 곡선을 semilogy로 그려 행 경계가 이어지는지 눈으로 검증할 것.
위키 기록 과제 (이번 주 의미 커밋 ≥ 1이 채점 지표다)
- 이 장의 핵심 1페이지 정리를
#seed태그로 커밋하라(Antoine 식, 4종 확인 규칙, 외삽 금지를 본인의 말로). - "내가 틀렸던 것" 1건을 기록하라(이번 실습에서 만난 에러 메시지나 어긋난 계산값의 스크린샷 포함).
- 타 과목 연결 1건. 일반화학의 증기압·끓는점 단원, 또는 화공양론의 포화·습도 계산과 오늘 도구가 만나는 지점을 한 문단으로 적어라.