9장 Raoult 법칙과 기액평형
이번 주의 도구: 이성분계 T-xy 다이어그램
다음 상황을 생각해 보자. 실험대 위에 벤젠과 톨루엔을 반씩 섞은 플라스크가 있다. 순수한 벤젠은 1 atm에서 약 349 K(약 76 °C)에 끓고, 순수한 톨루엔은 약 383 K(약 110 °C)에 끓는다. 그러면 이 혼합물은 몇 도에서 끓기 시작하는가. 두 값의 평균일 것 같지만, 계산해 보면 평균보다 낮은 363 K에서 첫 기포가 올라온다.
기포 속 증기를 분석하면 벤젠이 73%다. 액체는 반반인데 증기는 벤젠 쪽으로 쏠려 있다. 끓이고 응축하기를 반복하면 벤젠만 골라낼 수 있다는 뜻이고, 정유공장 증류탑이 하는 일도 이 반복에 해당한다. 이번 주에는 이 "몇 도에서 끓고, 증기 조성이 무엇인가"를 온도 전 구간에서 한 번에 보여 주는 그림, T-xy 다이어그램을 그리는 도구를 만든다.
이 장에서 다루는 것:
- 이상용액과 라울의 법칙을 도입하고 분압·전압 계산에 적용한다
- 기포점과 이슬점을 정의하고 반복 계산 없이 직접 구하는 알고리즘을 세운다
- 온도 스윕으로 이성분계 T-xy 다이어그램을 그리는 코드를 AI와 함께 만든다
- 기포점 공식과 이슬점 공식을 뒤바꾸는 AI 오류를 검증 루틴으로 잡아낸다
이 장을 마치면 다음을 할 수 있다.
- 라울의 법칙으로 이상용액 위 증기의 분압과 전압을 계산할 수 있다.
- 기포점·이슬점을 정의하고, 온도가 주어졌을 때 평형 조성을 반복 없이 직접 계산할 수 있다.
- "x에서 T를 찾는" 문제를 "T에서 x를 찾는" 문제로 뒤집어 알고리즘을 단순화할 수 있다.
- 온도 스윕 방식으로 T-xy 다이어그램을 그리는 파이썬 도구를 AI와 함께 만들 수 있다.
- T-xy 다이어그램에서 임의의 (조성, 온도) 점이 어느 상 영역에 있는지 읽을 수 있다.
- AI가 생성한 기액평형 코드의 공식 혼동을 극한값 검증으로 잡아낼 수 있다.
이번 주 실습에서는 9.2~9.3절의 알고리즘으로 도구⑥ 이성분계 T-xy 다이어그램을 만든다(타이머 60분). 8장에서 만든 도구⑤의 증기압 함수를 그대로 import하므로, 도구 사다리가 처음으로 "이전 도구 재사용"을 요구하는 주다. 최종 시험 주제 예시 ①이 "학번별 이성분계의 기포점/이슬점 계산기 + T-xy 작도"이므로 이번 실습은 최종 실기의 축소판이기도 하다. 실습 말미에 서브프로젝트 주제 풀(pool)이 공개된다.
9.1 혼합물의 기액평형과 이상용액
8장에서 다룬 것은 순수한 물질 하나였다. 물질이 하나면 이야기가 단순하다. 주어진 압력에서 끓는 온도는 하나로 정해지고, 그 온도는 Antoine 식으로 계산한 증기압이 외부 압력과 같아지는 지점이다. 액체와 증기가 함께 존재하며 더 이상 겉보기 변화가 없는 상태를 기액평형(vapor-liquid equilibrium, VLE)이라 한다.
혼합물이 되는 순간 변수가 하나 늘어난다. 온도와 압력만이 아니라 조성이 상태를 결정하기 때문이다. 액상에서 성분 A의 몰분율을 xA, 기상에서의 몰분율을 yA로 구분해 쓴다. 장 도입의 플라스크에서 액체는 x벤젠 = 0.5인데 첫 기포는 y벤젠 = 0.73이었다. 두 값이 다르다는 사실이 이 장 전체의 출발점이다.
9.1.1 분압과 라울의 법칙
기상이 이상기체처럼 거동하면, 성분 i가 전체 압력 P에 기여하는 몫을 분압(partial pressure) pi라 하고 다음이 성립한다.
pi = yi P (9.1)
이제 액상 쪽을 보자. 액체 혼합물 위의 증기에서 각 성분이 얼마나 증발해 나오는가. 분자 수준에서 서로 밀고 당기는 힘이 비슷한 분자들의 혼합물을 이상용액(ideal solution)이라 한다. 구조나 작용기가 닮은 물질끼리 섞였을 때가 대표적이고, 둘 다 무극성이며 크기가 비슷한 벤젠-톨루엔이 교과서적인 예다. 벤젠 분자 입장에서는 이웃이 벤젠이든 톨루엔이든 받는 힘이 비슷하므로, 증발해 나가려는 경향은 순수 벤젠일 때와 같고 다만 표면을 차지한 비율만큼 줄어든다.
이 직관을 식으로 쓴 것이 라울의 법칙(Raoult's law)이다. 이상용액에서 성분 i의 분압은 그 성분의 액상 몰분율에 순수 증기압을 곱한 값이 된다.
pi = xi p*i(T) (9.2)
여기서 p*i(T)는 온도 T에서 순수한 성분 i의 증기압이고, 8장의 Antoine 식으로 계산하는 바로 그 양이다. 식 (9.1)과 식 (9.2)에서 분압을 소거하면 기상 조성과 액상 조성을 잇는 평형 관계를 얻는다.
yi P = xi p*i(T) (9.3)
전체 압력은 분압의 합이므로, 이성분계(성분 A, B)에서 식 (9.2)를 더하면 전압이 나온다.
P = xA p*A(T) + (1 − xA) p*B(T) (9.4)
라울의 법칙은 언제 믿을 수 있는가. 두 성분의 분자 간 상호작용이 충분히 닮았을 때, 그리고 각 성분이 무시할 수 없는 양으로 존재할 때다. 에탄올-물처럼 수소결합이 강하게 개입하는 계는 이 가정에서 멀어진다. 이 장의 도구는 이상용액 가정 위에 서 있으므로, 어떤 물질 쌍에 적용할지 자체가 공학적 판단임을 기억해 두자.
9.1.2 Antoine 상수 준비: 8장 도구의 재사용
식 (9.3)의 p*i(T)를 계산하려면 두 성분의 Antoine 상수가 필요하다. 이 장의 예제는 전부 벤젠-톨루엔 계를 쓰며, 상수는 표 9-1과 같다.
표 9-1 벤젠·톨루엔의 Antoine 상수: log10(p*/bar) = A − B/(T/K + C) 형식
| 물질 | A | B | C | 로그 밑 / 압력 / 온도 | 유효 온도범위 |
|---|---|---|---|---|---|
| 벤젠 | 4.60362 | 1701.073 | 20.806 | log10 / bar / K | NIST WebBook에서 직접 확인하라 |
| 톨루엔 | 4.07827 | 1343.943 | −53.773 | log10 / bar / K | NIST WebBook에서 직접 확인하라 |
유효범위 칸을 비워 두지 않고 "직접 확인하라"고 적은 데는 이유가 있다. 이 상수의 수록 출처(LibreTexts, NIST 인용)가 유효 온도범위를 함께 싣지 않았기 때문이다. 8장에서 유효범위 밖 외삽이 25% 오차를 만드는 것을 보았다. 범위가 명시되지 않은 상수는 범위를 찾아내는 것까지가 사용자의 일이며, 이번 실습의 첫 단계가 바로 그 확인 작업이다.
예제 9.1-1 등몰 벤젠-톨루엔 용액 위의 증기
문제 368 K에서 벤젠 몰분율 0.5인 벤젠-톨루엔 액체 혼합물이 증기와 평형에 있다. 이 온도에서 벤젠과 톨루엔의 순수 증기압은 각각 1.692 bar, 0.633 bar이다. 전압 P와 기상 조성 y벤젠을 구하라.
풀이 전략 미지수는 P와 y벤젠 둘, 식은 (9.4)와 (9.3) 둘이다. 손계산으로 충분한 크기이므로 AI 없이 직접 푼다. 전압을 먼저 구해야 식 (9.3)에서 y를 나눌 분모가 생긴다.
계산 식 (9.4)에 값을 대입하면 다음을 얻는다.
P = 0.5 × 1.692 + 0.5 × 0.633 = 1.163 bar
식 (9.3)을 y에 대해 정리해 대입하면 기상 조성이 나온다.
y벤젠 = x벤젠 p*벤젠 / P = 0.5 × 1.692 / 1.163 = 0.728
- 단위 체크: bar × 무차원 / bar이므로 y는 무차원 몰분율. 통과.
- 대조값: y벤젠 + y톨루엔 = 0.728 + 0.272 = 1.000. 몰분율 합이 1이다. 통과.
- 극한값: x벤젠 → 1이면 식 (9.4)에서 P → p*벤젠, 즉 순수 벤젠으로 되돌아간다. 물리적으로 타당.
분석 답: P = 1.163 bar, y벤젠 = 0.728. 액체는 반반인데 증기는 벤젠이 73%다. 증기압이 큰 성분(끓는점이 낮은 성분)을 휘발성이 크다고 하며, 휘발성이 큰 성분은 언제나 액상보다 기상에 풍부하다. 이 비대칭이 증류 분리의 물리적 원리다. x벤젠을 0.2, 0.8로 바꿔 같은 계산을 반복해 보라. y > x 관계가 유지되는지 확인하는 것이 What-if 과제다.
스스로 점검 (해답은 권말)
- 식 (9.3)에서 xi와 yi 중 액상 조성은 어느 쪽인가?
- 368 K에서 x벤젠 = 1일 때 식 (9.4)가 주는 전압은 얼마인가?
- 벤젠-톨루엔에 라울의 법칙을 적용할 수 있는 근거를 한 문장으로 말하라.
9.2 기포점과 이슬점: 반복을 없애는 발상
액체 혼합물을 일정한 압력에서 가열할 때 첫 기포가 생기는 조건을 기포점(bubble point)이라 한다. 반대로 증기 혼합물을 냉각할 때 첫 액체 방울이 맺히는 조건을 이슬점(dew point)이라 한다. 순수 물질이라면 둘은 같은 온도(끓는점)지만, 혼합물에서는 기포점과 이슬점이 서로 다른 온도가 된다. 장 도입의 반반 혼합물은 363 K에서 끓기 시작해 371 K이 되어서야 마지막 액체 방울이 사라진다.
9.2.1 온도가 주어지면 직접 계산이다
온도를 알고 압력을 구하는 문제는 반복이 필요 없다. 기포점에서는 액상 조성이 전체 조성과 같으므로(증기가 아직 거의 없다), 식 (9.4)에 대입만 하면 기포 압력이 나온다. 이슬점 쪽도 마찬가지다. 식 (9.3)을 xi = yiP/p*i로 정리하고 액상 몰분율의 합이 1이라는 조건을 쓰면 다음을 얻는다.
1/P = yA/p*A + yB/p*B (9.5)
식 (9.4)는 기포 압력, 식 (9.5)는 이슬 압력을 대입 한 번으로 준다. 두 식의 생김새를 눈에 담아 두자. 기포 쪽은 증기압의 가중 산술평균, 이슬 쪽은 역수의 가중합이다. 뒤에서 AI가 이 둘을 뒤바꾸는 사고를 다룬다.
9.2.2 온도를 구하는 문제는 왜 성가신가
실무에서 더 흔한 질문은 반대 방향이다. "압력이 1 atm으로 고정돼 있을 때 이 혼합물은 몇 도에서 끓는가?" 이번에는 T가 미지수인데, T는 Antoine 식의 지수 안에 두 번 들어가 있어 식 (9.4)를 T에 대해 대수적으로 풀 수 없다. 고전적인 처방은 시행착오다. 온도를 추측하고, 그 온도에서 yi를 계산해 합을 확인하고, 합이 1이 될 때까지 추측을 고친다.
예제 9.2-1 등몰 벤젠-톨루엔의 기포점 온도: 시행착오법
문제 P = 1 atm(= 1.013 bar)에서 x벤젠 = 0.5인 벤젠-톨루엔 혼합물의 기포점 온도와 첫 증기의 조성을 구하라. Antoine 상수는 표 9-1을 쓴다.
풀이 전략 판정 기준은 Σyi = 1이다. 추측 온도에서 Σyi > 1이면 증기압이 과했다는 뜻이므로 온도를 내리고, Σyi < 1이면 온도를 올린다. 초기 추측은 두 순수 끓는점(349 K, 384 K)의 중간인 368 K로 잡는다(초기값은 반복 횟수만 바꿀 뿐 답을 바꾸지 않는다).
계산 1차 추측 T = 368 K. 예제 9.1-1에서 이미 구한 증기압을 재사용하면 식 (9.3)에서 다음을 얻는다.
y벤젠 = 0.5 × 1.692/1.013 = 0.835, y톨루엔 = 0.5 × 0.633/1.013 = 0.312
합은 0.835 + 0.312 = 1.147 > 1. 추측이 높았으므로 온도를 내려 다시 계산한다. 몇 차례 반복하면 T = 363 K에서 p*벤젠 = 1.484 bar, p*톨루엔 = 0.540 bar가 되고,
y벤젠 = 0.5 × 1.484/1.013 = 0.732, y톨루엔 = 0.5 × 0.540/1.013 = 0.267
합이 0.999 ≈ 1이 되어 반복이 끝난다.
- 단위 체크: 추측 온도를 K로 넣었는가. 표 9-1의 상수는 K 전용이다. 통과.
- 대조값: 수록 출처(LibreTexts)가 엑셀 solver로 구한 기포점 363.04 K와 일치. 통과.
- 극한값: 답은 두 순수 끓는점 사이(349 K < 363 K < 384 K)에 있어야 한다. 통과.
분석 답: 기포점 온도 363 K, 첫 증기 조성 y벤젠 = 0.732. 장 도입의 두 숫자가 여기서 나왔다. 다만 이 풀이는 손으로 서너 번 반복해야 하고, 코드로 짜면 반복문과 수렴 판정이 필요하다. 반복 자체가 잘못은 아니지만, 우리가 정말 원하는 것이 "한 조성의 기포점"이 아니라 "모든 조성의 기포점 곡선"이라면 더 좋은 길이 있다. 다음 소절에서 문제를 뒤집는다. What-if: x벤젠 = 0.2로 바꿔 기포점이 383 K 쪽으로 이동하는지 확인해 보라.
9.2.3 문제를 뒤집으면 반복이 사라진다
시행착오가 필요했던 이유는 T를 미지수로 두었기 때문이다. 그렇다면 T를 미지수가 아니라 입력으로 만들면 된다. "조성 x가 주어졌을 때 끓는 온도 T를 찾아라" 대신 "온도 T가 주어졌을 때 그 온도에서 끓는 조성 x를 찾아라"라고 묻는 것이다. 식 (9.4)를 xA에 대해 풀면 나눗셈 한 번짜리 공식이 나온다.
xA(T) = (P − p*B(T)) / (p*A(T) − p*B(T)) (9.6)
그 온도의 기상 조성도 식 (9.3)에서 바로 따라온다.
yA(T) = xA(T) p*A(T) / P (9.7)
정말 맞는지 확인해 보자. T = 363 K를 식 (9.6)에 넣으면 x벤젠 = (1.013 − 0.540)/(1.484 − 0.540) = 0.501이다. 예제 9.2-1에서 시행착오로 찾은 "x = 0.5의 기포점이 363 K"와 정확히 같은 사실을 이번에는 반복 없이 얻었다. 같은 문제의 두 표현인데 한쪽은 반복이 필요하고 다른 쪽은 대입 한 번으로 끝난다.
두 순수 끓는점 사이에서 T를 촘촘히 훑으며(이를 온도 스윕이라 부르자) 식 (9.6)·(9.7)을 계산하면, (x, T) 점들의 모음과 (y, T) 점들의 모음이 생긴다. 이 두 곡선이 바로 다음 절의 T-xy 다이어그램이다. 특정 조성의 기포점이 필요하면 곡선에서 보간으로 읽으면 되므로, 반복 계산은 끝까지 등장하지 않는다.
스스로 점검 (해답은 권말)
- 기포점 온도 추측에서 Σyi = 0.91이 나왔다. 다음 추측 온도는 올려야 하는가, 내려야 하는가?
- 식 (9.6)에서 T가 순수 B의 끓는점일 때 xA는 얼마가 되는가?
- 식 (9.5)로 이슬 압력을 구할 때 반복 계산이 필요 없는 이유를 한 문장으로 말하라.
생각해보기 식 (9.6)은 압력 P가 두 순수 증기압 사이에 있을 때만 0과 1 사이의 x를 준다. T = 390 K(두 물질 모두의 끓는점보다 높음)를 넣으면 x가 어떤 값이 되고, 그것은 물리적으로 무엇을 뜻하는가? 코드에서 이런 입력을 어떻게 처리해야 할지 두 가지 방법을 제안하라.
9.3 T-xy 다이어그램: 읽는 법과 그리는 법
고정된 압력에서 온도를 세로축에, 조성을 가로축에 놓고 기포점 곡선과 이슬점 곡선을 함께 그린 그림을 T-xy 다이어그램이라 한다. 가로축 하나에 액상 몰분율 x와 기상 몰분율 y를 같이 표시하기 때문에 붙은 이름이다. 이 그림 한 장에는 그 압력에서 그 혼합물이 보일 수 있는 모든 끓음·응축 거동이 들어 있다.
9.3.1 세 영역과 두 곡선
두 곡선은 그림을 세 영역으로 가른다. 아래쪽은 전부 액체인 영역, 위쪽은 전부 증기인 영역, 두 곡선 사이가 액체와 증기가 공존하는 기액평형 영역이다. 액체가 낮은 에너지 상태이므로 저온 쪽이 액체 영역인 것은 당연하다. 기포점들을 이은 아래 곡선을 포화 액체선(saturated liquid line), 이슬점들을 이은 위 곡선을 포화 증기선(saturated vapor line)이라 하며, 포화 증기선은 언제나 포화 액체선 위에 있다. 온도가 높을수록 증기 쪽이 유리하기 때문이다.
그림의 양 끝은 순수 물질이다. x = 1(순수 벤젠)에서 두 곡선은 벤젠의 끓는점 약 349 K에서 만나고, x = 0(순수 톨루엔)에서는 약 383 K에서 만난다. 순수 물질은 기포점과 이슬점이 같으므로 두 곡선이 한 점으로 모이는 것이다. 이 성질은 잠시 뒤 코드 검증의 극한값 체크로 그대로 쓰인다.
기액평형 영역 안의 한 점, 예컨대 전체 조성 0.5인 혼합물을 두 곡선 사이의 온도까지 가열한 상태를 보자. 이 점에서 수평선을 그으면(같은 온도에서 액체와 증기가 공존하므로) 포화 액체선과 만나는 점의 가로좌표가 액상 조성 x, 포화 증기선과 만나는 점의 가로좌표가 기상 조성 y다. 이 수평선을 tie line이라 부른다.
9.3.2 두 상의 양은 얼마인가: 지렛대 규칙
tie line은 조성만이 아니라 양도 알려 준다. 전체 조성을 z라 하면 벤젠에 대한 물질수지 x·n액 + y·n기 = z·n전체에서 다음을 얻는다.
n액/n전체 = (z − y) / (x − y) (9.8)
전체 조성 점에서 각 곡선까지의 거리 비로 두 상의 양이 갈린다고 해서 지렛대 규칙(lever rule)이라 한다. 예를 들어 z = 0.5인 혼합물이 어느 온도에서 x ≈ 0.39, y ≈ 0.62로 갈라졌다면 액체 분율은 (0.5 − 0.62)/(0.39 − 0.62) ≈ 0.52, 대략 절반씩이다. 전체 조성 점이 어느 곡선에 가까울수록 그 상이 많다. 기포점 직후에는 점이 포화 액체선에 붙어 있으니 계는 거의 전부 액체다.
스스로 점검 (해답은 권말)
- T-xy 다이어그램에서 (조성 0.5, 350 K) 점은 어느 영역인가? (벤젠-톨루엔, 1 atm)
- 식 (9.8)에서 z = x이면 액체 분율은 얼마인가? 물리적으로 어떤 순간인가?
- 포화 증기선이 포화 액체선보다 항상 위에 있는 이유를 한 문장으로 말하라.
9.3.3 그리는 법: 온도 스윕 알고리즘
9.2.3절의 발상을 그대로 절차로 옮기면 T-xy 다이어그램 작도 알고리즘이 된다. 반복문은 있지만 수렴 판정은 없다. 모든 단계가 대입 계산이다.
- 두 순수 성분의 끓는점을 구해 스윕 구간 [T낮은 끓는점, T높은 끓는점]을 정한다.
- 구간을 잘게 나눈 온도 배열을 만든다.
- 각 온도에서 두 성분의 증기압을 Antoine 식으로 계산한다.
- 식 (9.6)으로 x, 식 (9.7)로 y를 계산한다.
- (x, T)를 포화 액체선으로, (y, T)를 포화 증기선으로 그린다.
이 절차를 AI에게 시켜 도구⑥의 뼈대를 만들어 보자.
예제 9.3-1 벤젠-톨루엔 T-xy 다이어그램 작도
문제 표 9-1의 Antoine 상수를 써서 1 atm(1.013 bar)에서 벤젠-톨루엔 T-xy 다이어그램을 그리는 파이썬 스크립트를 만들라. 8장 도구⑤의 증기압 함수를 재사용한다.
풀이 전략 계산 로직은 위 5단계 알고리즘으로 이미 분해해 두었으므로, 프롬프트에는 사용할 식·단위·재사용할 함수 이름까지 지정한다. AI에게 맡기는 것은 numpy·matplotlib 문법이고, 알고리즘 설계와 검증은 우리 몫이다.
8장에서 만든 vapor_pressure.py의 antoine_p_bar(T, A, B, C) 함수를 import해서 벤젠-톨루엔 T-xy 다이어그램을 그리는 스크립트를 만들어 줘. 압력은 1.013 bar 고정. 온도를 349.2 K부터 383.8 K까지 200등분해서 각 온도에서 x = (P - p_톨루엔)/(p_벤젠 - p_톨루엔), y = x * p_벤젠 / P를 계산하고, (x,T)와 (y,T)를 한 그래프에 그려 줘. 주석은 한국어로, 물리량 변수에는 단위 주석을 달아 줘.
import numpy as np
import matplotlib.pyplot as plt
from vapor_pressure import antoine_p_bar # 도구⑤(8장) 재사용
# Antoine 상수 (log10 / bar / K) — 출처: NIST WebBook
BENZENE = (4.60362, 1701.073, 20.806)
TOLUENE = (4.07827, 1343.943, -53.773)
P = 1.013 # bar (= 1 atm)
T = np.linspace(349.2, 383.8, 200) # K, 두 순수 끓는점 사이
p_b = antoine_p_bar(T, *BENZENE) # bar, 벤젠 증기압
p_t = antoine_p_bar(T, *TOLUENE) # bar, 톨루엔 증기압
x = (P - p_t) / (p_b - p_t) # 식 (9.6), 무차원
y = x * p_b / P # 식 (9.7), 무차원
plt.plot(x, T, label="포화 액체선 (기포점)")
plt.plot(y, T, label="포화 증기선 (이슬점)")
plt.xlabel("벤젠 몰분율 x, y")
plt.ylabel("온도 T [K]")
plt.title("벤젠-톨루엔 T-xy (P = 1.013 bar)")
plt.legend()
plt.grid(True)
plt.savefig("txy_benzene_toluene.png", dpi=150)
검증: 그래프 양 끝에서 두 곡선이 349.2 K와 383.8 K로 모이는지 확인했고, 순수 끓는점과 일치한다. x = 0.5에서 포화 액체선을 읽으면 약 363 K로 예제 9.2-1의 시행착오 결과와 일치한다. y = 0.5에서 포화 증기선을 읽으면 약 371 K로 수록 출처의 이슬점 371.2 K와 일치한다. 세 점 모두 통과 후 코드를 채택했다.
코드 9-2가 저장하는 그림(그림 9-1)에는 왼쪽 위로 완만하게 휘어진 두 곡선이 나타난다. 아래가 포화 액체선, 위가 포화 증기선이고, 두 곡선은 양 끝에서 순수 끓는점으로 모인다.
- 단위 체크: T는 K, 증기압과 P는 모두 bar이고, 식 (9.6)의 분자·분모가 같은 단위라 x는 무차원. 통과.
- 대조값: x = 0.5의 기포점 363 K가 수록 출처(LibreTexts)의 solver 결과 363.04 K와 일치. 통과.
- 극한값: x → 1에서 T → 349.2 K(순수 벤젠), x → 0에서 T → 383.8 K(순수 톨루엔). 통과.
분석 반복 계산 한 번 없이 다이어그램 전체가 나왔다. 알고리즘을 먼저 5단계로 분해하고 식 번호까지 프롬프트에 넣었기 때문에 생성 코드가 한 번에 의도와 맞았다는 점도 눈여겨보라. 프롬프트의 구체성은 분해의 산물이다. What-if: np.linspace의 점 개수를 200에서 10으로 줄여 재실행하고, 곡선이 어디서부터 각져 보이는지 확인해 보라.
특정 조성의 기포점 온도가 숫자로 필요하면 곡선을 보간해 읽으면 된다. np.interp는 x 배열이 증가 순서일 때 동작하므로, 감소 순서인 배열은 뒤집어 넣는다.
# x = 0.5의 기포점 온도를 보간으로 조회 (x는 T 증가에 따라 감소하므로 뒤집는다)
T_bubble = np.interp(0.5, x[::-1], T[::-1]) # K
print(f"기포점 온도: {T_bubble:.1f} K") # 363.0 K 부근이 나와야 한다
출력이 363.0 K 부근이면 예제 9.2-1과 교차 검증이 끝난 것이다. 시행착오 없이, solver 없이, 배열 두 개와 보간 한 줄로 같은 답에 도달했다.
9.4 AI와 함께 만들 때: 두 공식을 뒤바꾸는 AI
① 문제 정의 → ② 분해 → ③ 프롬프트 → ④ 생성 코드 읽기 → ⑤ 테스트 → ⑥ 화공 검증
이번 장의 무게중심은 ②와 ⑥이다. "T에서 x를 구하는 문제로 뒤집는다"는 결정은 프롬프트를 쓰기 전에 사람이 내리는 분해 판단이고, 기포점·이슬점의 물리적 순서 관계는 사람만 아는 검증 기준이다.
기액평형 계산을 AI에게 시킬 때 좋은 프롬프트와 나쁜 프롬프트의 차이는 9.3.3절에서 이미 드러났다. "T-xy 다이어그램 그려 줘"라고만 하면 AI가 알고리즘 선택(시행착오냐 스윕이냐), 단위, 상수 출처를 전부 스스로 정하고, 그 선택들 하나하나가 검증해야 할 짐이 된다. 식 번호·단위·함수 이름을 지정한 프롬프트는 검증할 것을 "문법이 맞는가" 수준으로 줄여 준다.
그래도 검증을 건너뛸 수는 없다. 기포점과 이슬점처럼 짝을 이루는 개념은 AI가 특히 자주 뒤섞는 지점이기 때문이다.
이 사례가 보여 주는 교훈은 3장의 원칙 그대로다. 실행되는 코드와 옳은 코드는 다르며, 그 간극을 메우는 것은 화공 지식으로 만든 테스트다. 기액평형 도구에서는 "이슬점 ≥ 기포점", "몰분율 합 = 1", "순수 극한에서 끓는점 일치" 세 가지가 언제나 쓸 수 있는 물리 테스트다.
생각해보기 이 장의 도구를 에탄올-물 혼합물에 그대로 적용하면 T-xy 다이어그램이 나오기는 한다. 그 그림을 믿어도 되는가? 9.1.1절의 이상용액 조건에 비추어 판단하고, 계산 결과를 믿기 전에 확인할 방법을 두 가지 제안하라. (힌트: 실측 데이터와의 대조도 검증 루틴의 하나다.)
실습 9: 도구⑥ 이성분계 T-xy 다이어그램 (60분)
준비물
- 8장 도구⑤ 저장소의
vapor_pressure.py. 이번 실습은 이 파일의antoine_p_bar함수를 import한다. 도구⑤가 미완성이면 먼저 완성하라. - 가상환경에 numpy, matplotlib 설치 확인. (확인 커맨드:
python -c "import numpy, matplotlib", 아무 출력이 없으면 정상) - 타이머 60분. 5주차부터의 규칙대로 공개 지목 구술이 있으므로, 어느 줄이든 설명할 수 있는 상태로 커밋하라.
과제 본 실습은 벤젠-톨루엔으로 진행한다. 오늘 만드는 도구가 그대로 최종 실기의 리허설이다(주제 예시는 장 머리의 실습 연결 참조).
- 실습 9.1. NIST WebBook에서 벤젠과 톨루엔의 Antoine 상수와 유효 온도범위를 조회하고, 표 9-1과 대조한 결과를 README에 기록하라. (완료 기준: README에 로그 밑·압력 단위·온도 단위·유효범위 4종이 적혀 있다) 커밋하라.
- 실습 9.2. 도구⑤의 함수를 import해 일정 온도에서 기포 압력(식 9.4)과 이슬 압력(식 9.5)을 반환하는 함수 2개를 만들라. (완료 기준: 368 K, 등몰에서 기포 압력 1.163 bar가 나온다) 커밋하라.
- 실습 9.3. 온도 스윕(식 9.6, 9.7)으로 x, y 배열을 계산하고 T-xy 다이어그램을 png로 저장하라. (완료 기준: 두 곡선이 양 끝에서 순수 끓는점으로 모인다) 커밋하라.
- 실습 9.4.
np.interp로 임의 조성의 기포점·이슬점 온도를 조회하는 함수를 추가하고, x = 0.5에서 363 K, y = 0.5에서 371 K 부근이 나오는지 확인하라. (완료 기준: 두 값이 검증 코멘트와 일치하고, 이슬점 > 기포점이다) - 실습 9.5. 검증 3종(단위·대조값·극한값)의 수행 결과를 README에 기록하고 최종 커밋하라. (완료 기준: README만 읽고도 제3자가 검증을 재현할 수 있다)
완성 기준 (통과 / 재도전 2단계, 판정 기준은 부록 E 참조)
- 테스트 3개 통과: ① 양 끝점 온도가 순수 끓는점과 ±0.5 K 이내 ② x = 0.5의 기포점이 363 ± 1 K ③ 임의 조성에서 이슬점 온도 ≥ 기포점 온도
- README에 검증 루틴 3종 기록 (NIST 대조 스크린샷 또는 수치 인용 포함)
- 의미 있는 커밋 3개 이상 (실습 단계와 대응)
- 60분 내 제출
막혔는가?
- import가 안 될 때는 에러 메시지 전문을 붙여넣고 이렇게 물어라. "이 ImportError의 원인 후보 3개와 각각의 확인 방법을 알려 줘. vapor_pressure.py는 상위 폴더에 있어."
- 그래프가 이상할 때는 이렇게 물어라. "T-xy 다이어그램에서 두 곡선이 교차해 버렸어. 코드를 고치지 말고, 어떤 물리적·논리적 원인이 가능한지 순서대로 점검할 체크리스트를 만들어 줘."
- 보간 결과가 엉뚱할 때는 이렇게 물어라. "np.interp가 이상한 값을 반환해. 입력 배열이 감소 순서일 때 np.interp가 어떻게 동작하는지 설명하고, 내 데이터로 확인하는 한 줄 실험을 제안해 줘."
퇴실 전 위키 기록 오늘 만든 것·막힌 것·틀린 것 중 1건을 위키에 커밋해야 퇴실한다. 추천 소재: 기포점과 이슬점을 헷갈렸던 순간, 또는 문제를 뒤집어 반복을 없앤 발상.
서브프로젝트 주제 풀 공개
오늘 실습 말미에 서브프로젝트 주제 풀이 공개된다. 다음 실습까지 제출할 것은 프로젝트 선언 1쪽이다. 고른 주제, 재사용할 본인 사다리 산출물 2개 이상, 검증 계획을 담는다. 재사용 요건 때문에 오늘까지 만든 도구①~⑥의 완성도가 고를 수 있는 주제의 폭을 정한다. 예컨대 McCabe-Thiele 예비설계 도우미(주제 1)는 도구⑤·⑥을 그대로 확장한다. 일정은 9주 선언 → 13주 스프린트 → 14주 발표(과제 4점 중 발표 2점)다.
요약
- S 9-1 (평형 관계) yi P = xi p*i(T). 라울의 법칙과 분압 법칙의 결합. 이 장 모든 계산의 뿌리.
- S 9-2 (직접식 한 쌍) 기포 압력 P = Σ xi p*i, 이슬 압력 1/P = Σ yi/p*i. 온도가 주어지면 반복 없이 대입 한 번.
- S 9-3 (온도 스윕) x(T) = (P − p*B)/(p*A − p*B), y(T) = x p*A/P. 미지수를 입력으로 뒤집으면 T-xy 전체가 직접 계산이 된다.
- S 9-4 (프롬프트 패턴) 알고리즘을 단계로 분해한 뒤 식·단위·재사용 함수 이름까지 지정해 요청한다. 프롬프트의 구체성은 분해의 산물이다.
표 9-2 기포점과 이슬점 비교
| 기포점 | 이슬점 | |
|---|---|---|
| 정의 | 가열 중 첫 기포가 생기는 조건 | 냉각 중 첫 액체 방울이 맺히는 조건 |
| 알려진 조성 | 액상 x (≈ 전체 조성) | 기상 y (≈ 전체 조성) |
| 직접식 (정온) | P = Σ xi p*i | 1/P = Σ yi/p*i |
| T-xy에서의 위치 | 포화 액체선 (아래) | 포화 증기선 (위) |
| 등몰 벤젠-톨루엔, 1 atm | 363 K | 371.2 K |
| 물리 테스트 | 같은 조성·압력에서 이슬점 온도 ≥ 기포점 온도, 몰분율 합 = 1 | |
도구 사다리는 이제 여섯 칸째다. 이번 주에 남는 것은 T-xy 그림 한 장보다 두 가지 훈련이다. 하나는 AI 협업 사이클의 ② 분해로, 풀기 어려운 미지수를 입력으로 뒤집어 반복 계산을 설계 단계에서 없앴다. 다른 하나는 ⑥ 화공 검증으로, "이슬점 ≥ 기포점" 같은 물리 관계를 테스트로 바꿔 그럴듯한 오답을 잡았다. 도구⑤의 함수를 import하면서 도구가 도구를 이어받는 구조도 처음 체감했을 것이다. 다음 장에서는 이 구조가 물질수지로 확장된다.
용어 정리
- 기액평형 (vapor-liquid equilibrium, VLE)
- 액체와 증기가 함께 존재하며 겉보기 변화가 없는 상태.
- 분압 (partial pressure)
- 기체 혼합물에서 한 성분이 전체 압력에 기여하는 몫. 이상기체에서 pi = yiP.
- 이상용액 (ideal solution)
- 분자 간 상호작용이 서로 비슷한 성분들로 이루어져 라울의 법칙을 따르는 액체 혼합물.
- 라울의 법칙 (Raoult's law)
- 이상용액에서 성분의 분압이 액상 몰분율과 순수 증기압의 곱과 같다는 법칙.
- 기포점 (bubble point)
- 일정 압력에서 액체 혼합물을 가열할 때 첫 기포가 생기는 조건(온도 또는 압력).
- 이슬점 (dew point)
- 일정 압력에서 증기 혼합물을 냉각할 때 첫 액체 방울이 맺히는 조건.
- 포화 액체선 (saturated liquid line)
- T-xy 다이어그램에서 기포점들을 이은 아래쪽 곡선.
- 포화 증기선 (saturated vapor line)
- T-xy 다이어그램에서 이슬점들을 이은 위쪽 곡선.
- 지렛대 규칙 (lever rule)
- 기액공존 영역에서 전체 조성 점과 두 곡선 사이 거리 비로 액체·증기의 양을 구하는 규칙.
연습문제
Q군: 개념·읽기 (AI 없이 풀 것)
- Q9.1 등몰 벤젠-톨루엔 혼합물(1 atm)에 대해 다음 각 온도에서 계가 어느 영역에 있는지 판정하라: 355 K, 367 K, 378 K. 판정 근거를 표 9-2의 두 온도로 설명하라.
- Q9.2 코드 9-1에서
x = (P - p_t) / (p_b - p_t)한 줄의 목적과 동작을, 식 번호를 인용해 한국어 2~3문장으로 설명하라 (EiPE). - Q9.3 어떤 학생의 AI가 이슬 압력을 P = Σ yi p*i로 계산하는 코드를 냈다. 이 코드를 채점하고, 어떤 검증 루틴이 이 오류를 잡아내는지 지목한 뒤 올바른 식으로 교정하라.
P군: 제작·계산 (AI 사용 전제)
- P9.1 표 9-1의 상수로 358 K에서 x벤젠 = 0.3인 혼합물의 기포 압력과 기상 조성을 계산하는 스크립트를 만들라. 검증 3종 결과를 주석으로 남겨라.
- P9.2 도구⑥을 확장해 압력을 인자로 받게 하고, 0.5 bar와 2.0 bar의 T-xy 다이어그램을 한 그림에 겹쳐 그려라. 압력이 오르면 두 곡선이 어느 방향으로 움직이는지 관찰 결과를 README에 쓰고 물리적으로 해석하라.
- P9.3 (도전·메타인지) 도구⑥의 코드에 "실행은 되지만 물리적으로 틀린 답"을 내는 버그를 일부러 두 가지 심어 보라 (예: 단위 혼동, 공식 맞바꿈). 각 버그가 검증 루틴 3종 중 무엇에 걸리는지 표로 정리하고, 어느 버그도 잡지 못하는 검증 항목이 있다면 새 테스트를 제안하라.
이번 주 위키 기록 과제 (주당 의미 커밋 ≥ 1이 채점 지표다)
- 이 장 핵심 1페이지 정리를
#seed태그로 작성하라(표 9-2를 자기 언어로 다시 그리는 것을 추천한다). - "내가 틀렸던 것" 1건을 에러 메시지 또는 잘못된 그래프 스크린샷과 함께 기록하라.
- 타 과목 연결 1건. 물리화학의 상평형, 또는 화공양론의 몰분율·물질수지와 이 장의 식 (9.8)이 어떻게 만나는지 적어라.