1. 개요[편집]
수치미분(numerical differentiation)은 함수의 도함수를 해석적으로 구하지 않고, 몇 개의 함숫값을 조합해 근사적으로 계산하는 방법이다. 미분의 정의 에서 극한을 유한한 스텝 로 바꿔치기한 것이 출발점이다. 함수의 수식이 없고 데이터만 있거나, 미분이 손으로 구하기엔 지나치게 더러울 때 요긴하다.
말은 쉬운데 실제로는 수치해석에서 손꼽히게 까다로운 주제다. 적분(수치적분)은 오차가 잘 상쇄되며 얌전한 반면, 미분은 데이터의 잡음을 증폭시키는 고약한 연산이기 때문이다. “적분은 신사, 미분은 양아치”라는 말이 괜히 있는 게 아니다.1 그럼에도 유한차분법 기반의 수치해석 전 분야가 이 근사에 기대고 있다.
2. 전진·후진·중심 차분[편집]
가장 기본적인 세 가지 차분 도식은 다음과 같다. 테일러 전개로 유도하며, 괄호 안은 절단오차(truncation error)의 차수다.
- 전진차분(forward difference):
- 후진차분(backward difference):
- 중심차분(central difference):
전진·후진은 1차 정확도인 반면, 중심차분은 테일러 전개에서 짝수 항이 절묘하게 상쇄되어 2차 정확도를 공짜로 얻는다.2 그래서 내부 격자점에서는 중심차분이 국룰이고, 경계에서는 한쪽 데이터밖에 없으니 어쩔 수 없이 편측(one-sided) 차분을 쓴다. 2계 도함수도 마찬가지로 세 점을 조합해 근사한다.
이 2계 중심차분이 바로 라플라스 방정식과 포아송 방정식의 이산화에서 튀어나오는 그 스텐실의 정체다.
3. 오차와 라운드오프의 트레이드오프[편집]
수치미분의 핵심 딜레마는 여기다. 스텝 를 줄이면 절단오차는 작아지지만, 대신 라운드오프 오차(round-off error)가 커진다. 분자 에서 거의 같은 두 수를 빼는 자릿수 소실(catastrophic cancellation)이 일어나고, 이걸 작은 로 나누면서 오차가 증폭되기 때문이다.
전체 오차를 대략 쓰면 다음 꼴이 된다(은 기계 정밀도).
가 크면 앞 항이, 작으면 뒤 항이 지배한다. 둘의 합을 최소화하는 최적 가 어중간한 지점에 존재한다.3 즉 “를 무작정 0에 가깝게 하면 정확해진다”는 순진한 기대는 부동소수점 세계에서 배신당한다. 중심차분의 경우 최적 스텝은 대략 언저리(배정밀도에서 수준)로, 흔히 상상하는 것보다 훨씬 크다.
4. 리처드슨 외삽[편집]
정확도를 끌어올리는 우아한 방법이 리처드슨 외삽(Richardson extrapolation)이다. 서로 다른 스텝(와 )으로 계산한 두 근사값을 선형결합해 낮은 차수의 오차 항을 소거하는 기법이다. 중심차분() 결과를 라 하면,
이렇게 하면 오차가 사라지고 정확도로 껑충 뛴다. 계산은 두 배 들지만 정확도는 차수째 올라가니 가성비가 좋다. 이걸 반복 적용하는 것이 수치적분의 롬베르그(Romberg) 적분과 같은 아이디어다.4 공짜 점심은 없다지만, 리처드슨 외삽은 거의 반값 점심 수준의 혜자다.
5. 복소수 스텝 미분[편집]
라운드오프의 저주를 통째로 우회하는 마법 같은 기법이 복소수 스텝 미분(complex-step differentiation)이다. 실수 대신 순허수 스텝 를 넣고 테일러 전개하면,
가 된다. 핵심은 뺄셈이 없다는 것이다. 자릿수 소실이 아예 발생하지 않으므로 를 처럼 극단적으로 작게 잡아도 정확도가 무너지지 않고, 사실상 해석적 미분에 육박하는 정밀도를 얻는다.5 대가라면 함수가 복소수 인자를 받아들일 수 있게 짜여 있어야 한다는 것. 요즘은 여기서 한 발 더 나아가, 뺄셈 자체를 없애고 도함수를 정확히 전파하는 자동미분(automatic differentiation)이 머신러닝의 역전파를 떠받치는 표준이 되었다.
6. 고차 스텐실과 격자에서의 미분[편집]
정확도가 더 필요하면 더 많은 점을 끌어모아 스텐실을 넓히면 된다. 다섯 점을 조합한 4차 정확도 중심차분은 다음과 같다.
점을 늘릴수록 절단오차 차수는 올라가지만, 그만큼 경계 근처에서 쓸 수 있는 점이 부족해지고 계산 스텐실이 커진다는 대가가 따른다. 이 계수들은 결국 여러 점을 지나는 다항식을 세워 미분하는 보간과 근사의 문제로 환원되며, 임의의 점 배치에 대한 차분 계수를 뽑아주는 파넬(Fornberg) 알고리즘이 널리 쓰인다.
수치미분이 실제로 가장 많이 소비되는 곳은 유한차분법 기반의 편미분방정식 풀이다. 시공간 격자 위에서 도함수를 차분으로 바꾸는 순간, 그 방정식은 컴퓨터가 씹을 수 있는 대수방정식이 된다. 다만 이류(convection) 항처럼 방향성이 중요한 항에서는 순진한 중심차분이 진동을 일으켜서, 상류차분(upwind)이나 TVD 같은 차분 도식으로 정확도와 안정성 사이를 저울질하게 된다.6
7. 관련 문서[편집]
8. Footnotes[편집]
-
적분은 함숫값을 평균 내는 연산이라 국소 오차나 잡음이 서로 상쇄되며 매끄러워진다. 반면 미분은 근처 값의 차이를 확대하는 연산이라 잡음을 그대로, 아니 더 크게 증폭한다. 노이즈 낀 실험 데이터를 그냥 미분하면 지옥을 보게 된다. ↩
-
테일러 전개에서 와 를 빼면 짝수차 항(의 계수를 공유하는 항)이 소거되고 홀수차만 남는다. 이 대칭성 덕에 1차 오차 항이 통째로 날아가 2차 정확도가 공짜로 굴러 들어온다. 대칭은 언제나 옳다. ↩
-
이 트레이드오프 곡선은 로그-로그 스케일에서 예쁜 V자를 그린다. 왼쪽 벽은 라운드오프, 오른쪽 벽은 절단오차. 바닥이 최적점이다. 수치미분을 처음 코딩한 사람이라면 를 줄일수록 오차가 커지는 왼쪽 벽을 보고 당황하는 통과의례를 거친다. ↩
-
리처드슨 외삽이 성립하려면 오차가 의 거듭제곱으로 깔끔하게 전개된다는 가정이 필요하다. 이 가정이 깨지는(예: 함수가 미분 불가능한 점 근처) 경우엔 외삽이 오히려 헛짚을 수 있으니 만능은 아니다. ↩
-
1998년 스콰이어와 트랩(Squire & Trapp)이 정리한 이 기법은 CFD 코드의 민감도 해석이나 야코비안 계산에서 조용히 애용된다. 코드 한 줄만 복소수로 바꾸면 되니, 유한차분으로 끙끙대던 엔지니어에게는 거의 사기 아이템 취급이다. ↩
-
중심차분은 정확도는 높지만 이류 지배 문제에서 격자 진동(wiggle)을 만들어 해를 오염시킨다. 반대로 상류차분은 얌전하지만 수치확산(numerical diffusion)으로 해를 뭉갠다. 정확도와 안정성은 좀처럼 둘 다 가질 수 없는, 수치해석의 영원한 트레이드오프다. ↩