수치해석 (Numerical Analysis)
수치해석은 수학 문제의 근사적인 수치 해법을 연구하는 분야입니다. 해석적으로 풀기 어렵거나 불가능한 문제를 컴퓨터를 이용하여 근사적으로 풀 수 있습니다. 이 분야는 공학, 과학, 금융 등 실질적으로 모든 응용 수학 분야의 기반이 됩니다.
한마디로, 컴퓨터로 수학 문제를 푸는 방법을 연구하는 학문입니다. 수학에는 정확한 답을 구할 수 있는 문제도 있지만, 대부분의 실제 문제는 손으로 정확하게 풀기 어렵거나 불가능합니다. 예를 들어 $x = \cos(x)$를 만족하는 $x$를 구하려면 어떻게 해야 합니까? 대수적으로는 풀 수 없지만, 컴퓨터를 이용하면 원하는 정밀도까지 근사적인 답을 구할 수 있습니다.
수치해석은 이러한 "근사적 풀이"를 얼마나 정확하게, 얼마나 빠르게, 얼마나 안정적으로 수행할 수 있는지를 체계적으로 다루는 분야입니다.
산 높이를 재려면 정확히 꼭대기까지 올라가는 방법(해석적 풀이)이 가장 정확하지만, 현실적으로 어려울 수 있습니다. 대신 멀리서 각도를 재고 삼각법으로 계산하면(수치적 풀이) 충분히 정확한 결과를 훨씬 빨리 얻을 수 있습니다. 수치해석은 이렇게 "정확한 답 대신 충분히 좋은 답"을 효율적으로 구하는 방법을 연구합니다.
이런 곳에 쓰여요
- 일기예보: 대기 방정식을 수치적으로 풀어서 내일 날씨를 예측
- 영화 CG: 물, 불, 연기 시뮬레이션을 수치 적분으로 렌더링
- 비행기 설계: 풍동 실험 대신 컴퓨터로 공기역학 시뮬레이션(CFD)
- 주식 가격: 블랙-숄즈 방정식을 수치적으로 풀어 옵션 가격 계산
난이도: ★★★★☆ (대학교)
부동소수점 표현
컴퓨터는 실수를 유한한 비트로 표현하기 때문에, 모든 실수를 정확하게 나타낼 수 없습니다. 이 한계가 수치 계산의 근본적인 오차 원인이 됩니다.
일상에서 $\frac{1}{3} = 0.333\ldots$을 소수로 쓰면 끝없이 계속됩니다. 하지만 종이에는 유한한 자릿수만 쓸 수 있으므로 $0.333$처럼 끊어야 합니다. 컴퓨터도 마찬가지입니다. 유한한 비트(0과 1)로 실수를 표현해야 하므로, 대부분의 실수는 "반올림"되어 저장됩니다. $0.1 + 0.2$가 컴퓨터에서 정확히 $0.3$이 아닌 $0.30000000000000004$가 되는 이유가 바로 이것입니다.
IEEE 754 표준
IEEE 754는 부동소수점 수의 표현과 연산을 정의하는 국제 표준입니다. 부동소수점 수는 다음과 같이 표현됩니다.
$$x = (-1)^s \times m \times 2^e$$여기서 $s$는 부호 비트, $m$은 가수(mantissa/significand), $e$는 지수(exponent)입니다.
| 형식 | 부호 | 지수 | 가수 | 전체 비트 | 유효 십진 자릿수 |
|---|---|---|---|---|---|
| 단정밀도 (float) | 1비트 | 8비트 | 23비트 | 32비트 | 약 7자리 |
| 배정밀도 (double) | 1비트 | 11비트 | 52비트 | 64비트 | 약 15~16자리 |
기계 엡실론 (Machine Epsilon)
기계 엡실론 $\epsilon_{\text{mach}}$은 $1 + \epsilon > 1$을 만족하는 가장 작은 부동소수점 수입니다. 이는 부동소수점 산술의 상대 정밀도를 나타냅니다.
$$\epsilon_{\text{mach}} = 2^{-(t-1)}$$여기서 $t$는 가수 비트 수(숨겨진 비트 포함)입니다.
| 형식 | 기계 엡실론 |
|---|---|
| 단정밀도 | $\epsilon_{\text{mach}} = 2^{-23} \approx 1.19 \times 10^{-7}$ |
| 배정밀도 | $\epsilon_{\text{mach}} = 2^{-52} \approx 2.22 \times 10^{-16}$ |
임의의 실수 $x$를 부동소수점 수 $\text{fl}(x)$로 표현할 때, 반올림에 의한 상대 오차는 다음을 만족합니다.
$$\left|\frac{\text{fl}(x) - x}{x}\right| \leq \frac{\epsilon_{\text{mach}}}{2}$$유효숫자 (Significant Digits)
근사값 $\hat{x}$가 참값 $x$에 대해 $t$자리 유효숫자를 갖는다는 것은 다음을 의미합니다.
$$\frac{|x - \hat{x}|}{|x|} \leq 5 \times 10^{-t}$$오차 분석
체중계에 올라갔을 때 67.3kg이 나왔다고 합시다. 실제 체중이 정확히 67.0kg이라면, 0.3kg만큼의 오차가 있는 것입니다. 수치해석에서도 마찬가지로, 컴퓨터가 계산한 "근사값"과 "참값" 사이에는 항상 차이(오차)가 존재합니다. 중요한 것은 오차를 없애는 것이 아니라, 오차를 이해하고 허용 범위 안으로 제어하는 것입니다.
오차의 종류
| 종류 | 설명 | 예시 |
|---|---|---|
| 반올림 오차 (Round-off Error) | 유한 자릿수 표현에 의한 오차 | $\frac{1}{3} = 0.333\ldots$을 유한 소수로 표현 |
| 절단 오차 (Truncation Error) | 무한 과정을 유한으로 잘라서 생기는 오차 | 테일러 급수를 유한 항까지만 사용 |
| 측정 오차 (Data Error) | 입력 데이터의 부정확성 | 실험 측정값의 불확실성 |
절대오차와 상대오차
참값 $x$에 대한 근사값 $\hat{x}$의 오차를 두 가지로 측정합니다.
- 절대 오차 (Absolute Error): $E_{\text{abs}} = |x - \hat{x}|$
- 상대 오차 (Relative Error): $E_{\text{rel}} = \dfrac{|x - \hat{x}|}{|x|}$ (단, $x \neq 0$)
상황 1: 서울에서 부산까지의 실제 거리가 400km인데, 네비게이션이 399km라고 표시합니다.
- 절대 오차: $|400 - 399| = 1$km
- 상대 오차: $\frac{1}{400} = 0.0025 = 0.25\%$
- 해석: 1km 오차는 400km에 비하면 무시할 수 있습니다.
상황 2: 나사의 길이가 실제로 2mm인데, 측정기가 1mm라고 표시합니다.
- 절대 오차: $|2 - 1| = 1$mm
- 상대 오차: $\frac{1}{2} = 0.5 = 50\%$
- 해석: 절대 오차는 1mm로 작아 보이지만, 참값에 비하면 50%나 벗어나 있어 심각한 오차입니다.
이처럼 같은 크기의 절대 오차라도 참값에 따라 의미가 달라집니다. 따라서 상대 오차가 더 의미 있는 척도인 경우가 많습니다.
전방 오차와 후방 오차
문제를 함수 $f$로, 알고리즘의 계산 결과를 $\hat{y}$라 하면:
- 전방 오차 (Forward Error): 계산된 답과 정확한 답의 차이 $$\Delta y = |\hat{y} - f(x)|$$
- 후방 오차 (Backward Error): 계산된 답이 정확한 답이 되도록 하는 입력의 섭동 $$\Delta x = \min\{|\delta x| : f(x + \delta x) = \hat{y}\}$$
알고리즘이 후방 안정(backward stable)하다는 것은, 계산된 결과가 약간 섭동된 입력에 대한 정확한 답이라는 의미입니다. 즉, 후방 오차가 기계 엡실론 수준으로 작습니다.
조건수 (Condition Number)
문제의 조건수는 입력의 작은 변화가 출력에 얼마나 큰 영향을 미치는지를 나타내는 척도입니다.
함수의 조건수: 함수 $f$에서 $x$에서의 (상대) 조건수는
$$\kappa = \left|\frac{x f'(x)}{f(x)}\right|$$행렬의 조건수: 행렬 $A$의 조건수는
$$\kappa(A) = \|A\| \cdot \|A^{-1}\|$$여기서 $\|\cdot\|$는 적절한 행렬 노름입니다. $\kappa(A) \geq 1$이며:
- $\kappa(A) \approx 1$: 양조건(Well-conditioned) — 입력 변화에 안정적
- $\kappa(A) \gg 1$: 악조건(Ill-conditioned) — 작은 입력 변화가 큰 출력 변화를 유발
선형 시스템에서의 의미: $A\mathbf{x} = \mathbf{b}$를 풀 때, 입력 $\mathbf{b}$에 상대적 섭동 $\frac{\|\delta \mathbf{b}\|}{\|\mathbf{b}\|}$가 있으면 해의 상대적 섭동은 다음으로 한정됩니다.
$$\frac{\|\delta \mathbf{x}\|}{\|\mathbf{x}\|} \leq \kappa(A) \frac{\|\delta \mathbf{b}\|}{\|\mathbf{b}\|}$$비선형 방정식의 근
$f(x) = 0$의 근을 수치적으로 찾는 방법들입니다. 각 방법의 수렴 속도, 장단점, 실패 조건을 비교하여 이해하는 것이 중요합니다.
이하에서는 $f(x) = x^3 - x - 2 = 0$이라는 하나의 방정식을 이분법, 뉴턴법, 할선법(세컨트법), 고정점 반복법의 4가지 방법으로 풀어 비교합니다. 이 방정식의 실근은 $x^* \approx 1.52138$입니다.
이분법 (Bisection Method)
원리: 중간값 정리에 기반합니다. $f$가 $[a, b]$에서 연속이고 $f(a) \cdot f(b) < 0$이면, $(a, b)$ 안에 적어도 하나의 근이 존재합니다.
알고리즘:
- 중점 $c = \dfrac{a + b}{2}$ 계산
- $f(c) = 0$이면 $c$가 근, 종료
- $f(a) \cdot f(c) < 0$이면 $b \leftarrow c$, 아니면 $a \leftarrow c$
- $|b - a| < \varepsilon$ (허용 오차)이 될 때까지 반복
수렴 분석: $n$번 반복 후 구간 길이는 $\dfrac{b - a}{2^n}$이므로, 오차 한계는
$$|x^* - c_n| \leq \frac{b - a}{2^{n+1}}$$허용 오차 $\varepsilon$ 이내로 수렴하는 데 필요한 반복 횟수:
$$n \geq \frac{\log(b - a) - \log(\varepsilon)}{\log 2}$$수렴 차수는 선형(1차)이며, 매 반복마다 정확도가 약 1비트씩 늘어납니다.
친구가 1부터 100 사이의 숫자를 하나 생각하고, 여러분이 맞추는 게임을 한다고 합시다. "50보다 큰가요?" → "예" → "75보다 큰가요?" → "아니오" → "62보다 큰가요?" … 이렇게 범위를 절반씩 줄여 나가면 최대 7번 만에 답을 찾을 수 있습니다. 이분법도 정확히 같은 원리입니다.
$f(x) = x^2 - 2 = 0$의 근, 즉 $\sqrt{2}$를 이분법으로 구해 봅시다. $f(1) = -1 < 0$이고 $f(2) = 2 > 0$이므로 근은 $[1, 2]$ 안에 있습니다.
| 반복 | $a$ | $b$ | 중점 $c$ | $f(c)$ | 부호 | 다음 구간 |
|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 1.5 | 0.25 | $+$ | $[1, 1.5]$ |
| 2 | 1 | 1.5 | 1.25 | $-0.4375$ | $-$ | $[1.25, 1.5]$ |
| 3 | 1.25 | 1.5 | 1.375 | $-0.109$ | $-$ | $[1.375, 1.5]$ |
| 4 | 1.375 | 1.5 | 1.4375 | $0.066$ | $+$ | $[1.375, 1.4375]$ |
매 반복마다 구간이 절반으로 줄어들며, 4번 반복 후 근은 $[1.375, 1.4375]$ 안에 있다는 것을 알 수 있습니다. 참값 $\sqrt{2} \approx 1.4142$가 이 구간 안에 있습니다.
뉴턴법 (Newton's Method)
곡선 위의 한 점에 서서 발 밑의 기울기를 느낀다고 상상해 봅시다. 그 기울기를 따라 직선을 그으면 $x$축과 만나는 점이 생깁니다. 그 점으로 이동해서 같은 과정을 반복하면, 곡선이 $x$축과 만나는 점(근)에 빠르게 다가갑니다. 이분법보다 훨씬 빠르지만, 시작 위치를 잘못 잡으면 엉뚱한 곳으로 갈 수도 있습니다.
유도: $f(x)$를 현재 근사값 $x_n$ 근처에서 1차 테일러 전개하면
$$f(x) \approx f(x_n) + f'(x_n)(x - x_n)$$$f(x) = 0$으로 놓고 $x$에 대해 풀면 다음 반복 공식을 얻습니다.
$$\boxed{x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}}$$기하학적 해석: $(x_n, f(x_n))$에서의 접선이 $x$축과 만나는 점을 다음 근사값으로 사용합니다.
수렴 정리: $f(x^*) = 0$, $f'(x^*) \neq 0$ (단근), $f''$가 연속이면, 충분히 $x^*$에 가까운 초기값에서 뉴턴법은 이차 수렴합니다.
$$|x_{n+1} - x^*| \leq C|x_n - x^*|^2, \quad C = \frac{|f''(x^*)|}{2|f'(x^*)|} $$예시: $f(x) = x^2 - 2$ ($\sqrt{2}$ 구하기)에서 $x_0 = 1$로 시작하면
$$x_{n+1} = x_n - \frac{x_n^2 - 2}{2x_n} = \frac{x_n + \frac{2}{x_n}}{2}$$| $n$ | $x_n$ | 오차 $|x_n - \sqrt{2}|$ |
|---|---|---|
| 0 | 1.000000000000000 | $4.14 \times 10^{-1}$ |
| 1 | 1.500000000000000 | $8.58 \times 10^{-2}$ |
| 2 | 1.416666666666667 | $2.45 \times 10^{-3}$ |
| 3 | 1.414215686274510 | $2.12 \times 10^{-6}$ |
| 4 | 1.414213562374690 | $1.59 \times 10^{-12}$ |
이차 수렴의 위력: 4번 반복만에 12자리 정확도를 달성합니다.
실패 조건:
- $f'(x_n) = 0$: 접선이 수평 — 다음 반복을 계산할 수 없음
- $f'(x_n) \approx 0$: 다음 반복값이 매우 멀어져 발산 가능
- 중근: $f'(x^*) = 0$이면 수렴 차수가 선형으로 감소. 이 경우 수정 뉴턴법 $x_{n+1} = x_n - m\frac{f(x_n)}{f'(x_n)}$ (근의 중복도 $m$) 사용
- 순환: 초기값에 따라 주기적으로 반복하며 수렴하지 않을 수 있음
세컨트법 (Secant Method)
뉴턴법에서 도함수 $f'(x_n)$을 차분으로 근사합니다.
$$f'(x_n) \approx \frac{f(x_n) - f(x_{n-1})}{x_n - x_{n-1}}$$이를 대입하면 반복 공식을 얻습니다.
$$\boxed{x_{n+1} = x_n - f(x_n) \cdot \frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}}$$초기값 2개 $(x_0, x_1)$이 필요하며, 매 반복에서 함수 평가 1회만 수행합니다 (뉴턴법은 $f$와 $f'$ 2회).
수렴 차수: 초수렴(superlinear)이며, 수렴 차수는 황금비 $\phi = \frac{1+\sqrt{5}}{2} \approx 1.618$입니다.
$$|x_{n+1} - x^*| \approx C|x_n - x^*|^{1.618}$$고정점 반복법 (Fixed-Point Iteration)
$f(x) = 0$을 $x = g(x)$ 형태로 변환한 뒤, 반복 $x_{n+1} = g(x_n)$을 수행합니다.
수렴 정리 (바나흐 고정점 정리): $g: [a,b] \to [a,b]$이 연속이고, 어떤 상수 $L < 1$에 대해 모든 $x, y \in [a,b]$에서
$$|g(x) - g(y)| \leq L|x - y|$$를 만족하면 ($g$가 축소 사상), $g$는 유일한 고정점 $x^*$를 가지며 임의의 $x_0 \in [a,b]$에서 반복이 수렴합니다.
오차 한계:
$$|x_n - x^*| \leq \frac{L^n}{1 - L}|x_1 - x_0|$$수렴 속도: $g'(x^*) \neq 0$이면 선형 수렴, $g'(x^*) = 0$이면 이차 이상의 수렴.
근 찾기 방법 비교
| 방법 | 수렴 차수 | 함수 평가/반복 | 도함수 필요 | 수렴 보장 |
|---|---|---|---|---|
| 이분법 | 1 (선형) | 1 | 아니오 | 예 |
| 고정점 반복법 | 1 (선형) | 1 | 아니오 | 조건부 |
| 세컨트법 | $\approx 1.618$ | 1 | 아니오 | 아니오 |
| 뉴턴법 | 2 (이차) | 2 ($f$, $f'$) | 예 | 아니오 |
4가지 방법 직접 비교 — $x^3 - x - 2 = 0$
동일한 방정식 $f(x) = x^3 - x - 2 = 0$의 근 $x^* \approx 1.52138$을 4가지 방법으로 구한 결과를 비교합니다.
| 반복 | $a$ | $b$ | 중점 $c$ | $f(c)$ | 오차 한계 |
|---|---|---|---|---|---|
| 1 | 1 | 2 | 1.5 | $-0.125$ | $0.5$ |
| 2 | 1.5 | 2 | 1.75 | $2.609$ | $0.25$ |
| 3 | 1.5 | 1.75 | 1.625 | $1.666$ | $0.125$ |
| 4 | 1.5 | 1.625 | 1.5625 | $0.252$ | $0.0625$ |
| 5 | 1.5 | 1.5625 | 1.53125 | $0.059$ | $0.03125$ |
5회 반복 후에도 오차 한계가 $0.03$입니다. 확실하지만 느립니다.
| $n$ | $x_n$ | $f(x_n)$ | $f'(x_n)$ | 오차 $|x_n - x^*|$ |
|---|---|---|---|---|
| 0 | $2.000000$ | $4.000$ | $11.00$ | $4.79 \times 10^{-1}$ |
| 1 | $1.636364$ | $0.744$ | $7.033$ | $1.15 \times 10^{-1}$ |
| 2 | $1.530571$ | $0.0260$ | $6.028$ | $9.19 \times 10^{-3}$ |
| 3 | $1.521254$ | $3.5 \times 10^{-5}$ | $5.943$ | $1.3 \times 10^{-5}$ |
3회 반복만으로 5자리 정확도를 달성합니다. 이차 수렴의 위력입니다.
| $n$ | $x_n$ | $f(x_n)$ | 오차 $|x_n - x^*|$ |
|---|---|---|---|
| 0 | $1.000000$ | $-2.000$ | $5.21 \times 10^{-1}$ |
| 1 | $2.000000$ | $4.000$ | $4.79 \times 10^{-1}$ |
| 2 | $1.333333$ | $-0.963$ | $1.88 \times 10^{-1}$ |
| 3 | $1.588235$ | $0.418$ | $6.69 \times 10^{-2}$ |
| 4 | $1.516484$ | $-0.029$ | $4.90 \times 10^{-3}$ |
| 5 | $1.521462$ | $5.0 \times 10^{-4}$ | $8.1 \times 10^{-5}$ |
도함수 없이 5회 반복으로 4자리 정확도를 달성합니다.
| $n$ | $x_n$ | 오차 $|x_n - x^*|$ |
|---|---|---|
| 0 | $1.000000$ | $5.21 \times 10^{-1}$ |
| 1 | $1.442250$ | $7.91 \times 10^{-2}$ |
| 2 | $1.506998$ | $1.44 \times 10^{-2}$ |
| 3 | $1.518708$ | $2.67 \times 10^{-3}$ |
| 4 | $1.520884$ | $4.96 \times 10^{-4}$ |
선형 수렴이므로 느리지만, 구현이 매우 간단하고 도함수가 불필요합니다.
보간법
보간법(Interpolation)은 주어진 데이터 점 $(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)$을 모두 정확히 지나는 함수를 구성하는 방법입니다.
온도 센서가 매시간 기온을 측정한다고 합시다: 오전 6시에 10도, 9시에 15도, 12시에 22도, 15시에 20도. 그런데 오전 8시의 기온은 얼마였을까요? 센서가 측정하지 않은 시점의 값을 측정된 점들로부터 "추정"하는 것이 바로 보간법입니다. 점들을 부드럽게 이어주는 곡선(다항식)을 찾아서, 그 곡선 위에서 원하는 점의 값을 읽어내는 것입니다.
라그랑주 보간 (Lagrange Interpolation)
$n+1$개의 점을 지나는 최대 $n$차 다항식을 라그랑주 기저 다항식으로 표현합니다.
$$\boxed{P_n(x) = \sum_{i=0}^{n} y_i L_i(x), \quad L_i(x) = \prod_{\substack{j=0 \\ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j}}$$각 $L_i(x)$는 $L_i(x_i) = 1$이고 $j \neq i$일 때 $L_i(x_j) = 0$을 만족하므로, $P_n(x_i) = y_i$가 자동으로 성립합니다.
보간 오차: $f$가 $[a,b]$에서 $n+1$번 미분 가능하면
$$f(x) - P_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} \prod_{i=0}^{n}(x - x_i)$$여기서 $\xi$는 $x$와 보간 노드를 포함하는 구간 안의 어떤 점입니다.
점 $(1, 1)$, $(2, 4)$, $(3, 9)$를 지나는 다항식을 구해 봅시다.
1단계: 각 점에 대응하는 기저 다항식 $L_i(x)$를 구합니다.
- $L_0(x) = \frac{(x-2)(x-3)}{(1-2)(1-3)} = \frac{(x-2)(x-3)}{(-1)(-2)} = \frac{(x-2)(x-3)}{2}$
- $L_1(x) = \frac{(x-1)(x-3)}{(2-1)(2-3)} = \frac{(x-1)(x-3)}{(1)(-1)} = -(x-1)(x-3)$
- $L_2(x) = \frac{(x-1)(x-2)}{(3-1)(3-2)} = \frac{(x-1)(x-2)}{(2)(1)} = \frac{(x-1)(x-2)}{2}$
2단계: 기저 다항식에 $y$값을 곱하여 더합니다.
$$P_2(x) = 1 \cdot L_0(x) + 4 \cdot L_1(x) + 9 \cdot L_2(x)$$3단계: 정리하면 $P_2(x) = x^2$이 됩니다. 실제로 원래 데이터가 $y = x^2$ 위의 점들이었으므로 당연한 결과입니다!
검증: $P_2(1) = 1$, $P_2(2) = 4$, $P_2(3) = 9$ — 모든 점을 정확히 지납니다.
뉴턴 보간 (Newton's Divided Difference)
분할차분(Divided Difference)을 이용하여 점진적으로 구성할 수 있는 형태입니다.
$$P_n(x) = f[x_0] + f[x_0, x_1](x - x_0) + f[x_0, x_1, x_2](x - x_0)(x - x_1) + \cdots$$분할차분의 정의:
$$f[x_i] = f(x_i)$$ $$f[x_i, x_{i+1}] = \frac{f[x_{i+1}] - f[x_i]}{x_{i+1} - x_i}$$ $$f[x_i, x_{i+1}, \ldots, x_{i+k}] = \frac{f[x_{i+1}, \ldots, x_{i+k}] - f[x_i, \ldots, x_{i+k-1}]}{x_{i+k} - x_i}$$장점: 새로운 데이터 점이 추가되면 기존 계수를 유지하고 항만 추가하면 되므로 효율적입니다. 계산 복잡도는 $O(n^2)$입니다.
에르미트 보간 (Hermite Interpolation)
에르미트 보간은 데이터 점에서 함수값뿐만 아니라 도함수 값까지 일치하는 다항식을 구성합니다.
$n+1$개의 점에서 함수값과 1차 도함수가 주어지면, $2n+1$차 다항식 $H_{2n+1}(x)$를 구합니다.
$$H_{2n+1}(x_i) = f(x_i), \quad H'_{2n+1}(x_i) = f'(x_i), \quad i = 0, 1, \ldots, n$$오차:
$$f(x) - H_{2n+1}(x) = \frac{f^{(2n+2)}(\xi)}{(2n+2)!}\left[\prod_{i=0}^{n}(x-x_i)\right]^2$$스플라인 보간 (Spline Interpolation)
고차 다항식 보간은 노드 사이에서 심하게 진동할 수 있습니다 (룽게 현상). 스플라인 보간은 구간별로 저차 다항식을 이어 붙여 이 문제를 해결합니다.
자연 3차 스플라인 (Natural Cubic Spline): 각 구간 $[x_i, x_{i+1}]$에서 3차 다항식 $S_i(x)$를 사용하되 다음 조건을 만족합니다.
- 보간 조건: $S_i(x_i) = y_i$, $S_i(x_{i+1}) = y_{i+1}$
- 매끄러움: 내부 노드에서 $S_i'(x_{i+1}) = S_{i+1}'(x_{i+1})$, $S_i''(x_{i+1}) = S_{i+1}''(x_{i+1})$
- 경계 조건 (자연 스플라인): $S''(x_0) = 0$, $S''(x_n) = 0$
$h_i = x_{i+1} - x_i$로 놓고 $M_i = S''(x_i)$라 하면, 각 구간에서의 스플라인은
$$S_i(x) = \frac{M_i}{6h_i}(x_{i+1}-x)^3 + \frac{M_{i+1}}{6h_i}(x-x_i)^3 + \left(\frac{y_i}{h_i} - \frac{M_i h_i}{6}\right)(x_{i+1}-x) + \left(\frac{y_{i+1}}{h_i} - \frac{M_{i+1} h_i}{6}\right)(x-x_i)$$$M_i$들은 삼중대각(tridiagonal) 선형 시스템을 풀어 구합니다.
4가지 보간법 직접 비교
데이터 점 $(0, 1)$, $(1, 2)$, $(2, 5)$, $(3, 10)$에 대해 네 가지 보간법을 적용하여 $x = 1.5$에서의 값을 추정합니다 (참값을 $f(x) = 1 + x + \frac{x(x-1)}{2} + \frac{x(x-1)(x-2)}{6}$로 가정).
$L_0(1.5) = \frac{(0.5)(-0.5)(-1.5)}{(-1)(-2)(-3)} = \frac{0.375}{-6} = -0.0625$
$L_1(1.5) = \frac{(1.5)(-0.5)(-1.5)}{(1)(-1)(-2)} = \frac{1.125}{2} = 0.5625$
$L_2(1.5) = \frac{(1.5)(0.5)(-1.5)}{(2)(1)(-1)} = \frac{-1.125}{-2} = 0.5625$
$L_3(1.5) = \frac{(1.5)(0.5)(-0.5)}{(3)(2)(1)} = \frac{-0.375}{6} = -0.0625$
$P(1.5) = 1(-0.0625) + 2(0.5625) + 5(0.5625) + 10(-0.0625) = 3.25$
| $x_i$ | $f[\cdot]$ | $f[\cdot,\cdot]$ | $f[\cdot,\cdot,\cdot]$ | $f[\cdot,\cdot,\cdot,\cdot]$ |
|---|---|---|---|---|
| 0 | 1 | |||
| 1 | 2 | 1 | ||
| 2 | 5 | 3 | 1 | |
| 3 | 10 | 5 | 1 | 0 |
$P(x) = 1 + 1(x-0) + 1(x-0)(x-1) + 0(x-0)(x-1)(x-2)$
$P(1.5) = 1 + 1.5 + 1(1.5)(0.5) = 1 + 1.5 + 0.75 = 3.25$ — 라그랑주와 동일합니다.
보간법 비교 요약
| 방법 | 필요 정보 | 다항식 차수 | 장점 | 단점 |
|---|---|---|---|---|
| 라그랑주 | 함수값 | $n$차 | 이론적으로 명쾌 | 점 추가 시 전체 재계산 |
| 뉴턴 | 함수값 | $n$차 | 점진적 구성 가능 | 분할차분표 필요 |
| 에르미트 | 함수값 + 도함수 | $2n+1$차 | 높은 정밀도 | 도함수 정보 필요 |
| 3차 스플라인 | 함수값 | 구간별 3차 | 룽게 현상 방지 | 삼중대각 시스템 풀이 필요 |
수치 미분
도함수를 해석적으로 구하기 어려울 때, 함수값의 차분으로 근사합니다.
자동차에 속도계가 없다면, 일정 시간 동안 이동한 거리를 재서 평균 속도를 구할 수 있습니다. "10초 동안 100m를 갔으니 속도는 약 10m/s"처럼 말입니다. 시간 간격을 더 짧게 잡을수록 순간 속도에 더 가까워집니다. 수치 미분도 같은 원리입니다. 함수값의 변화량을 입력의 변화량으로 나누어 도함수(변화율)를 근사합니다.
차분 공식
| 공식 | 근사식 | 절단 오차 |
|---|---|---|
| 전방 차분 (Forward) | $f'(x) \approx \dfrac{f(x+h) - f(x)}{h}$ | $O(h)$ |
| 후방 차분 (Backward) | $f'(x) \approx \dfrac{f(x) - f(x-h)}{h}$ | $O(h)$ |
| 중앙 차분 (Central) | $f'(x) \approx \dfrac{f(x+h) - f(x-h)}{2h}$ | $O(h^2)$ |
$f(x) = x^3$에서 $x = 2$에서의 도함수를 구해 봅시다. 정확한 값은 $f'(2) = 3 \times 2^2 = 12$입니다. $h = 0.1$로 세 가지 방법을 비교합니다.
- 전진 차분: $\frac{f(2.1) - f(2)}{0.1} = \frac{9.261 - 8}{0.1} = 12.61$ — 오차 $0.61$
- 후진 차분: $\frac{f(2) - f(1.9)}{0.1} = \frac{8 - 6.859}{0.1} = 11.41$ — 오차 $0.59$
- 중앙 차분: $\frac{f(2.1) - f(1.9)}{0.2} = \frac{9.261 - 6.859}{0.2} = 12.01$ — 오차 $0.01$
중앙 차분이 압도적으로 정확합니다! 오차가 $O(h^2)$이기 때문입니다.
유도 (테일러 전개): $f(x+h) = f(x) + hf'(x) + \frac{h^2}{2}f''(x) + O(h^3)$이므로
$$f'(x) = \frac{f(x+h) - f(x)}{h} - \frac{h}{2}f''(\xi) = \frac{f(x+h) - f(x)}{h} + O(h)$$중앙 차분의 유도: $f(x+h)$와 $f(x-h)$의 테일러 전개를 빼면
$$f(x+h) - f(x-h) = 2hf'(x) + \frac{h^3}{3}f'''(x) + O(h^5)$$ $$\therefore f'(x) = \frac{f(x+h) - f(x-h)}{2h} - \frac{h^2}{6}f'''(\xi) = \frac{f(x+h) - f(x-h)}{2h} + O(h^2)$$2차 도함수의 수치 근사
$$f''(x) \approx \frac{f(x+h) - 2f(x) + f(x-h)}{h^2}, \quad \text{오차: } O(h^2)$$최적 스텝 크기
$h$를 줄이면 절단 오차는 감소하지만 반올림 오차는 증가합니다. 전방 차분에서 총 오차를 최소화하는 최적 $h$는
$$h_{\text{opt}} \approx \sqrt{\epsilon_{\text{mach}}} \approx 10^{-8} \quad (\text{배정밀도})$$중앙 차분에서는
$$h_{\text{opt}} \approx \epsilon_{\text{mach}}^{1/3} \approx 10^{-5} \quad (\text{배정밀도})$$리처드슨 외삽 (Richardson Extrapolation)
같은 차분 공식을 서로 다른 스텝 크기 $h$와 $h/2$로 계산한 후, 절단 오차의 주요 항을 소거하여 더 높은 정확도를 얻는 기법입니다.
중앙 차분 $D(h)$의 오차가 $O(h^2)$이면:
$$D_{\text{improved}} = \frac{4D(h/2) - D(h)}{3}$$이 결과는 $O(h^4)$ 정확도를 갖습니다.
$f(x) = \sin(x)$에서 $x = 1$의 도함수를 구합니다. 정확한 값: $f'(1) = \cos(1) \approx 0.540302$.
$h = 0.1$: 중앙 차분 $D(0.1) = \frac{\sin(1.1) - \sin(0.9)}{0.2} \approx 0.540260$ (오차: $4.2 \times 10^{-5}$)
$h = 0.05$: 중앙 차분 $D(0.05) = \frac{\sin(1.05) - \sin(0.95)}{0.1} \approx 0.540292$ (오차: $1.0 \times 10^{-5}$)
리처드슨 외삽:
$$D_{\text{improved}} = \frac{4(0.540292) - 0.540260}{3} = \frac{2.160908}{3} \approx 0.540303$$오차가 $1 \times 10^{-6}$으로, $O(h^4)$ 정확도를 달성합니다!
고계 도함수의 수치 근사
3차 도함수와 4차 도함수의 중앙 차분 공식입니다.
$$f'''(x) \approx \frac{f(x+2h) - 2f(x+h) + 2f(x-h) - f(x-2h)}{2h^3}, \quad O(h^2)$$ $$f^{(4)}(x) \approx \frac{f(x+2h) - 4f(x+h) + 6f(x) - 4f(x-h) + f(x-2h)}{h^4}, \quad O(h^2)$$수치 적분
정적분 $\int_a^b f(x)\,dx$를 근사적으로 계산합니다. 구간 $[a, b]$를 $n$등분하여 $h = \frac{b-a}{n}$, $x_k = a + kh$로 놓습니다.
울퉁불퉁한 호수의 면적을 재고 싶다고 합시다. 자로 정확히 잴 수 없으므로, 호수 위에 격자무늬 종이를 놓고 격자 안에 들어가는 칸의 수를 세는 방법을 쓸 수 있습니다. 격자를 더 작게 만들면 더 정확해집니다. 수치 적분도 같은 원리입니다. 곡선 아래의 넓이를 사다리꼴이나 포물선 모양의 작은 도형들로 나누어 더하는 것입니다.
사다리꼴 공식 (Trapezoidal Rule)
각 소구간에서 $f$를 1차식(직선)으로 근사합니다.
$$\boxed{\int_a^b f(x)\,dx \approx T_n = \frac{h}{2}\left[f(x_0) + 2\sum_{k=1}^{n-1}f(x_k) + f(x_n)\right]}$$정확한 값: $\int_0^1 x^2\,dx = \frac{1}{3} \approx 0.3333$. $n = 4$등분하여 사다리꼴 법칙을 적용합시다.
1단계: $h = \frac{1-0}{4} = 0.25$, 노드: $x_0=0, x_1=0.25, x_2=0.5, x_3=0.75, x_4=1$
2단계: 함수값 계산: $f(0)=0$, $f(0.25)=0.0625$, $f(0.5)=0.25$, $f(0.75)=0.5625$, $f(1)=1$
3단계: 공식 적용:
$$T_4 = \frac{0.25}{2}[0 + 2(0.0625 + 0.25 + 0.5625) + 1] = 0.125 \times [0 + 1.75 + 1] = 0.34375$$오차: $|0.3333 - 0.34375| = 0.01042$ — 4등분만으로도 상당히 정확합니다.
오차 공식:
$$\int_a^b f(x)\,dx - T_n = -\frac{(b-a)h^2}{12}f''(\xi), \quad \xi \in (a, b)$$오차 차수: $O(h^2)$. 즉, $h$를 절반으로 줄이면 오차가 약 $\frac{1}{4}$로 줄어듭니다.
심프슨 공식 (Simpson's Rule)
두 소구간씩 묶어 $f$를 2차식(포물선)으로 근사합니다. $n$은 짝수여야 합니다.
$$\boxed{\int_a^b f(x)\,dx \approx S_n = \frac{h}{3}\left[f(x_0) + 4\sum_{\substack{k=1 \\ k\,\text{홀}}}^{n-1}f(x_k) + 2\sum_{\substack{k=2 \\ k\,\text{짝}}}^{n-2}f(x_k) + f(x_n)\right]}$$오차 공식:
$$\int_a^b f(x)\,dx - S_n = -\frac{(b-a)h^4}{180}f^{(4)}(\xi), \quad \xi \in (a, b)$$오차 차수: $O(h^4)$. 3차 이하의 다항식은 정확하게 적분합니다.
정확한 값: $e - 1 \approx 1.71828$. $n = 4$등분으로 심프슨 법칙을 적용합시다.
1단계: $h = 0.25$, 노드: $x_0=0, x_1=0.25, x_2=0.5, x_3=0.75, x_4=1$
2단계: 함수값 계산:
- $f(x_0) = e^0 = 1.0000$
- $f(x_1) = e^{0.25} = 1.2840$ (홀수 번째 → 계수 4)
- $f(x_2) = e^{0.5} = 1.6487$ (짝수 번째 → 계수 2)
- $f(x_3) = e^{0.75} = 2.1170$ (홀수 번째 → 계수 4)
- $f(x_4) = e^{1} = 2.7183$
3단계: 공식 적용:
$$S_4 = \frac{0.25}{3}[1.0000 + 4(1.2840) + 2(1.6487) + 4(2.1170) + 2.7183]$$ $$= \frac{0.25}{3}[1 + 5.136 + 3.2974 + 8.468 + 2.7183] = \frac{0.25}{3} \times 20.6197 \approx 1.71831$$오차: $|1.71828 - 1.71831| \approx 0.00003$ — $n = 4$만으로도 5자리 유효숫자를 얻습니다! 사다리꼴 법칙보다 훨씬 정확합니다.
가우스 구적법 (Gaussian Quadrature)
등간격 노드 대신 최적의 노드와 가중치를 선택하여 정밀도를 극대화합니다.
$$\int_{-1}^{1} f(x)\,dx \approx \sum_{i=1}^{n} w_i f(x_i)$$$n$개의 노드로 최대 $2n-1$차 다항식을 정확하게 적분할 수 있습니다.
가우스-르장드르 구적법: 노드 $x_i$는 $n$차 르장드르 다항식 $P_n(x)$의 근이며, 가중치는
$$w_i = \frac{2}{(1 - x_i^2)[P'_n(x_i)]^2}$$처음 몇 개의 노드와 가중치:
| $n$ | 노드 $x_i$ | 가중치 $w_i$ |
|---|---|---|
| 1 | $0$ | $2$ |
| 2 | $\pm\frac{1}{\sqrt{3}}$ | $1$ |
| 3 | $0, \;\pm\sqrt{\frac{3}{5}}$ | $\frac{8}{9}, \;\frac{5}{9}$ |
일반 구간 $[a, b]$로의 변환: $x = \frac{b-a}{2}t + \frac{a+b}{2}$, $dx = \frac{b-a}{2}dt$를 적용합니다.
3가지 방법으로 같은 적분 풀기 — $\int_0^{\pi} \sin(x)\,dx$
정확한 값: $\int_0^{\pi}\sin(x)\,dx = [-\cos(x)]_0^{\pi} = 2$. $n = 4$ 구간($h = \pi/4 \approx 0.7854$)으로 세 방법을 비교합니다.
노드: $x_k = k\pi/4$, 함수값: $f(0)=0$, $f(\pi/4) \approx 0.7071$, $f(\pi/2)=1$, $f(3\pi/4) \approx 0.7071$, $f(\pi)=0$.
$$T_4 = \frac{\pi/4}{2}[0 + 2(0.7071 + 1 + 0.7071) + 0] = \frac{\pi}{8} \times 4.8284 \approx 1.8961$$오차: $|2 - 1.8961| = 0.1039$ — 약 5%의 오차입니다.
오차: $|2 - 2.0046| = 0.0046$ — 0.2%에 불과합니다! 사다리꼴보다 22배 더 정확합니다.
$[0, \pi]$를 $[-1, 1]$로 변환: $x = \frac{\pi}{2}t + \frac{\pi}{2}$, $dx = \frac{\pi}{2}dt$.
3점 가우스 노드와 가중치: $t_1 = -\sqrt{3/5}$, $t_2 = 0$, $t_3 = \sqrt{3/5}$, $w_1 = w_3 = 5/9$, $w_2 = 8/9$.
$$G_3 = \frac{\pi}{2}\left[\frac{5}{9}\sin\!\left(\frac{\pi}{2}(1-\sqrt{3/5})\right) + \frac{8}{9}\sin\!\left(\frac{\pi}{2}\right) + \frac{5}{9}\sin\!\left(\frac{\pi}{2}(1+\sqrt{3/5})\right)\right]$$ $$= \frac{\pi}{2}\left[\frac{5}{9}(0.3379) + \frac{8}{9}(1) + \frac{5}{9}(0.9415)\right] \approx 2.0011$$오차: $|2 - 2.0011| = 0.0011$ — 단 3개의 노드만으로 심프슨(4구간)보다 더 정확합니다!
수치 적분 방법 비교
| 방법 | 오차 차수 | 정확하게 적분 가능한 최대 다항식 차수 | $\int_0^{\pi}\sin x\,dx$ 오차 |
|---|---|---|---|
| 사다리꼴 ($n=4$) | $O(h^2)$ | 1차 | $0.1039$ |
| 심프슨 ($n=4$) | $O(h^4)$ | 3차 | $0.0046$ |
| 가우스 ($n=3$ 노드) | $O(h^{2n})$ | $2n-1$차 | $0.0011$ |
복합 구적법과 롬버그 적분
롬버그 적분(Romberg Integration)은 사다리꼴 공식에 리처드슨 외삽을 반복 적용하여 고정밀 결과를 얻는 방법입니다.
$$R(n, 0) = T_{2^n} \quad (\text{사다리꼴 공식})$$ $$R(n, m) = \frac{4^m R(n, m-1) - R(n-1, m-1)}{4^m - 1}$$$R(1, 1)$은 심프슨 공식과 동일하며, $R(2, 2)$는 부울(Boole) 공식에 대응합니다.
상미분방정식의 수치해법
초기값 문제 $y' = f(t, y)$, $y(t_0) = y_0$를 수치적으로 풀 때, 시간 스텝 $h$로 이산화하여 $y_n \approx y(t_n)$을 구합니다.
전진 오일러 방법 (Forward/Explicit Euler)
가장 간단한 방법으로, 현재 점에서의 기울기로 다음 값을 예측합니다.
$$\boxed{y_{n+1} = y_n + h f(t_n, y_n)}$$오차: 국소 절단 오차 $O(h^2)$, 전역 오차 $O(h)$ — 1차 방법입니다.
예시: $y' = -2y$, $y(0) = 1$ (해석해: $y = e^{-2t}$)을 $h = 0.1$로 풀면
$$y_1 = y_0 + 0.1 \cdot (-2 \cdot 1) = 0.8 \quad (\text{정확값: } e^{-0.2} \approx 0.8187)$$후진 오일러 방법 (Backward/Implicit Euler)
다음 점에서의 기울기를 사용합니다 (음함수 방법).
$$\boxed{y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})}$$매 스텝에서 비선형 방정식을 풀어야 하지만, 강성(stiff) 방정식에 대해 훨씬 안정적입니다.
개선된 오일러 방법 (Heun's Method / Modified Euler)
예측-수정(Predictor-Corrector) 접근법입니다.
$$\tilde{y}_{n+1} = y_n + h f(t_n, y_n) \quad (\text{예측})$$ $$y_{n+1} = y_n + \frac{h}{2}[f(t_n, y_n) + f(t_{n+1}, \tilde{y}_{n+1})] \quad (\text{수정})$$이는 2차 룽게-쿠타 방법의 한 형태이며, 전역 오차는 $O(h^2)$입니다.
4차 룽게-쿠타 방법 (RK4)
가장 널리 사용되는 방법으로, 정확도와 효율의 균형이 뛰어납니다.
$$\boxed{\begin{aligned} k_1 &= f(t_n, \; y_n) \\ k_2 &= f\!\left(t_n + \tfrac{h}{2}, \; y_n + \tfrac{h}{2}k_1\right) \\ k_3 &= f\!\left(t_n + \tfrac{h}{2}, \; y_n + \tfrac{h}{2}k_2\right) \\ k_4 &= f(t_n + h, \; y_n + hk_3) \\[6pt] y_{n+1} &= y_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) \end{aligned}}$$오차: 국소 절단 오차 $O(h^5)$, 전역 오차 $O(h^4)$. 매 스텝에서 함수 평가 4회가 필요합니다.
예시: $y' = -2y$, $y(0) = 1$을 $h = 0.1$로 RK4 적용:
| 단계 | 값 |
|---|---|
| $k_1$ | $f(0, 1) = -2$ |
| $k_2$ | $f(0.05, 1 + 0.05 \cdot (-2)) = f(0.05, 0.9) = -1.8$ |
| $k_3$ | $f(0.05, 1 + 0.05 \cdot (-1.8)) = f(0.05, 0.91) = -1.82$ |
| $k_4$ | $f(0.1, 1 + 0.1 \cdot (-1.82)) = f(0.1, 0.818) = -1.636$ |
| $y_1$ | $1 + \frac{0.1}{6}(-2 + 2(-1.8) + 2(-1.82) + (-1.636)) \approx 0.81873$ |
정확값 $e^{-0.2} \approx 0.81873$과 소수점 이하 5자리까지 일치합니다.
4가지 방법으로 같은 ODE 풀기 — $y' = -2y$, $y(0) = 1$
해석해: $y(t) = e^{-2t}$. $h = 0.5$로 $t = 0$부터 $t = 2$까지 각 방법의 결과를 비교합니다.
| $t$ | 정확값 | 오일러 | 개선된 오일러(RK2) | RK4 |
|---|---|---|---|---|
| $0.0$ | $1.0000$ | $1.0000$ | $1.0000$ | $1.0000$ |
| $0.5$ | $0.3679$ | $0.0000$ | $0.2500$ | $0.3672$ |
| $1.0$ | $0.1353$ | $0.0000$ | $0.0625$ | $0.1350$ |
| $1.5$ | $0.0498$ | $0.0000$ | $0.0156$ | $0.0497$ |
| $2.0$ | $0.0183$ | $0.0000$ | $0.0039$ | $0.0183$ |
적응적 스텝 크기 제어 (Adaptive Step Size)
고정 스텝 크기 대신, 국소 오차 추정에 따라 스텝 크기를 자동 조절하는 방법입니다.
임베디드 룽게-쿠타 방법 (RK45 / Dormand-Prince): 같은 $k_i$ 계산으로 4차와 5차 근사를 동시에 구합니다.
$$y_{n+1}^{(4)} = y_n + h\sum_{i=1}^{s} b_i k_i, \quad y_{n+1}^{(5)} = y_n + h\sum_{i=1}^{s} b_i^* k_i$$두 근사의 차이로 국소 오차를 추정합니다.
$$\text{err} = \|y_{n+1}^{(5)} - y_{n+1}^{(4)}\|$$스텝 크기 조절:
$$h_{\text{new}} = h \cdot \min\!\left(h_{\max}, \; \max\!\left(h_{\min}, \; 0.9 \left(\frac{\text{tol}}{\text{err}}\right)^{1/5}\right)\right)$$- $\text{err} > \text{tol}$이면 현재 스텝을 거부하고 $h$를 줄여 재계산
- $\text{err} \leq \text{tol}$이면 현재 스텝을 수용하고 $h$를 키울 수 있음
장점: 해가 급변하는 구간에서는 스텝을 줄이고, 완만한 구간에서는 키움으로써 효율성과 정확도를 동시에 확보합니다.
다단계 방법 (Multistep Methods)
이전 여러 스텝의 정보를 활용하여 다음 값을 예측합니다.
아담스-배쉬포스 2단계 (Adams-Bashforth 2-step, AB2):
$$y_{n+2} = y_{n+1} + \frac{h}{2}[3f(t_{n+1}, y_{n+1}) - f(t_n, y_n)]$$양함수 방법이며 스텝당 함수 평가 1회입니다. 전역 오차 $O(h^2)$.
아담스-멀턴 2단계 (Adams-Moulton 2-step, AM2) — 사다리꼴 방법:
$$y_{n+1} = y_n + \frac{h}{2}[f(t_{n+1}, y_{n+1}) + f(t_n, y_n)]$$음함수 방법이며 전역 오차 $O(h^2)$이지만, 안정성이 월등합니다.
ODE 수치해법 비교
| 방법 | 차수 | 함수 평가/스텝 | 양함수/음함수 | 안정성 |
|---|---|---|---|---|
| 전진 오일러 | 1 | 1 | 양함수 | 조건부 안정 |
| 후진 오일러 | 1 | 1 (+ 비선형 풀이) | 음함수 | A-안정 |
| 개선된 오일러 | 2 | 2 | 양함수 | 조건부 안정 |
| RK4 | 4 | 4 | 양함수 | 조건부 안정 |
| RK45 (적응적) | 4~5 | 6 | 양함수 | 조건부 안정 + 오차 제어 |
| AB2 | 2 | 1 | 양함수 | 조건부 안정 |
| AM2 | 2 | 1 (+ 비선형 풀이) | 음함수 | A-안정 |
강성 방정식 (Stiff Equations)
해 자체는 완만하게 변하지만, 시스템의 고유값 비율이 극단적으로 큰 경우를 강성(stiff) 문제라 합니다.
$$\text{강성비} = \frac{\max|\lambda_i|}{\min|\lambda_i|} \gg 1$$강성 문제에서 양함수 방법은 안정성을 위해 매우 작은 $h$를 사용해야 하므로 비효율적입니다. 음함수 방법(후진 오일러, BDF 등)이나 특수 설계된 방법(DIRK, SDIRK)을 사용해야 합니다.
선형계의 수치 해법
$A\mathbf{x} = \mathbf{b}$ ($A$는 $n \times n$ 행렬)를 수치적으로 풀 때, 크게 직접법과 반복법으로 나뉩니다.
"사과 2개와 귤 3개의 값이 3,000원이고, 사과 1개와 귤 2개의 값이 1,800원입니다. 사과와 귤의 개당 가격은?" 이런 문제가 연립방정식입니다. 미지수가 2~3개일 때는 손으로 풀 수 있지만, 현실 문제에서는 수만~수억 개의 미지수가 등장합니다. 이때 컴퓨터로 효율적이고 안정적으로 푸는 방법이 필요합니다.
가우스 소거법 (Gaussian Elimination)
행렬을 상삼각 형태로 변환한 후 후진 대입(back substitution)으로 해를 구합니다.
연산 횟수: $\frac{2}{3}n^3 + O(n^2)$ — $O(n^3)$
다음 연립방정식을 풀어 봅시다.
$$\begin{cases} 2x + y - z = 8 \\ -3x - y + 2z = -11 \\ -2x + y + 2z = -3 \end{cases}$$1단계 — 확대 행렬 구성:
$$\left(\begin{array}{ccc|c} 2 & 1 & -1 & 8 \\ -3 & -1 & 2 & -11 \\ -2 & 1 & 2 & -3 \end{array}\right)$$2단계 — 전방 소거 (상삼각 형태 만들기):
- $R_2 \leftarrow R_2 + \frac{3}{2}R_1$: 2행의 첫 번째 원소를 0으로 만듭니다.
- $R_3 \leftarrow R_3 + R_1$: 3행의 첫 번째 원소를 0으로 만듭니다.
- 계속 소거하여 상삼각 형태를 만듭니다.
3단계 — 후진 대입: 마지막 행부터 역순으로 미지수를 구합니다.
결과: $x = 2$, $y = 3$, $z = -1$
부분 피벗팅 (Partial Pivoting): 각 단계에서 현재 열의 아래쪽 원소 중 절대값이 가장 큰 것을 피벗으로 선택합니다. 이는 수치적 안정성을 위해 필수적입니다.
부분 피벗팅이 필요한 이유: 피벗이 0에 가까우면 소거 과정에서 곱해지는 수가 매우 커져 반올림 오차가 증폭됩니다. 예를 들어,
$$\begin{pmatrix} 10^{-20} & 1 \\ 1 & 1 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} 1 \\ 2 \end{pmatrix}$$피벗팅 없이 풀면 유한 정밀도에서 $x_2 \approx 1$, $x_1 \approx 0$을 얻지만, 행을 교환하면 정확한 답 $x_1 \approx 1$, $x_2 \approx 1$을 얻습니다.
LU 분해
$A = LU$ (또는 피벗팅 포함 $PA = LU$)로 분해하면, $A\mathbf{x} = \mathbf{b}$를 두 단계로 풀 수 있습니다.
- 전진 대입: $L\mathbf{y} = \mathbf{b}$를 풀어 $\mathbf{y}$ 구함 — $O(n^2)$
- 후진 대입: $U\mathbf{x} = \mathbf{y}$를 풀어 $\mathbf{x}$ 구함 — $O(n^2)$
분해 자체는 $O(n^3)$이지만, 한 번 분해하면 여러 우변 $\mathbf{b}$에 대해 $O(n^2)$으로 풀 수 있습니다.
촐레스키 분해: $A$가 대칭 양의 정부호(SPD)이면 $A = LL^T$로 분해 가능하며, 연산량이 LU 분해의 약 절반($\frac{1}{3}n^3$)입니다.
반복법
대규모 희소 행렬에서 직접법은 비효율적일 수 있으므로, 반복법이 선호됩니다. $A = D - L - U$ (대각, 엄격한 하삼각, 엄격한 상삼각)로 분할합니다.
야코비 반복법 (Jacobi Method)
$$\mathbf{x}^{(k+1)} = D^{-1}(L + U)\mathbf{x}^{(k)} + D^{-1}\mathbf{b}$$성분별로 쓰면:
$$x_i^{(k+1)} = \frac{1}{a_{ii}}\left(b_i - \sum_{\substack{j=1 \\ j \neq i}}^{n} a_{ij}x_j^{(k)}\right)$$특징: 각 성분을 독립적으로 계산하므로 병렬화가 용이합니다.
가우스-자이델 반복법 (Gauss-Seidel Method)
$$\mathbf{x}^{(k+1)} = (D - L)^{-1}U\mathbf{x}^{(k)} + (D - L)^{-1}\mathbf{b}$$성분별로 쓰면:
$$x_i^{(k+1)} = \frac{1}{a_{ii}}\left(b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{(k+1)} - \sum_{j=i+1}^{n} a_{ij}x_j^{(k)}\right)$$이미 갱신된 $x_j^{(k+1)}$을 즉시 사용하므로 야코비보다 일반적으로 빠르게 수렴합니다.
SOR (Successive Over-Relaxation)
가우스-자이델에 이완 계수 $\omega$를 도입하여 수렴을 가속합니다.
$$x_i^{(k+1)} = (1 - \omega)x_i^{(k)} + \frac{\omega}{a_{ii}}\left(b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{(k+1)} - \sum_{j=i+1}^{n} a_{ij}x_j^{(k)}\right)$$- $\omega = 1$: 가우스-자이델과 동일
- $1 < \omega < 2$: 과이완 (overrelaxation) — 수렴 가속
- $0 < \omega < 1$: 저이완 (underrelaxation) — 발산하는 경우 안정화
최적 $\omega$를 찾으면 수렴 속도가 크게 향상되지만, 최적값은 문제에 의존합니다.
수렴 조건:
| 조건 | 야코비 | 가우스-자이델 | SOR |
|---|---|---|---|
| 엄격한 대각 우세 | 수렴 | 수렴 | $0 < \omega \leq 1$에서 수렴 |
| 대칭 양의 정부호 | — | 수렴 | $0 < \omega < 2$에서 수렴 |
| 스펙트럼 반경 $\rho(T) < 1$ | 반복 행렬 $T$의 스펙트럼 반경이 1 미만이면 수렴 | ||
직접법 vs 반복법 — 같은 시스템으로 비교
다음 시스템을 직접법(LU 분해)과 반복법(야코비, 가우스-자이델)으로 풀어 비교합니다.
$$\begin{pmatrix} 4 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 4 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix} = \begin{pmatrix} 15 \\ 10 \\ 10 \end{pmatrix}$$정확한 해: $x_1 = 5$, $x_2 = 5$, $x_3 = \frac{15}{4} = 3.75$.
$A = LU$로 분해하면:
$$L = \begin{pmatrix} 1 & 0 & 0 \\ -1/4 & 1 & 0 \\ 0 & -4/15 & 1 \end{pmatrix}, \quad U = \begin{pmatrix} 4 & -1 & 0 \\ 0 & 15/4 & -1 \\ 0 & 0 & 56/15 \end{pmatrix}$$$L\mathbf{y} = \mathbf{b}$를 전진 대입, $U\mathbf{x} = \mathbf{y}$를 후진 대입으로 풀면 정확한 해를 (반올림 오차 제외) 얻습니다.
| 반복 | $x_1$ | $x_2$ | $x_3$ | $\|\mathbf{x}^{(k)} - \mathbf{x}^*\|_\infty$ |
|---|---|---|---|---|
| 0 | $0$ | $0$ | $0$ | $5.000$ |
| 1 | $3.750$ | $2.500$ | $2.500$ | $2.500$ |
| 2 | $4.375$ | $4.063$ | $3.125$ | $0.937$ |
| 3 | $4.766$ | $4.625$ | $3.516$ | $0.375$ |
| 5 | $4.955$ | $4.934$ | $3.707$ | $0.066$ |
| 10 | $4.999$ | $4.999$ | $3.749$ | $0.001$ |
| 반복 | $x_1$ | $x_2$ | $x_3$ | $\|\mathbf{x}^{(k)} - \mathbf{x}^*\|_\infty$ |
|---|---|---|---|---|
| 0 | $0$ | $0$ | $0$ | $5.000$ |
| 1 | $3.750$ | $3.438$ | $3.359$ | $1.562$ |
| 2 | $4.609$ | $4.492$ | $3.623$ | $0.508$ |
| 3 | $4.873$ | $4.874$ | $3.718$ | $0.127$ |
| 5 | $4.992$ | $4.993$ | $3.748$ | $0.008$ |
가우스-자이델은 5회 반복으로 야코비 10회와 비슷한 정확도를 달성합니다.
선형계 해법 비교 요약
| 방법 | 연산 복잡도 | 메모리 | 적합한 문제 |
|---|---|---|---|
| 가우스 소거/LU | $O(n^3)$ | $O(n^2)$ | 소~중규모 밀집 행렬 |
| 콜레스키 | $O(n^3/3)$ | $O(n^2)$ | 대칭 양의 정부호 행렬 |
| 야코비 | 스텝당 $O(n^2)$ | $O(n)$ | 대규모 희소, 병렬 환경 |
| 가우스-자이델 | 스텝당 $O(n^2)$ | $O(n)$ | 대규모 희소, 순차 환경 |
| SOR | 스텝당 $O(n^2)$ | $O(n)$ | 최적 $\omega$ 알 때 |
| 켤레 기울기법(CG) | 스텝당 $O(\text{nnz})$ | $O(n)$ | SPD 희소 행렬 |
켤레 기울기법 (Conjugate Gradient Method)
대칭 양의 정부호(SPD) 행렬에 대한 가장 효율적인 반복법입니다. $A\mathbf{x} = \mathbf{b}$를 이차 함수 $\phi(\mathbf{x}) = \frac{1}{2}\mathbf{x}^T A\mathbf{x} - \mathbf{b}^T\mathbf{x}$의 최솟값 문제로 봅니다.
알고리즘:
- $\mathbf{r}_0 = \mathbf{b} - A\mathbf{x}_0$, $\mathbf{p}_0 = \mathbf{r}_0$
- $\alpha_k = \frac{\mathbf{r}_k^T \mathbf{r}_k}{\mathbf{p}_k^T A \mathbf{p}_k}$
- $\mathbf{x}_{k+1} = \mathbf{x}_k + \alpha_k \mathbf{p}_k$
- $\mathbf{r}_{k+1} = \mathbf{r}_k - \alpha_k A \mathbf{p}_k$
- $\beta_k = \frac{\mathbf{r}_{k+1}^T \mathbf{r}_{k+1}}{\mathbf{r}_k^T \mathbf{r}_k}$
- $\mathbf{p}_{k+1} = \mathbf{r}_{k+1} + \beta_k \mathbf{p}_k$
정확한 산술에서는 최대 $n$번 반복으로 정확한 해를 구합니다. 수렴 속도는 조건수에 의존합니다.
$$\frac{\|\mathbf{x}_k - \mathbf{x}^*\|_A}{\|\mathbf{x}_0 - \mathbf{x}^*\|_A} \leq 2\left(\frac{\sqrt{\kappa} - 1}{\sqrt{\kappa} + 1}\right)^k$$고유값 계산
행렬 $A$의 고유값과 고유벡터를 수치적으로 구하는 방법입니다.
거듭제곱법 (Power Method)
절대값이 가장 큰 고유값(지배적 고유값, dominant eigenvalue) $\lambda_1$과 대응 고유벡터를 구합니다.
알고리즘:
- 임의의 초기 벡터 $\mathbf{v}^{(0)}$ 선택 (영벡터가 아닌)
- $\mathbf{w}^{(k+1)} = A\mathbf{v}^{(k)}$
- $\mathbf{v}^{(k+1)} = \frac{\mathbf{w}^{(k+1)}}{\|\mathbf{w}^{(k+1)}\|}$ (정규화)
- 고유값 근사: $\lambda \approx \frac{(\mathbf{v}^{(k+1)})^T A \mathbf{v}^{(k+1)}}{(\mathbf{v}^{(k+1)})^T \mathbf{v}^{(k+1)}}$ (레일리 몫)
수렴: $|\lambda_1| > |\lambda_2| \geq \cdots \geq |\lambda_n|$이면 수렴하며, 수렴 속도는 $\left|\frac{\lambda_2}{\lambda_1}\right|^k$에 비례합니다. $|\lambda_2/\lambda_1|$이 1에 가까우면 수렴이 느립니다.
역거듭제곱법 (Inverse Power Method): $A^{-1}$에 거듭제곱법을 적용하면, 절대값이 가장 작은 고유값을 구합니다. 이동(shift) $\sigma$를 도입하여 $(A - \sigma I)^{-1}$에 적용하면 $\sigma$에 가장 가까운 고유값을 구할 수 있습니다.
$$\text{역거듭제곱법 (이동 포함):} \quad (A - \sigma I)\mathbf{w}^{(k+1)} = \mathbf{v}^{(k)}, \quad \mathbf{v}^{(k+1)} = \frac{\mathbf{w}^{(k+1)}}{\|\mathbf{w}^{(k+1)}\|}$$역멱법 (Inverse Power Method)
$A^{-1}$에 거듭제곱법을 적용하여 절대값이 가장 작은 고유값을 구합니다. 실제로는 역행렬을 구하지 않고, 매 반복에서 선형 시스템 $A\mathbf{w}^{(k+1)} = \mathbf{v}^{(k)}$를 풉니다.
이동이 있는 역멱법 (Shifted Inverse Iteration): 대략적인 고유값 추정 $\sigma$가 있을 때, $(A - \sigma I)^{-1}$에 거듭제곱법을 적용하면 $\sigma$에 가장 가까운 고유값에 빠르게 수렴합니다.
$$\text{수렴 속도} \sim \left|\frac{\lambda_{\text{target}} - \sigma}{\lambda_{\text{next}} - \sigma}\right|^k$$$\sigma$가 정확할수록 수렴이 빨라지며, 레일리 몫 반복법에서는 매 반복마다 $\sigma$를 갱신하여 3차 수렴까지 달성할 수 있습니다.
QR 알고리즘
모든 고유값을 동시에 구하는 가장 강력한 방법입니다.
기본 QR 반복:
- $A_0 = A$
- $A_k = Q_k R_k$ (QR 분해)
- $A_{k+1} = R_k Q_k$ ($= Q_k^T A_k Q_k$, 닮음 변환이므로 고유값 보존)
$A_k$는 상삼각 행렬(슈어 형태)로 수렴하며, 대각 원소가 고유값이 됩니다.
실용적 개선:
- 이동 (Shift): $A_k - \sigma_k I = Q_k R_k$, $A_{k+1} = R_k Q_k + \sigma_k I$로 수렴을 가속합니다. 윌킨슨 이동(Wilkinson shift)은 3차 수렴을 보장합니다.
- 하이센베르크 축약: 먼저 $A$를 상하이센베르크 형태 $H$로 변환($O(n^3)$)하여 이후 각 QR 반복을 $O(n^2)$으로 줄입니다.
- 묵시적 QR 이동 (Implicit QR Shift): 명시적 QR 분해 없이 하이센베르크 형태를 유지하며 연산합니다.
고유값 수치 계산 비교
| 방법 | 구하는 고유값 | 수렴 속도 | 연산 복잡도 |
|---|---|---|---|
| 멱법 | 지배적 고유값 1개 | $|\lambda_2/\lambda_1|^k$ | 스텝당 $O(n^2)$ |
| 역멱법 | 최소 고유값 1개 | $|\lambda_{n-1}/\lambda_n|^k$ | 스텝당 $O(n^2)$ + LU |
| 이동 역멱법 | $\sigma$에 가장 가까운 1개 | 매우 빠름 | 스텝당 $O(n^2)$ + LU |
| QR 알고리즘 | 모든 고유값 | 3차 (이동 사용 시) | 총 $O(n^3)$ |
$A = \begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix}$, $\mathbf{v}^{(0)} = (1, 1)^T$.
고유값은 $\lambda_1 = \frac{5+\sqrt{5}}{2} \approx 3.618$, $\lambda_2 = \frac{5-\sqrt{5}}{2} \approx 1.382$입니다.
| $k$ | $A\mathbf{v}^{(k)}$ | $\mathbf{v}^{(k+1)}$ (정규화) | 레일리 몫 |
|---|---|---|---|
| 0 | $(3, 4)^T$ | $(0.600, 0.800)^T$ | $3.400$ |
| 1 | $(2.000, 3.000)^T$ | $(0.555, 0.832)^T$ | $3.600$ |
| 2 | $(1.942, 2.951)^T$ | $(0.549, 0.836)^T$ | $3.615$ |
| 3 | $(1.934, 2.957)^T$ | $(0.547, 0.837)^T$ | $3.618$ |
3회 반복만으로 지배적 고유값 $\lambda_1 \approx 3.618$에 수렴합니다.
최소제곱 문제
과결정(overdetermined) 시스템 $A\mathbf{x} \approx \mathbf{b}$ ($A$는 $m \times n$, $m > n$)에서 잔차 $\|\mathbf{b} - A\mathbf{x}\|_2$를 최소화하는 $\mathbf{x}$를 구합니다.
실험에서 여러 데이터 점이 주어졌을 때, 모든 점을 정확히 지나는 직선은 존재하지 않을 수 있습니다. 대신 각 점까지의 "거리(오차)"의 제곱합을 최소화하는 직선을 찾는 것이 최소제곱법입니다. 회귀 분석, 곡선 맞춤(curve fitting) 등 데이터 분석의 근간이 됩니다.
정규방정식 (Normal Equations)
$$\boxed{A^T A \mathbf{x} = A^T \mathbf{b}}$$$A^T A$가 양의 정부호이면 콜레스키 분해로 풀 수 있습니다.
문제점: $\kappa(A^T A) = \kappa(A)^2$이므로, $A$의 조건수가 크면 정규방정식은 수치적으로 불안정합니다.
QR 분해를 이용한 최소제곱
$A = QR$ (얇은 QR 분해)로 놓으면 최소제곱 해는
$$R\mathbf{x} = Q^T \mathbf{b}$$$R$이 상삼각이므로 후진 대입으로 풀 수 있습니다. 조건수가 $\kappa(R) = \kappa(A)$이므로 정규방정식보다 안정적입니다.
특이값 분해(SVD)를 이용한 최소제곱
$A = U\Sigma V^T$로 분해하면 최소제곱 해는
$$\mathbf{x} = V\Sigma^+ U^T \mathbf{b}$$여기서 $\Sigma^+$는 $\Sigma$의 유사역행렬(nonzero 대각 원소의 역수)입니다.
SVD의 장점:
- 랭크 결핍(rank-deficient) 문제도 안정적으로 처리
- 최소 노름 해를 자동으로 제공
- 특이값을 통해 문제의 조건수와 유효 랭크를 직접 파악 가능
최소제곱 풀이법 비교
| 방법 | 연산 복잡도 | 수치 안정성 | 랭크 결핍 처리 |
|---|---|---|---|
| 정규방정식 ($A^TA$) | $O(mn^2 + n^3/3)$ | 낮음 ($\kappa^2$) | 불가 |
| QR 분해 | $O(2mn^2)$ | 높음 ($\kappa$) | 제한적 |
| SVD | $O(2mn^2 + 11n^3)$ | 가장 높음 | 완전 처리 |
데이터 $(1, 2.1)$, $(2, 3.9)$, $(3, 6.2)$, $(4, 7.8)$에 $y = c_1 + c_2 x$를 맞춥니다.
$$A = \begin{pmatrix} 1 & 1 \\ 1 & 2 \\ 1 & 3 \\ 1 & 4 \end{pmatrix}, \quad \mathbf{b} = \begin{pmatrix} 2.1 \\ 3.9 \\ 6.2 \\ 7.8 \end{pmatrix}$$정규방정식: $A^T A = \begin{pmatrix} 4 & 10 \\ 10 & 30 \end{pmatrix}$, $A^T\mathbf{b} = \begin{pmatrix} 20.0 \\ 56.9 \end{pmatrix}$
풀이: $c_1 = 0.05$, $c_2 = 1.96$. 따라서 $y \approx 0.05 + 1.96x$.
이산 푸리에 변환과 FFT
이산 푸리에 변환(DFT)은 이산 신호를 주파수 성분으로 분해합니다. 고속 푸리에 변환(FFT)은 DFT를 효율적으로 계산하는 알고리즘입니다.
이산 푸리에 변환 (DFT)
$N$개의 데이터 $\{x_0, x_1, \ldots, x_{N-1}\}$에 대해
$$\boxed{X_k = \sum_{n=0}^{N-1} x_n \, e^{-2\pi i \, kn/N}, \quad k = 0, 1, \ldots, N-1}$$역변환:
$$x_n = \frac{1}{N}\sum_{k=0}^{N-1} X_k \, e^{2\pi i \, kn/N}$$직접 계산하면 $O(N^2)$의 복소수 곱셈이 필요합니다.
FFT (Fast Fourier Transform) — 쿨리-튜키 알고리즘
$N = 2^m$일 때, DFT를 짝수 인덱스와 홀수 인덱스로 분할하여 재귀적으로 계산합니다.
$$X_k = \underbrace{\sum_{j=0}^{N/2-1} x_{2j} \, \omega^{2jk}}_{E_k \;(\text{짝수 부분})} + \omega^k \underbrace{\sum_{j=0}^{N/2-1} x_{2j+1} \, \omega^{2jk}}_{O_k \;(\text{홀수 부분})}$$여기서 $\omega = e^{-2\pi i/N}$은 $N$차 단위근입니다.
나비(Butterfly) 연산:
$$X_k = E_k + \omega^k O_k, \quad X_{k+N/2} = E_k - \omega^k O_k$$이 분할-정복에 의해 연산 복잡도가 $O(N \log N)$으로 줄어듭니다.
| $N$ | DFT ($N^2$) | FFT ($N \log_2 N$) | 가속비 |
|---|---|---|---|
| $2^{10} = 1024$ | $1{,}048{,}576$ | $10{,}240$ | $\approx 100\times$ |
| $2^{20} \approx 10^6$ | $\approx 10^{12}$ | $\approx 2 \times 10^7$ | $\approx 50{,}000\times$ |
오차 분석 심화
수치 알고리즘의 신뢰성을 평가하기 위해 오차를 체계적으로 분석하는 심화 내용입니다.
전방 오차 분석 vs 후방 오차 분석
전방 오차 분석(Forward Error Analysis)은 각 연산 단계에서 발생하는 반올림 오차를 추적하여 최종 오차의 상한을 구합니다. 비관적인 상한을 주지만 실제 오차보다 크게 과대평가하는 경향이 있습니다.
후방 오차 분석(Backward Error Analysis)은 윌킨슨(Wilkinson)이 개발한 접근법으로, 계산된 결과를 약간 섭동된 입력에 대한 정확한 답으로 해석합니다.
과녁 맞추기에 비유하면, 전방 오차는 "내 화살이 과녁 중심에서 얼마나 벗어났는가?"이고, 후방 오차는 "과녁 중심을 내 화살이 꽂힌 곳으로 옮기면 얼마나 움직여야 하는가?"입니다. 알고리즘이 후방 안정하다는 것은 "과녁을 아주 조금만 옮기면 내 화살이 정중앙에 꽂힌 것이 된다"는 뜻입니다.
부동소수점 연산의 후방 오차
IEEE 754 산술에서 기본 연산의 후방 오차 모델:
$$\text{fl}(a \circ b) = (a \circ b)(1 + \delta), \quad |\delta| \leq \epsilon_{\text{mach}}, \quad \circ \in \{+, -, \times, \div\}$$이 성질을 이용하면, 복잡한 알고리즘의 후방 안정성을 체계적으로 증명할 수 있습니다.
조건수 심화 — 다양한 문제에서의 조건수
| 문제 | 조건수 | 의미 |
|---|---|---|
| $f(x) = x^n$ 의 평가 | $n$ | $n$이 클수록 민감 |
| 근 $f(x) = 0$의 단근 | $\frac{1}{|f'(x^*)|}$ | 기울기가 작으면 민감 |
| 근 $f(x) = 0$의 중근 (중복도 $m$) | $O(\epsilon^{1/m - 1})$ | 매우 민감 |
| 선형 시스템 $Ax = b$ | $\kappa(A) = \|A\|\|A^{-1}\|$ | 행렬 조건수 |
| 고유값 문제 $Ax = \lambda x$ | $\frac{1}{|\mathbf{y}^H \mathbf{x}|}$ | 좌·우 고유벡터의 각도 |
힐베르트 행렬 $H_{ij} = \frac{1}{i+j-1}$은 대표적인 악조건 행렬입니다.
| 차원 $n$ | $\kappa_2(H)$ | 잃는 유효숫자 |
|---|---|---|
| 5 | $4.8 \times 10^5$ | 약 6자리 |
| 10 | $1.6 \times 10^{13}$ | 약 13자리 |
| 15 | $\approx 10^{17}$ | 배정밀도로 풀 수 없음 |
수치 안정성의 계층
- 후방 안정 (Backward Stable): $\hat{f}(x) = f(x + \Delta x)$, $\frac{\|\Delta x\|}{\|x\|} = O(\epsilon_{\text{mach}})$ — 가장 강한 조건. 가우스 소거(부분 피벗), QR 분해 등.
- 혼합 안정 (Mixed Stable): $\hat{f}(x) + \Delta y = f(x + \Delta x)$ — 후방 안정보다 약간 느슨. 콜레스키 분해 등.
- 전방 안정 (Forward Stable): $\|\hat{f}(x) - f(x)\| = O(\epsilon_{\text{mach}} \kappa \|f(x)\|)$ — 가장 느슨. 조건수에 비례하는 오차 보장.
- 불안정 (Unstable): 오차가 조건수보다 빠르게 증폭됨. 피벗 없는 가우스 소거, 그람-슈미트 직교화(고전적 형태) 등.
수치해석 핵심 정리
| 주제 | 핵심 공식/방법 | 주요 특성 |
|---|---|---|
| 부동소수점 | $\text{fl}(x) = x(1 + \delta)$, $|\delta| \leq \frac{\epsilon_{\text{mach}}}{2}$ | 유한 정밀도의 근본 한계 |
| 오차 분석 | 전방 오차 $\leq$ 조건수 $\times$ 후방 오차 | 후방 안정성이 알고리즘 설계 목표 |
| 뉴턴법 | $x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$ | 이차 수렴 (단근) |
| 라그랑주 보간 | $P_n(x) = \sum y_i L_i(x)$ | $n+1$점 $\to$ $n$차 다항식 |
| 3차 스플라인 | 구간별 3차 다항식, $C^2$ 연속 | 룽게 현상 방지 |
| 리처드슨 외삽 | $D_{\text{imp}} = \frac{4D(h/2) - D(h)}{3}$ | 정확도 $O(h^2) \to O(h^4)$ |
| 심프슨 공식 | $\frac{h}{3}[f_0 + 4f_1 + 2f_2 + \cdots + f_n]$ | 오차 $O(h^4)$ |
| 가우스 구적법 | $\sum w_i f(x_i)$, 최적 노드 | $n$점으로 $2n-1$차 정확 |
| RK4 | $y_{n+1} = y_n + \frac{h}{6}(k_1+2k_2+2k_3+k_4)$ | 4차, 범용적 |
| 적응적 RK45 | 임베디드 4-5차 쌍 | 자동 스텝 크기 제어 |
| LU 분해 | $PA = LU$ | $O(n^3)$ 분해, $O(n^2)$ 풀이 |
| 켤레 기울기법 | $\mathbf{x}_{k+1} = \mathbf{x}_k + \alpha_k \mathbf{p}_k$ | SPD 행렬, $O(n\sqrt{\kappa})$ |
| QR 알고리즘 | $A_{k+1} = R_k Q_k$ 반복 | 모든 고유값, $O(n^3)$ |
| 거듭제곱법 | $\mathbf{v}^{(k+1)} = \frac{A\mathbf{v}^{(k)}}{\|A\mathbf{v}^{(k)}\|}$ | 지배적 고유값 |
| 최소제곱 (SVD) | $\mathbf{x} = V\Sigma^+ U^T \mathbf{b}$ | 가장 안정적, 랭크 결핍 처리 |
| FFT | 분할-정복 DFT | $O(N^2) \to O(N\log N)$ |
참고자료
- Burden, R. L. & Faires, J. D. — Numerical Analysis, Cengage
- Trefethen, L. N. & Bau, D. — Numerical Linear Algebra, SIAM
- Stoer, J. & Bulirsch, R. — Introduction to Numerical Analysis, Springer
- Golub, G. H. & Van Loan, C. F. — Matrix Computations, Johns Hopkins
- 미적분학 — 수치 적분의 이론적 배경
- 선형대수학 — 선형계의 이론, 고유값 이론
- 미분방정식 — ODE의 수치적 풀이