검증: 답이 맞다는 걸 어떻게 아는가
정답이 없는 문제의 채점
3부의 마지막 편이다. 그리고 이 연재에서 가장 중요한 질문을 다룬다.
13편에서 코드와 수치해석의 차이를 이야기했다. 코드는 실행하면 확인되지만 수치해석은 틀린 결과와 맞는 결과가 똑같이 생겼다.
그러면 무엇을 근거로 답을 쓰는가.
실물을 만들어 재보는 것이 가장 확실하다. 그런데 그럴 수 있다면 애초에 계산할 필요가 없었다. 우리는 정답을 모르는 상태에서 답의 신뢰도를 판단해야 한다.
이건 불가능한 요구처럼 들리지만, 실제로는 방법이 있다. 세 가지 층으로 나뉜다.
층 1: 알려진 답과 비교하기
가장 강한 방법이다. 손으로 풀 수 있는 문제로 계산기를 시험한다.
1편에서 “실제 형상은 손으로 못 푼다”고 했다. 그런데 아주 단순한 형상은 풀 수 있다. 무한히 긴 막대의 정상 상태 온도 분포, 양쪽 끝 온도가 고정된 판, 한쪽에서 가열되는 반무한 영역.
이런 문제들에는 수식으로 표현되는 정확한 답이 있다. 수백 년간 쌓인 해석적 해의 목록이 있다.
그러면 이렇게 한다. 우리 솔버로 그 문제를 풀고, 알려진 답과 비교한다.
일치하면 솔버가 최소한 그 종류의 문제에서는 옳게 작동한다는 뜻이다. 어긋나면 코드에 버그가 있거나 격자가 부족한 것이다.
이걸 자동화해서 상시 검사로 둔다. 코드를 고칠 때마다 이 문제들을 다시 풀어 답이 그대로인지 확인한다. 소프트웨어 개발의 회귀 테스트와 같은 역할이다.
한계 — 검증되는 것은 그 단순한 문제들뿐이다. 실제 사용자의 복잡한 형상에서 옳다는 보장은 아니다. 다만 틀렸다면 여기서 걸릴 가능성이 높다. 기초가 틀린 솔버가 복잡한 문제에서만 맞을 리 없다.
층 2: 스스로 일관되는지 보기
두 번째 층은 정답 없이도 할 수 있는 검사들이다. 답이 물리적으로 말이 되는지 확인한다.
에너지가 보존되는가
정상 상태라면 들어온 열과 나간 열이 같아야 한다.
계산이 끝난 뒤, 가열면으로 들어온 총 열량과 모든 노출면에서 빠져나간 총 열량을 각각 더해 본다. 두 값이 같아야 한다.
차이가 크면 뭔가 잘못됐다. 격자가 부족하거나, 반복이 덜 수렴했거나, 경계조건 처리에 오류가 있다.
이 검사는 정답을 몰라도 된다. 그리고 강력하다. 실제로 많은 오류가 여기서 걸린다.
최대·최소가 제자리에 있는가
열은 뜨거운 쪽에서 차가운 쪽으로 흐른다. 그러면 계산 영역 안에서 가장 뜨거운 곳은 열원이 있는 경계여야 하고, 안쪽에 열원보다 뜨거운 점이 생기면 안 된다.
만약 안쪽에 이상한 고온점이 나타났다면 그건 물리가 아니라 계산의 부작용이다.
조건을 바꿨을 때 방향이 맞는가
손잡이를 길게 하면 끝 온도가 내려가야 한다. 열전도율이 낮은 재료를 쓰면 끝 온도가 내려가야 한다. 가열 온도를 올리면 모든 곳의 온도가 올라야 한다.
이런 방향성은 정답을 몰라도 안다. 그리고 시스템이 자동으로 확인할 수 있다. 조건을 살짝 바꿔 다시 계산해서 답이 예상 방향으로 움직이는지 보는 것이다.
15편에서 “절대값이 부정확해도 변화 방향은 신뢰할 수 있다”고 했다. 이 검사가 그 신뢰의 근거다.
대칭이 유지되는가
문제가 대칭이면 답도 대칭이어야 한다. 좌우가 같은 조건인데 온도 분포가 좌우로 기울어져 나오면 오류다.
층 3: 계산의 안정성을 보기
세 번째 층은 18편에서 다룬 것들이다.
격자 수렴 — 격자를 바꿔도 답이 크게 안 변하는가.
반복 수렴 — 남은 거리가 충분히 작은가.
이 둘은 “수치적으로 안정된 답”을 보증한다. 물리 모델이 맞다는 뜻은 아니지만, 적어도 계산 과정에서 온 오차는 작다는 것을 말해 준다.
세 층을 합치면
정리하면 이런 구조다.
| 층 | 확인하는 것 | 정답 필요? |
|---|---|---|
| 1. 알려진 해 대조 | 솔버가 옳게 구현되었나 | 필요 (단순 문제만) |
| 2. 물리적 일관성 | 답이 물리를 위반하지 않나 | 불필요 |
| 3. 수치적 안정성 | 격자·반복 오차가 작나 | 불필요 |
세 층을 다 통과해도 “답이 맞다”는 증명은 아니다. 19편에서 말한 것들이 여전히 남아 있다. 물리 모델이 부적절할 수 있고, 경계조건 가정이 틀렸을 수 있고, 물성값이 실제와 다를 수 있다.
검증은 틀림을 찾는 도구이고, 맞음을 증명하는 도구가 아니다. 이건 과학과 공학 전반에 걸친 성질이다.
그러니 정직한 표현은 이렇다. “이 답에는 우리가 찾을 수 있는 오류가 없습니다.”
사용자에게 무엇을 보여주나
이 검증 결과를 어떻게 전달할지가 실제 설계 문제다.
세 층의 검사 결과를 다 늘어놓으면 아무도 안 읽는다. 그렇다고 아무 말 없이 숫자만 주면 신뢰도 정보가 사라진다.
우리가 택한 방식은 신호등 하나와 필요할 때 펼치는 상세다.
- 초록 — 세 층 모두 통과. 이 조건 범위에서 신뢰할 만함
- 노랑 — 통과했으나 주의 사항 있음. 예를 들어
⚠표시된 애매한 값이 결과를 크게 좌우하는 경우 - 빨강 — 검사에서 문제 발견. 답을 쓰지 말 것
그리고 노랑과 빨강일 때는 무엇이 문제인지 한 문장으로 알려준다. “플라스틱 종류에 따라 결과가 44~58도로 갈립니다” 같은 식으로.
이 설계는 10편의 원칙 — 정하고, 드러내고, 중요한 것만 강조한다 — 를 검증에 적용한 것이다.
3부를 정리하며
일곱 편에 걸쳐 계산의 내부를 봤다. 정리하면 이렇다.
계산은 근사의 연속이다. 미분방정식을 격자로 근사하고, 3차원을 2차원으로 근사하고, 복잡한 형상을 단순 도형으로 근사한다.
근사를 없앨 수는 없다. 없애려 하면 계산이 무거워져서 애초의 목적(폰에서 몇 초)을 잃는다.
대신 근사의 방향을 통제하고, 그 사실을 드러낸다. 19편의 편향 통제와 이 편의 검증 표시가 그 방법이다.
이 태도가 2부의 DSL 설계 원칙과 정확히 같다는 것을 짚어두고 싶다. 많이 결정하되 전부 보여준다. 위층에서는 조건에 대해, 아래층에서는 계산에 대해 같은 원칙이 적용된다.
4부에서는 여기서 한 걸음 더 나간다. 지금까지의 계산은 전통적인 수치 기법이었다. 여기에 AI를 결합하면 무엇이 달라지는지, 그리고 그때 검증 문제가 어떻게 훨씬 어려워지는지.
다음 편 예고 — 왜 AI인가 — 반복이 만드는 기회. 4부의 시작. 우리가 만든 사용 방식 자체가 왜 AI를 위한 조건을 만드는지 이야기한다.