콘텐츠로 이동

1부 수학 기초 1.12

수치해석

1부의 앞 열한 장은 전부 닫힌 해를 찾는 이야기였다. 적분을 손으로 하고, 급수를 전개하고, 변수를 분리해 고유함수를 얻었다. 그런데 반도체 소자 하나를 앞에 놓으면 그 방법이 거의 다 막힌다. 도핑이 위치마다 다르고, 이동도가 전기장에 따라 변하고, 캐리어 농도가 퍼텐셜의 지수함수라서, 푸아송 방정식 하나조차 닫힌 해가 없다. 그 자리에서 쓰는 것이 이 장이다.

수치해석이 하는 일은 딱 하나다 — 연속을 이산으로 바꾸고, 그때 무엇을 잃는지 잰다. 함수를 점 몇 개로, 미분을 차분으로, 적분을 합으로, 무한 반복을 유한 반복으로 바꾼다. 바꾸는 것 자체는 쉽다. 어려운 것은 바꾼 뒤에 남는 두 질문이다.

  • 얼마나 틀리는가. 이산화가 만든 오차(절단 오차)와 컴퓨터가 만든 오차(반올림 오차)가 따로 있고, 둘은 반대 방향으로 움직인다. 한쪽을 줄이면 다른 쪽이 커진다.
  • 믿어도 되는가. 답이 나왔다고 해서 맞는 답이 아니다. 반복이 엉뚱한 곳으로 수렴하거나, 시간 전진이 폭발하거나, 조건이 나쁜 문제라 입력의 미세한 흔들림이 답을 통째로 바꿀 수 있다.

이 장의 열네 절은 모두 이 두 질문의 변주다. 1절에서 오차의 종류를 나눈 뒤, 2절부터 9절까지는 정적인 문제 — 방정식 풀기, 함수 근사, 적분, 선형계, 고유값 — 를, 10절부터 12절까지는 시간이 흐르는 문제 — ODE와 PDE — 를 다룬다. 13절은 소자·전자기 시뮬레이터가 실제로 쓰는 두 이산화 방식(유한요소법·모멘트법)의 뼈대이고, 14절은 “가장 좋은 파라미터를 찾는” 최적화다.

이 장이 반도체 어디로 이어지는지 미리 적어 둔다. 소자 시뮬레이터(TCAD)는 푸아송·연속 방정식을 격자에서 이산화하고(11·12절) 뉴턴법으로 비선형계를 풀며(2절) 그때 나오는 희소 선형계를 LU나 반복법으로 처리한다(5·6절). 회로 시뮬레이터(SPICE)는 강성 ODE를 암시적으로 적분하고(10절), 소자 모델의 파라미터는 최소제곱으로 추출하며(8절·14절), 밴드 구조는 큰 에르미트 행렬의 고유값을 반복법으로 구한다(9절). 공정 시뮬레이션의 확산은 포물형 PDE(12절), 배선 기생 커패시턴스는 모멘트법(13절), 기계적 응력은 유한요소법(13절)이다. 뒤의 장들이 “수치적으로 푼다”고 한 줄로 넘기는 자리마다 이 장의 절 하나가 들어 있다.

수치해석은 다른 장보다 기호가 재활용된다. 같은 글자가 절마다 다른 뜻으로 쓰이는 자리가 많아서, 처음에 한 번 정리해 두고 절이 바뀔 때마다 다시 못박는다.

기호읽는 법무엇을 가리키는가절
a, a~a,\ \tilde a참값 · 근삿값물결표(틸데)가 붙으면 계산된 값전체
ε\varepsilon오차ε=a−a~\varepsilon = a - \tilde a (참값 − 근삿값)1
εr\varepsilon_r상대 오차ε/a\varepsilon / a1
uu반올림 단위부동소수점 한 번의 상대 오차 상한. 배정도에서 1.1×10−161.1 \times 10^{-16}1
hh걸음 폭독립 변수(대개 xx)의 격자 간격3–12
kk시간 걸음 폭 Δt\Delta t (11·12절) · 스플라인의 기울기 kjk_j (3절) · 룽게–쿠타의 기울기 k1…k4k_1 \ldots k_4 (10절)3·10–12
xn, ynx_n,\ y_n아래첨자 nn스칼라 반복·걸음의 nn번째 값2·10
x(m)\mathbf{x}^{(m)}위첨자 (m)(m)벡터 반복의 mm번째 값. 성분 인덱스와 겹치지 않게 위로 올린다6·9
uiju_{ij}격자점 (xi, yj)(x_i,\ y_j) 또는 (xi, tj)(x_i,\ t_j)에서의 근사값11·12
pn(x)p_n(x)nn차 보간 다항식3
Lk(x)L_k(x)라그랑주 기저kk번째 마디에서 1, 나머지에서 0인 다항식3
f[x0,x1]f[x_0, x_1]분할 차분(f(x1)−f(x0))/(x1−x0)\bigl(f(x_1) - f(x_0)\bigr)/(x_1 - x_0)3
ξ\xi크시오차 공식에 나오는 위치를 모르는 점. 구간 안 어딘가3·4
L, UL,\ U하삼각 · 상삼각 행렬. A=LUA = LU5
∥⋅∥\lVert \cdot \rVert노름벡터·행렬의 크기. 아래첨자 1, 2, ∞1,\ 2,\ \infty가 종류7
κ(A)\kappa(A)조건수∥A∥ ∥A−1∥\lVert A \rVert\, \lVert A^{-1} \rVert7
r\mathbf{r}잔차b−Ax~\mathbf{b} - A\tilde{\mathbf{x}}. 굵은 글자7
r, r∗r,\ r^{*}격자비포물형 c2k/h2c^2 k / h^2 · 쌍곡형 c2k2/h2c^2 k^2 / h^2. 굵지 않은 스칼라12
ρ(C)\rho(C)스펙트럼 반지름반복 행렬 CC의 고유값 절댓값 최대. 수렴의 척도6·9
ω\omega오메가과완화 계수(SOR). 이 장에서는 각진동수가 아니다6
λ\lambda람다고유값 (1.3과 같다)9·10
qq레일리 몫 xTAx/xTx\mathbf{x}^{\mathsf{T}}A\mathbf{x} / \mathbf{x}^{\mathsf{T}}\mathbf{x}. 이 장에서는 전하가 아니다9
JJ야코비 행렬∂Fi/∂xj\partial F_i / \partial x_j. 벡터 뉴턴법의 도함수2·8·14
∇f\nabla f기울기1.1과 같다 — 후진 차분 기호로는 쓰지 않는다14

수치 계산의 답이 참값과 다른 이유는 세 층으로 나뉜다.

  1. 모델링 오차. 물리를 수식으로 옮길 때 이미 버린 것. 이동도를 상수로 놓았다면 그 순간부터 답은 실제 소자와 다르다. 수치해석의 대상이 아니다 — 이 층은 물리가 책임진다.
  2. 절단 오차(truncation error). 무한을 유한으로 자를 때 생긴다. 테일러 급수를 몇 항에서 끊고, 적분을 유한 합으로 바꾸고, 미분을 차분으로 바꾸는 순간 생긴다. 이산화 오차라고도 한다. 걸음 폭 hh를 줄이면 준다.
  3. 반올림 오차(round-off error). 컴퓨터가 실수를 유한 자릿수로만 저장하기 때문에 생긴다. 연산 한 번마다 조금씩 쌓인다. hh를 줄이면 연산 횟수가 늘어 오히려 커진다.

이 장의 방법들은 전부 2번을 줄이는 기술이고, 그 기술이 3번을 얼마나 키우는지가 각 방법의 한계다. 둘 사이의 줄다리기를 먼저 보고 시작한다.

부동소수점 — 숫자를 어떻게 저장하는가

섹션 제목: “부동소수점 — 숫자를 어떻게 저장하는가”

컴퓨터는 실수를 가수 × 밑의 거듭제곱 꼴로 저장한다. Kreyszig의 표기로 십진 tt자리 부동소수점 수는

a~=± 0.d1d2⋯dt×10e,d1≠0\tilde a = \pm\, 0.d_1 d_2 \cdots d_t \times 10^{e}, \qquad d_1 \neq 0

이다. d1≠0d_1 \neq 0이 정규화 조건이다 — 앞자리에 0을 낭비하지 않는다. 실제 컴퓨터는 밑이 2이고, 표준(IEEE 754) 배정도(double)에서는 가수가 53비트, 지수가 11비트다. 십진으로 옮기면 유효숫자 약 16자리, 크기 범위 약 10−30810^{-308}에서 1030810^{308}이다.

실수 aa를 가장 가까운 부동소수점 수 fl(a)\text{fl}(a)로 반올림하면, 상대 오차는 한 값을 넘지 않는다.

fl(a)=a (1+δ),∣δ∣≤u\text{fl}(a) = a\,(1 + \delta), \qquad \lvert \delta \rvert \le u

uu를 반올림 단위(rounding unit, 단위 반올림 오차)라 한다. 십진 tt자리에서는 u=12×101−tu = \tfrac12 \times 10^{1-t}, 배정도에서는 u=2−53≈1.1×10−16u = 2^{-53} \approx 1.1 \times 10^{-16}이다. 1 다음의 부동소수점 수까지의 간격 2−522^{-52}를 머신 엡실론이라 부르는데, uu의 두 배다. 책과 라이브러리에 따라 둘 중 아무거나 “엡실론”이라 부르므로 2배 차이는 신경 쓰지 않아도 되지만, 이 절에서는 Kreyszig를 따라 uu를 쓴다.

사칙연산 하나하나도 같은 성질을 갖는다 — 정확히 계산한 뒤 반올림한 것과 같다.

fl(a∘b)=(a∘b)(1+δ),∣δ∣≤u,∘∈{+, −, ×, ÷}\text{fl}(a \circ b) = (a \circ b)(1 + \delta), \qquad \lvert \delta \rvert \le u, \qquad \circ \in \{+,\ -,\ \times,\ \div\}

연산 한 번의 오차는 10−1610^{-16} 수준이다. 문제는 그것이 어떻게 쌓이는가다.

참값 aa, 근삿값 a~\tilde a에 대해

ε=a−a~(오차),εr=εa=a−a~a(상대 오차)\varepsilon = a - \tilde a \quad(\text{오차}), \qquad \varepsilon_r = \frac{\varepsilon}{a} = \frac{a - \tilde a}{a} \quad(\text{상대 오차})

그리고 ∣ε∣≤β\lvert \varepsilon \rvert \le \beta인 β\beta를 오차 한계라 한다. 참값을 모르니 오차 자체는 알 수 없고, 알 수 있는 것은 한계뿐이다.

두 근삿값을 더하거나 곱하면 오차가 어떻게 되는가. a=a~+εaa = \tilde a + \varepsilon_a, b=b~+εbb = \tilde b + \varepsilon_b를 넣어 보면

(a±b)−(a~±b~)=εa±εb⟹∣εa±b∣≤βa+βbab−a~b~ab≈εaa+εbb⟹∣εr, ab∣≲βr,a+βr,b\begin{aligned} (a \pm b) - (\tilde a \pm \tilde b) &= \varepsilon_a \pm \varepsilon_b &&\Longrightarrow\quad \lvert \varepsilon_{a \pm b} \rvert \le \beta_a + \beta_b \\[4pt] \frac{ab - \tilde a \tilde b}{ab} &\approx \frac{\varepsilon_a}{a} + \frac{\varepsilon_b}{b} &&\Longrightarrow\quad \lvert \varepsilon_{r,\,ab} \rvert \lesssim \beta_{r,a} + \beta_{r,b} \end{aligned}

덧셈·뺄셈에서는 절대 오차 한계가 더해지고, 곱셈·나눗셈에서는 상대 오차 한계가 더해진다. 곱셈의 결과는 εaεb\varepsilon_a \varepsilon_b 항을 버린 1차 근사다. 나눗셈도 같은 꼴이다.

이 두 줄이 뜻하는 바는 대칭적이지 않다. 곱셈은 상대 오차가 그저 더해지므로 얌전하다. 그러나 뺄셈은 절대 오차가 더해지는데 결과의 크기는 작아질 수 있으므로, 상대 오차가 폭발할 수 있다.

상쇄 — 뺄셈이 자릿수를 잡아먹는다

섹션 제목: “상쇄 — 뺄셈이 자릿수를 잡아먹는다”

a≈ba \approx b인 두 수를 뺀다고 하자. 각각 유효숫자 16자리로 정확하더라도, 앞의 열 자리가 같다면 뺀 결과에는 여섯 자리만 남는다. 뒤의 열 자리가 0으로 채워져 정확해 보이지만 정보가 없는 자리다. 이것을 상쇄(cancellation)라 한다.

Kreyszig가 드는 예가 이차방정식이다. x2−40x+2=0x^2 - 40x + 2 = 0의 두 근을 근의 공식으로 구하면

x=20±398=20±19.94994…x = 20 \pm \sqrt{398} = 20 \pm 19.94994\ldots

작은 근 x2=20−19.94994=0.05006x_2 = 20 - 19.94994 = 0.05006은 유효숫자 4자리 계산에서 20.00−19.95=0.0520.00 - 19.95 = 0.05로 한 자리만 남는다. 참값은 0.050063…0.050063\ldots이다. 반면 큰 근 x1=39.95x_1 = 39.95는 멀쩡하다. 해결은 공식을 바꾸는 것이다 — 두 근의 곱이 상수항이므로

x2=cx1=239.95=0.05006x_2 = \frac{c}{x_1} = \frac{2}{39.95} = 0.05006

뺄셈을 곱셈·나눗셈으로 바꾸면 상쇄가 사라진다. 같은 요령이 x+1−x\sqrt{x+1} - \sqrt{x}를 1/(x+1+x)1/(\sqrt{x+1} + \sqrt{x})로, 1−cos⁡θ1 - \cos\theta를 2sin⁡2(θ/2)2\sin^2(\theta/2)로 바꾸는 데 쓰인다. 수학적으로 같은 식이 수치적으로는 전혀 다르다.

절단 오차와 반올림 오차의 줄다리기

섹션 제목: “절단 오차와 반올림 오차의 줄다리기”

가장 단순한 예로 둘의 관계를 본다. 도함수를 전진 차분으로 근사하면

f′(x)≈f(x+h)−f(x)hf'(x) \approx \frac{f(x+h) - f(x)}{h}

테일러 전개 f(x+h)=f(x)+hf′(x)+12h2f′′(ξ)f(x+h) = f(x) + hf'(x) + \tfrac12 h^2 f''(\xi)를 넣으면 절단 오차는 12hf′′(ξ)\tfrac12 h f''(\xi), 즉 hh에 비례한다. 한편 분자의 두 함수값에는 각각 ∣f∣u\lvert f \rvert u 급의 반올림 오차가 있고, 그것이 hh로 나뉘므로 반올림 오차는 u/hu/h에 비례한다.

∣εtotal∣≲12h∣f′′∣⏟절단+2u∣f∣h⏟반올림\lvert \varepsilon_{\text{total}} \rvert \lesssim \underbrace{\tfrac12 h \lvert f'' \rvert}_{\text{절단}} + \underbrace{\frac{2u\lvert f \rvert}{h}}_{\text{반올림}}

첫 항은 hh를 줄이면 줄고, 둘째 항은 hh를 줄이면 는다. 합이 최소가 되는 곳은 hopt∼u≈10−8h_{\text{opt}} \sim \sqrt{u} \approx 10^{-8}이고, 그때 오차도 u≈10−8\sqrt{u} \approx 10^{-8} 수준이다. 배정도로 계산해도 도함수는 여덟 자리밖에 못 얻는다.

10⁻¹⁶ 10⁻¹² 10⁻⁸ 10⁻⁴ 10⁰ 10⁻¹² 10⁻⁸ 10⁻⁴ 10⁰ 걸음 폭 h → 오차 |ε| h ≈ √u 절단 ∝ h 반올림 ∝ u/h 전진 차분 총오차 중심 차분 (∝ h²)
그림 1.12-1. 전진 차분으로 f′(x)를 구할 때의 오차를 걸음 폭 h에 대해 양대수 축에 그린 것. 오른쪽에서 왼쪽으로 h를 줄이면 절단 오차(기울기 +1인 직선)는 줄지만 반올림 오차(기울기 −1인 직선)가 늘어, 총오차는 두 직선이 만나는 h ≈ √u ≈ 10⁻⁸ 근처에서 바닥을 찍고 다시 올라간다. 바닥의 높이가 곧 그 방법으로 얻을 수 있는 최선의 정밀도다. 중심 차분처럼 절단 오차의 차수가 높으면 왼쪽 직선이 가팔라져 바닥이 더 낮고 더 오른쪽으로 온다.직접 작도

안정성 — 알고리즘의 성질과 문제의 성질

섹션 제목: “안정성 — 알고리즘의 성질과 문제의 성질”

같은 문제를 푸는 두 알고리즘이 반올림 오차에 다르게 반응할 수 있다. 오차가 단계마다 일정 비율로 줄거나 그대로면 안정, 단계마다 불어나면 불안정하다. 앞의 이차방정식에서 근의 공식 그대로가 불안정한 알고리즘이었고, x2=c/x1x_2 = c/x_1이 안정한 알고리즘이었다.

그런데 알고리즘을 아무리 잘 짜도 안 되는 문제가 있다. 입력이 10−1610^{-16}만 흔들려도 답이 10−610^{-6}만큼 바뀌는 문제라면, 어떤 알고리즘도 여섯 자리 이상은 못 준다. 이것은 알고리즘이 아니라 문제 자체의 성질이고, 7절에서 조건수라는 이름으로 정량화한다. 두 개념을 나눠 두자 —

  • 조건(conditioning)은 문제의 성질. 입력의 작은 변화에 답이 얼마나 민감한가.
  • 안정성(stability)은 알고리즘의 성질. 계산 중에 생긴 오차를 얼마나 키우는가.

안정한 알고리즘으로 조건이 좋은 문제를 풀 때만 정확한 답이 나온다. 하나라도 빠지면 답의 자릿수가 깎인다.

f(x)=0f(x) = 0을 푸는 일은 수치해석의 첫 문제이면서 가장 자주 만나는 문제다. 대수 방정식은 5차부터 근의 공식이 없고, x=cos⁡xx = \cos x 같은 초월 방정식은 처음부터 닫힌 해가 없다. 그래서 답을 한 번에 구하는 대신, 대충 찍은 뒤 고쳐 나간다. 이것이 반복법(iteration)이고, 이 장의 6절·9절·10절·14절이 전부 같은 뼈대다.

반도체에서는 페르미 준위를 구하는 전하 중립 조건 n(EF)−p(EF)+NA−−ND+=0n(E_F) - p(E_F) + N_A^- - N_D^+ = 0이 초월 방정식이고, 푸아송 방정식의 우변 ni(eψ/VT−e−ψ/VT)n_i(e^{\psi/V_T} - e^{-\psi/V_T})가 미지수의 지수함수라 방정식 전체가 비선형이다. 문턱전압 아래의 반전층 전하, 이종접합의 밴드 정렬, 쇼트키 접합의 영상 전하 — 어디를 봐도 f(x)=0f(x) = 0이 있다.

방정식을 x=g(x)x = g(x) 꼴로 바꿔 놓고 반복한다.

xn+1=g(xn),n=0, 1, 2, …x_{n+1} = g(x_n), \qquad n = 0,\ 1,\ 2,\ \ldots

수렴하면 극한 ss는 s=g(s)s = g(s)를 만족하므로 원래 방정식의 해다. 바꾸는 방법은 여럿이다 — x2−3x+1=0x^2 - 3x + 1 = 0은 x=(x2+1)/3x = (x^2 + 1)/3으로도, x=3−1/xx = 3 - 1/x로도 쓸 수 있고 둘의 수렴은 다르다. 무엇이 갈라놓는가.

정리. gg가 구간 JJ를 JJ 안으로 보내고, JJ 위에서 ∣g′(x)∣≤K<1\lvert g'(x) \rvert \le K < 1이면, JJ 안의 어느 초기값에서 시작하든 반복은 JJ 안의 유일한 고정점으로 수렴한다.

증명은 평균값 정리 한 줄이다. s=g(s)s = g(s)를 빼면

xn+1−s=g(xn)−g(s)=g′(ξn)(xn−s)  ⟹  ∣xn+1−s∣≤K∣xn−s∣≤Kn+1∣x0−s∣x_{n+1} - s = g(x_n) - g(s) = g'(\xi_n)(x_n - s) \;\Longrightarrow\; \lvert x_{n+1} - s \rvert \le K \lvert x_n - s \rvert \le K^{n+1} \lvert x_0 - s \rvert

K<1K < 1이면 오른쪽이 0으로 간다. 한 번 반복할 때마다 오차가 KK배 — 이것을 선형 수렴이라 한다. K=0.9K = 0.9이면 자릿수 하나 얻는 데 22번, K=0.1K = 0.1이면 1번이다.

뉴턴법 — 접선을 따라 내려간다

섹션 제목: “뉴턴법 — 접선을 따라 내려간다”

f(xn)f(x_n)과 f′(xn)f'(x_n)을 알면, xnx_n에서 곡선을 접선으로 바꿔 놓고 접선이 축과 만나는 곳을 다음 근사로 삼는다.

  xn+1=xn−f(xn)f′(xn)  \boxed{\;x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\;}

같은 식을 테일러 전개로도 얻는다. 0=f(s)=f(xn)+(s−xn)f′(xn)+⋯0 = f(s) = f(x_n) + (s - x_n)f'(x_n) + \cdots에서 2차 이상을 버리고 ss에 대해 풀면 위 식이다. 접선은 1차 테일러 다항식이니 같은 말이다.

x x₀ x₁ x₂ 근 f(x) = x² − 2 접선이 축을 지나는 곳이 다음 걸음 — 두 걸음이면 붙는다 x x₀ x₁ x₂ → f(x) = arctan x 평평한 곳에서 출발 — 걸음마다 더 멀리 튄다
그림 1.12-2. 뉴턴법의 한 걸음. 현재 위치 xₙ에서 곡선 f(x)에 접선을 긋고, 접선이 가로축을 지나는 자리를 xₙ₊₁로 삼는다. 접선의 기울기가 f′(xₙ)이므로 가로축까지의 거리는 f(xₙ)/f′(xₙ)이다. 근 근처에서 곡선이 접선과 거의 같아지므로 두세 걸음이면 붙지만, 오른쪽처럼 f′ ≈ 0인 평평한 자리에서 출발하면 접선이 축과 아주 먼 곳에서 만나 엉뚱한 곳으로 튀어 나간다.직접 작도

예 — 제곱근. f(x)=x2−af(x) = x^2 - a이면

xn+1=xn−xn2−a2xn=12(xn+axn)x_{n+1} = x_n - \frac{x_n^2 - a}{2x_n} = \frac12\left(x_n + \frac{a}{x_n}\right)

바빌로니아 사람들이 알던 공식이다. a=2a = 2, x0=1x_0 = 1에서 시작하면 1.5, 1.41667, 1.41422, 1.41421356…1.5,\ 1.41667,\ 1.41422,\ 1.41421356\ldots — 네 번째에서 이미 열 자리가 맞는다.

이것이 뉴턴법의 특징인 2차 수렴이다. g(x)=x−f(x)/f′(x)g(x) = x - f(x)/f'(x)로 놓고 미분하면 g′(x)=ff′′/f′2g'(x) = f f'' / f'^2이므로 근 ss에서 g′(s)=0g'(s) = 0이다. 앞의 정리에서 KK가 0으로 내려앉는 경우이고, 2차 항까지 전개하면

εn+1≈−f′′(s)2f′(s) εn2\varepsilon_{n+1} \approx -\frac{f''(s)}{2f'(s)}\,\varepsilon_n^2

오차가 제곱으로 준다. 오차 10−210^{-2}가 다음에 10−410^{-4}, 그다음 10−810^{-8}, 10−1610^{-16} — 반복마다 맞는 자릿수가 두 배가 된다. 배정도의 16자리는 네다섯 번이면 끝난다.

뉴턴법은 근 가까이에서만 2차 수렴한다. 멀리서 시작하면 다음 셋 중 하나가 흔히 일어난다.

  • 평평한 곳에서 출발. f′(xn)≈0f'(x_n) \approx 0이면 나눗셈이 큰 값을 만들어 멀리 튄다. 그림의 오른쪽 경우다. tan⁡−1x=0\tan^{-1} x = 0을 x0=1.5x_0 = 1.5에서 시작하면 발산한다.
  • 순환. x0→x1→x0x_0 \to x_1 \to x_0처럼 두 점 사이를 오간다. x3−2x+2=0x^3 - 2x + 2 = 0을 x0=0x_0 = 0에서 시작하면 0과 1을 영원히 오간다.
  • 중근. f(s)=0f(s) = 0이면서 f′(s)=0f'(s) = 0인 경우(예: (x−1)2(x-1)^2). 수렴은 하지만 εn+1≈12εn\varepsilon_{n+1} \approx \tfrac12\varepsilon_n — 선형 수렴으로 떨어진다. 중복도가 mm이면 xn+1=xn−mf/f′x_{n+1} = x_n - m f/f'로 고쳐 2차를 되찾을 수 있다.

실용적인 처방은 두 가지다. 첫째, 이분법(bisection)으로 먼저 근을 가둔다. f(a)f(b)<0f(a)f(b) < 0인 구간의 중점을 취해 부호가 바뀌는 쪽 절반을 남기는 방법으로, 한 번에 자릿수 하나 얻기도 어려울 만큼 느리지만(오차가 매번 정확히 절반) 절대 실패하지 않는다. 둘째, 감쇠 (damping). 뉴턴 걸음 Δx=−f/f′\Delta x = -f/f'를 그대로 밟지 않고 ∣f∣\lvert f \rvert가 줄어들 때까지 Δx/2, Δx/4, …\Delta x/2,\ \Delta x/4,\ \ldots로 줄여 밟는다.

f′f'을 구하기 어렵거나 비싸면 접선 대신 최근 두 점을 잇는 할선(secant)을 쓴다.

xn+1=xn−f(xn) xn−xn−1f(xn)−f(xn−1)x_{n+1} = x_n - f(x_n)\,\frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})}

뉴턴 공식의 f′(xn)f'(x_n)을 차분으로 바꾼 것이다. 수렴 차수는 12(1+5)≈1.618\tfrac12(1 + \sqrt5) \approx 1.618 — 2차보다는 느리지만 한 걸음에 함수값 하나만 새로 계산하므로, 함수값 하나가 비쌀 때는 뉴턴법보다 시간당 빠른 경우가 많다.

xn−xn−1x_n - x_{n-1}와 f(xn)−f(xn−1)f(x_n) - f(x_{n-1})이 근 근처에서 둘 다 작아지므로 1절의 상쇄가 난다. 그래서 근에 충분히 가까워지면 더 이상 정밀도가 오르지 않는데, 이때는 이미 필요한 자릿수를 얻은 뒤라 실용상 문제가 되지 않는다.

연립 방정식으로 — 야코비 행렬

섹션 제목: “연립 방정식으로 — 야코비 행렬”

미지수가 여럿이면 F(x)=0\mathbf{F}(\mathbf{x}) = \mathbf{0}, 즉 F1(x1,…,xN)=0, …, FN=0F_1(x_1, \ldots, x_N) = 0,\ \ldots,\ F_N = 0이다. 테일러 전개를 벡터로 옮기면 접선이 접평면이 되고, 도함수가 야코비 행렬 Jij=∂Fi/∂xjJ_{ij} = \partial F_i / \partial x_j가 된다(1.1.5이중·삼중 적분).

F(x(m))+J(x(m)) Δx=0  ⟹  J(x(m)) Δx=−F(x(m)),x(m+1)=x(m)+Δx\mathbf{F}(\mathbf{x}^{(m)}) + J(\mathbf{x}^{(m)})\,\Delta\mathbf{x} = \mathbf{0} \;\Longrightarrow\; J(\mathbf{x}^{(m)})\,\Delta\mathbf{x} = -\mathbf{F}(\mathbf{x}^{(m)}), \qquad \mathbf{x}^{(m+1)} = \mathbf{x}^{(m)} + \Delta\mathbf{x}

나눗셈 f/f′f/f'가 선형계 풀이 J−1FJ^{-1}\mathbf{F}로 바뀐다. 뉴턴 한 걸음마다 N×NN \times N 선형계를 하나씩 풀어야 하고, 그 선형계를 어떻게 푸는가가 5·6절이다. 수렴 성질은 스칼라와 같다 — 해 근처에서 2차, 멀리서는 감쇠 필요.

세 방정식을 한꺼번에 푸는 대신 번갈아 풀 수도 있다. 푸아송을 n, pn,\ p 고정으로 풀어 ψ\psi를 얻고, 그 ψ\psi로 두 연속 방정식을 풀어 n, pn,\ p를 갱신하고, 다시 푸아송으로 — 이것이 검멜 반복(Gummel iteration)이다. 야코비 행렬의 비대각 블록을 버린 셈이라 한 걸음이 싸지만 수렴은 선형이고, 결합이 강하면 발산한다. 시뮬레이터가 낮은 바이어스에서 검멜로 시작해 결합 뉴턴으로 넘어가는 것이 이 때문이다. 6절에서 이 “번갈아 풀기”를 선형계 위에서 다시 만난다.

참값을 모르니 ∣xn−s∣\lvert x_n - s \rvert로는 멈출 수 없다. 대신 쓰는 것이 둘이다.

  • 갱신량 ∣xn+1−xn∣\lvert x_{n+1} - x_n \rvert. 2차 수렴 중이면 이것이 오차의 좋은 추정이다 — 다음 오차가 이번 오차의 제곱이므로, 이번 걸음의 크기가 곧 남은 오차의 크기다.
  • 잔차 ∣f(xn)∣\lvert f(x_n) \rvert. 방정식이 얼마나 안 맞는가. 그러나 f′f'이 작으면 잔차가 작아도 오차는 클 수 있다(7절의 조건수 문제가 여기서도 같은 얼굴로 나타난다).

둘 다 절대값과 상대값을 함께 봐야 하는 이유는 1절의 RELTOL·ABSTOL 이야기와 같다. 미지수가 102010^{20}과 10210^{2}를 함께 담고 있으면 하나의 허용치로는 판정이 안 된다.

측정값은 언제나 점이다. SIMS로 잰 도핑 프로파일은 깊이 200군데의 농도이고, 이동도 모델은 온도·도핑 몇 조합에서의 표 값이며, 소자 모델의 표 기반(table-based) 모델은 II–VV 격자점의 전류다. 그 사이의 값이 필요할 때 점들을 잇는 함수를 만드는 일이 보간(interpolation)이다. 점 사이를 채우면 보간, 점 범위 밖으로 나가면 외삽(extrapolation)이고, 뒤의 것은 훨씬 위험하다.

n+1n + 1개의 점 (x0,f0), …, (xn,fn)(x_0, f_0),\ \ldots,\ (x_n, f_n)이 주어졌다고 하자(xjx_j는 서로 다르다). 차수가 nn 이하인 다항식 중 이 점을 전부 지나는 것은 정확히 하나 있다. 있다는 것은 아래 라그랑주 공식이 직접 보여 주고, 하나뿐이라는 것은 두 개가 있다면 그 차가 nn차 이하이면서 근을 n+1n + 1개 가지므로 영다항식이어야 한다는 데서 나온다.

kk번째 마디에서 1이고 나머지 마디에서 0인 nn차 다항식을 만들면 끝이다.

Lk(x)=∏j=0j≠knx−xjxk−xj,Lk(xj)={1j=k0j≠kL_k(x) = \prod_{\substack{j=0 \\ j \neq k}}^{n} \frac{x - x_j}{x_k - x_j}, \qquad L_k(x_j) = \begin{cases} 1 & j = k \\ 0 & j \neq k \end{cases}

분자는 xkx_k를 뺀 모든 마디에서 0이 되게 하고, 분모는 x=xkx = x_k에서 값을 1로 맞춘다. 이것을 함수값으로 가중해 더한다.

pn(x)=∑k=0nfk Lk(x)p_n(x) = \sum_{k=0}^{n} f_k\, L_k(x)

각 마디에서 자기 항만 살아남으므로 pn(xk)=fkp_n(x_k) = f_k다. 식이 명시적이라 이론에 편하고, 4절의 적분 공식이 전부 여기서 나온다.

오차 공식 — 어디서 얼마나 틀리는가

섹션 제목: “오차 공식 — 어디서 얼마나 틀리는가”

ff가 n+1n + 1번 미분 가능하면 마디가 아닌 xx에서

f(x)−pn(x)=f(n+1)(ξ)(n+1)! (x−x0)(x−x1)⋯(x−xn)f(x) - p_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!}\,(x - x_0)(x - x_1)\cdots(x - x_n)

여기서 ξ\xi는 xx와 마디들을 포함하는 구간 안의 어딘가다. 정확한 위치는 모르고, 그래서 쓸 때는 ∣f(n+1)∣\lvert f^{(n+1)} \rvert의 최댓값으로 갈음한다. 이 식은 테일러 정리의 나머지항과 꼭 닮았다 — 실제로 마디를 전부 한 점으로 모으면 테일러 나머지항이 된다(1.5.3함수의 급수 전개와 근사의 정확도).

두 인자를 따로 읽는다.

  • f(n+1)(ξ)f^{(n+1)}(\xi) — 함수의 성질. 함수가 매끄러울수록 작다. exe^x는 모든 도함수가 exe^x라 얌전하고, 1/(1+25x2)1/(1 + 25x^2)는 고계 도함수가 n!n!처럼 자라 사납다.
  • ∏(x−xj)\prod (x - x_j) — 마디의 배치. 마디 근처에서는 0에 가깝고, 마디 사이 한가운데에서 크며, 양 끝 구간에서 가장 크다. 마디 밖(외삽)으로 나가면 다항식처럼 빠르게 커진다.

균등 마디에서 두 번째 인자의 크기를 hh로 적으면 ∣∏(x−xj)∣≤\lvert \prod(x - x_j) \rvert \le 대략 n! hn+1/4n!\,h^{n+1}/4 수준이므로, 오차는 hn+1h^{n+1}에 비례한다. 선형 보간(n=1n = 1)이면 h2h^2 — 마디 간격을 절반으로 줄이면 오차가 4분의 1이다.

뉴턴의 분할 차분 — 마디를 하나씩 더할 수 있게

섹션 제목: “뉴턴의 분할 차분 — 마디를 하나씩 더할 수 있게”

라그랑주 형식은 마디를 하나 추가하면 모든 LkL_k를 다시 만들어야 한다. 뉴턴 형식은 그 불편을 없앤다. 먼저 분할 차분을 정의한다.

f[x0,x1]=f1−f0x1−x0,f[x0,x1,x2]=f[x1,x2]−f[x0,x1]x2−x0,…f[x_0, x_1] = \frac{f_1 - f_0}{x_1 - x_0}, \qquad f[x_0, x_1, x_2] = \frac{f[x_1, x_2] - f[x_0, x_1]}{x_2 - x_0}, \qquad \ldots

1차 분할 차분은 두 점을 잇는 직선의 기울기, 2차는 기울기의 변화율이다 — 차례로 도함수 f′, f′′/2!, f′′′/3!, …f',\ f''/2!,\ f'''/3!,\ \ldots에 대응한다. 그러면

pn(x)=f0+(x−x0) f[x0,x1]+(x−x0)(x−x1) f[x0,x1,x2]+⋯+(x−x0)⋯(x−xn−1) f[x0,…,xn]\begin{aligned} p_n(x) = f_0 &+ (x - x_0)\,f[x_0, x_1] + (x - x_0)(x - x_1)\,f[x_0, x_1, x_2] \\ &+ \cdots + (x - x_0)\cdots(x - x_{n-1})\,f[x_0, \ldots, x_n] \end{aligned}

테일러 급수의 이산판이다. (x−x0)k(x - x_0)^k 자리에 (x−x0)⋯(x−xk−1)(x - x_0)\cdots(x - x_{k-1})이, f(k)/k!f^{(k)}/k! 자리에 kk차 분할 차분이 들어갔다. 마디를 하나 더 넣으면 항 하나만 뒤에 붙는다. 계산은 표로 한다 — 첫 열에 fjf_j, 둘째 열에 인접 1차 차분, 셋째 열에 인접 2차 차분 … 표의 맨 윗줄이 그대로 계수다.

마디가 균등(xj=x0+jhx_j = x_0 + jh)하면 분할 차분의 분모가 상수가 되어 전진 차분 Δfj=fj+1−fj\Delta f_j = f_{j+1} - f_j, Δ2fj=Δfj+1−Δfj\Delta^2 f_j = \Delta f_{j+1} - \Delta f_j로 간단해진다. r=(x−x0)/hr = (x - x_0)/h로 놓으면 Newton 전진 공식은

pn(x)=f0+r Δf0+r(r−1)2! Δ2f0+⋯+r(r−1)⋯(r−n+1)n! Δnf0=∑s=0n(rs) Δsf0p_n(x) = f_0 + r\,\Delta f_0 + \frac{r(r-1)}{2!}\,\Delta^2 f_0 + \cdots + \frac{r(r-1)\cdots(r-n+1)}{n!}\,\Delta^n f_0 = \sum_{s=0}^{n} \binom{r}{s}\,\Delta^s f_0

이항계수 (rs)\binom{r}{s}에 정수가 아닌 rr이 들어가는 것이 포인트다. 표의 끝에서 거꾸로 세는 후진 공식도 있는데, Kreyszig가 그것을 ∇\nabla로 적기 때문에 이 백과는 식을 옮기지 않는다(장 앞 주의 ④). 필요하면 마디 번호를 뒤집어 전진 공식으로 쓰면 같은 결과다.

룽게 현상 — 차수를 올리면 나빠진다

섹션 제목: “룽게 현상 — 차수를 올리면 나빠진다”

오차 공식대로면 마디를 늘릴수록 hn+1h^{n+1}이 작아져 좋아질 것 같다. 그렇지 않다. f(x)=1/(1+25x2)f(x) = 1/(1 + 25x^2)를 [−1,1][-1, 1]의 균등 마디로 보간하면 nn을 올릴수록 양 끝에서 진동이 커져 발산한다. 오차 공식의 첫 인자 f(n+1)f^{(n+1)}이 n!n!보다 빨리 자라기 때문이다.

x −1 1 1 −1 10차 다항식 3차 스플라인 점선: 원래 함수 f(x) = 1/(1 + 25x²), 균등 마디 11개
그림 1.12-3. f(x) = 1/(1 + 25x²)를 [−1, 1]에서 보간한 것. 균등한 11개 마디로 10차 다항식을 지나게 하면 가운데는 잘 맞지만 양 끝 구간에서 크게 출렁인다(룽게 현상). 같은 함수를 같은 마디로 3차 스플라인으로 이으면 출렁임이 없다. 문제는 점의 수가 아니라 '한 다항식으로 전부를 맞추려는' 데 있다 — 한 곳의 정보가 다항식을 통해 멀리까지 전달되기 때문이다.직접 작도

스플라인 — 낮은 차수를 이어 붙인다

섹션 제목: “스플라인 — 낮은 차수를 이어 붙인다”

한 다항식으로 전부를 맞추는 대신, 마디 사이마다 3차 다항식을 두고 마디에서 매끄럽게 잇는다. 제도사가 가는 자(spline)를 못에 걸어 휘어 곡선을 그리던 도구에서 온 이름이다.

정의. 마디 x0<x1<⋯<xnx_0 < x_1 < \cdots < x_n에 대해 함수 g(x)g(x)가 3차 스플라인이라 함은 ① 각 구간 [xj,xj+1][x_{j}, x_{j+1}]에서 3차 다항식이고, ② 전체에서 g, g′, g′′g,\ g',\ g''이 연속이며, ③ g(xj)=fjg(x_j) = f_j인 것이다.

미지수를 세어 보자. 구간 nn개 × 계수 4 = 4n4n. 조건은 마디값 2n2n(각 구간 양 끝), 안쪽 마디 n−1n - 1개에서 g′g' 연속과 g′′g'' 연속 2(n−1)2(n-1). 합이 4n−24n - 2이니 둘이 모자란다. 양 끝에서 조건 두 개를 더 주어야 하고, 그 선택이 스플라인의 종류다.

  • 고정(clamped) 스플라인 — 양 끝의 기울기 g′(x0)=k0g'(x_0) = k_0, g′(xn)=kng'(x_n) = k_n을 지정. Kreyszig의 기본 형태다.
  • 자연(natural) 스플라인 — 양 끝에서 g′′=0g'' = 0. 끝 너머로 직선처럼 나간다. 끝 기울기를 모를 때의 표준.

Kreyszig는 각 마디의 기울기 kj=g′(xj)k_j = g'(x_j)를 미지수로 잡는다. 구간마다 양 끝의 값과 기울기로 3차식이 하나로 정해지므로(에르미트 보간), 남는 조건은 g′′g''의 연속뿐이고, 마디 간격이 균등(hh)하면 그것이

kj−1+4kj+kj+1=3h (fj+1−fj−1),j=1,…,n−1k_{j-1} + 4k_j + k_{j+1} = \frac{3}{h}\,(f_{j+1} - f_{j-1}), \qquad j = 1, \ldots, n-1

이다. 미지수 k1,…,kn−1k_1, \ldots, k_{n-1}에 대한 삼중대각 선형계다 — 한 줄에 미지수가 셋뿐이라 5절의 토머스 알고리즘으로 O(n)O(n)에 풀린다. 우변은 중심 차분 (fj+1−fj−1)/2h(f_{j+1} - f_{j-1})/2h의 6배, 즉 “기울기의 가중 평균이 중심 차분과 같다”는 조건이다. 대각 성분 4가 비대각 1 + 1보다 크므로 6절의 대각 우세 조건이 자동으로 성립해 언제나 풀린다.

적분 — 보간 다항식을 대신 적분한다

섹션 제목: “적분 — 보간 다항식을 대신 적분한다”

∫abf(x) dx\int_a^b f(x)\,dx를 닫힌 꼴로 못 구하면, ff를 마디 몇 개에서 값을 재고 그 점을 지나는 보간 다항식을 대신 적분한다. 3절의 라그랑주 형식을 넣으면

∫abf(x) dx≈∫abpn(x) dx=∑k=0nfk∫abLk(x) dx=∑k=0nwk fk\int_a^b f(x)\,dx \approx \int_a^b p_n(x)\,dx = \sum_{k=0}^{n} f_k \int_a^b L_k(x)\,dx = \sum_{k=0}^{n} w_k\, f_k

가중치 wkw_k는 ff와 무관하게 마디 배치만으로 정해진다. 그래서 모든 수치 적분 공식은 “함수값의 가중합”이고, 공식마다 다른 것은 마디와 가중치뿐이다.

구간을 nn등분(h=(b−a)/nh = (b-a)/n)하고 각 조각에서 ff를 직선으로 잇는 것이 사다리꼴 공식이다.

J≈h[12f0+f1+f2+⋯+fn−1+12fn]J \approx h\left[\tfrac12 f_0 + f_1 + f_2 + \cdots + f_{n-1} + \tfrac12 f_n\right]

각 조각의 오차는 3절의 보간 오차 공식을 적분해 −112h3f′′(ξj)-\tfrac{1}{12}h^3 f''(\xi_j)이고, nn개를 모으면 nh3=(b−a)h2n h^3 = (b-a)h^2이므로

εtrap=−b−a12 h2 f′′(ξ)\varepsilon_{\text{trap}} = -\frac{b-a}{12}\,h^2\,f''(\xi)

h2h^2 차수. 기울기 부호는 위로 볼록한 함수(f′′<0f'' < 0)에서 사다리꼴이 곡선 아래를 과소평가 한다는 그림과 맞는다.

각 조각 두 개(마디 셋)를 포물선으로 잇는 것이 심프슨 공식이다. nn은 짝수여야 한다.

J≈h3[f0+4f1+2f2+4f3+⋯+2fn−2+4fn−1+fn]J \approx \frac{h}{3}\left[f_0 + 4f_1 + 2f_2 + 4f_3 + \cdots + 2f_{n-2} + 4f_{n-1} + f_n\right]

1, 4, 2, 4, …, 4, 11,\ 4,\ 2,\ 4,\ \ldots,\ 4,\ 1의 가중치는 포물선 조각 하나의 적분 h3(f0+4f1+f2)\tfrac{h}{3}(f_0 + 4f_1 + f_2)을 이어 붙인 결과다. 오차는

εSimp=−b−a180 h4 f(4)(ξ)\varepsilon_{\text{Simp}} = -\frac{b-a}{180}\,h^4\,f^{(4)}(\xi)

포물선(2차) 보간이니 h3h^3을 기대할 텐데 **h4h^4**다. 포물선 조각의 대칭 때문에 3차 항의 오차가 저절로 사라지기 때문이다 — 심프슨 공식은 3차 다항식까지 정확히 적분한다. 같은 hh에서 사다리꼴보다 h2h^2배 좋고, 1절의 V자 그림에서 왼쪽 직선이 기울기 2에서 4로 가팔라진 것이다.

오차의 차수를 안다는 것은 오차를 빼낼 수 있다는 뜻이다. 사다리꼴 근사를 걸음 hh와 h/2h/2로 두 번 계산해 Jh, Jh/2J_h,\ J_{h/2}를 얻었다면, 오차가 Ch2Ch^2 꼴이므로

J−Jh≈Ch2,J−Jh/2≈14Ch2  ⟹  J≈Jh/2+Jh/2−Jh3J - J_h \approx Ch^2, \qquad J - J_{h/2} \approx \tfrac14 Ch^2 \;\Longrightarrow\; J \approx J_{h/2} + \frac{J_{h/2} - J_h}{3}

두 근사를 조합해 h2h^2 오차를 없앴다. 이것이 리처드슨 외삽이고, 결과는 정확히 심프슨 공식과 같다. 같은 요령을 되풀이해 h4, h6, …h^4,\ h^6,\ \ldots 오차를 차례로 없애는 것이 롬베르크 적분이다. 사다리꼴 값을 h, h/2, h/4, …h,\ h/2,\ h/4,\ \ldots로 표의 첫 열에 적고, 이웃 열을 조합해 다음 열을 만든다.

Tm,k=Tm,k−1+Tm,k−1−Tm−1,k−14k−1T_{m,k} = T_{m,k-1} + \frac{T_{m,k-1} - T_{m-1,k-1}}{4^k - 1}

표의 대각선이 빠르게 수렴한다. “오차의 차수를 알면 그 차수를 없앨 수 있다”는 원리는 10절의 걸음 폭 조절(RKF)과 11절의 격자 수렴 검사에서 다시 쓴다.

가우스 구적법 — 마디까지 최적화한다

섹션 제목: “가우스 구적법 — 마디까지 최적화한다”

지금까지는 마디를 균등하게 미리 정해 놓고 가중치만 골랐다. 마디도 자유롭게 고르면 미지수가 두 배(nn개 마디 + nn개 가중치 = 2n2n)이므로, 2n−12n - 1차 다항식까지 정확히 적분하는 공식을 만들 수 있다. 그 최적 마디가 르장드르 다항식 PnP_n의 영점이고(1.5.6르장드르 방정식과 르장드르 다항식), 그 공식이 가우스 구적법(가우스–르장드르)이다.

∫−11f(t) dt≈∑j=1nAj f(tj),Pn(tj)=0\int_{-1}^{1} f(t)\,dt \approx \sum_{j=1}^{n} A_j\, f(t_j), \qquad P_n(t_j) = 0

n=2n = 2이면 tj=±1/3t_j = \pm 1/\sqrt3, Aj=1A_j = 1 — 함수값 두 개로 3차 다항식까지 정확하다. 심프슨은 세 개로 3차이니, 같은 정확도를 값 하나 덜 쓰고 얻는다. n=5n = 5면 값 다섯 개로 9차. 일반 구간 [a,b][a, b]는 x=12(a+b)+12(b−a)tx = \tfrac12(a+b) + \tfrac12(b-a)t로 옮긴다.

왜 르장드르인가. 오차는 ff를 2n−12n - 1차 다항식 qq와 나머지로 쪼개서 보면 ∫f−∑Ajf(tj)=∫(f−q)\int f - \sum A_j f(t_j) = \int (f - q) 꼴이 되고, f−qf - q가 마디에서 0이 되게 하면 그것은 ∏(t−tj)×(저차 다항식)\prod(t - t_j) \times (\text{저차 다항식})이다. ∏(t−tj)\prod(t - t_j)가 nn차 이하의 모든 다항식과 직교하면 이 적분이 사라진다 — 그 직교 다항식이 PnP_n이다. 1.6의 직교 함수계가 적분 공식으로 다시 나온 것이다.

함수가 어떤 곳에서는 급하고 어떤 곳에서는 완만하면 균등 마디는 낭비다. 각 구간에서 오차를 추정해(예: 심프슨을 hh와 h/2h/2로 두 번) 허용치보다 크면 그 구간만 반으로 나누는 것이 적응 적분이다. 재귀적으로 진행되어 급한 곳에 마디가 저절로 몰린다. 라이브러리의 quad 류 함수가 이것이고, 오차 허용치를 인자로 받는 이유가 이 추정 때문이다.

수치 미분 — 적분의 반대, 성질도 반대

섹션 제목: “수치 미분 — 적분의 반대, 성질도 반대”

미분은 정의 그대로 차분으로 바꾼다. 테일러 전개에서 바로 나오는 세 공식이 기본이다.

f′(x)≈f(x+h)−f(x)h(전진, 오차 12hf′′)f′(x)≈f(x+h)−f(x−h)2h(중심, 오차 16h2f′′′)f′′(x)≈f(x+h)−2f(x)+f(x−h)h2(중심 2계, 오차 112h2f(4))\begin{aligned} f'(x) &\approx \frac{f(x+h) - f(x)}{h} &&\text{(전진, 오차 } \tfrac12 h f'')\\[4pt] f'(x) &\approx \frac{f(x+h) - f(x-h)}{2h} &&\text{(중심, 오차 } \tfrac16 h^2 f''')\\[4pt] f''(x) &\approx \frac{f(x+h) - 2f(x) + f(x-h)}{h^2} &&\text{(중심 2계, 오차 } \tfrac1{12} h^2 f^{(4)}) \end{aligned}

중심 차분이 전진보다 한 차수 좋은 것은 f(x±h)f(x \pm h)의 전개에서 h2h^2 항이 대칭이라 빼면 사라지기 때문이다. 셋째 줄이 11절 차분법의 재료다 — 라플라시안의 5점 공식은 이 식을 xx와 yy로 한 번씩 쓴 것이다.

문제는 1절의 V자 그림이다. 적분은 함수값의 오차를 평균 내어 줄이지만, 미분은 함수값의 오차를 hh로 나누어 키운다. 전진 차분은 최선이 u≈10−8\sqrt{u} \approx 10^{-8}, 중심 차분은 u2/3≈10−11u^{2/3} \approx 10^{-11}, 2계 중심 차분은 u≈10−8\sqrt{u} \approx 10^{-8} 급에서 멈춘다.

이 장의 절반은 결국 Ax=bA\mathbf{x} = \mathbf{b}로 끝난다. 2절의 뉴턴 걸음, 3절의 스플라인, 8절의 정규방정식, 11절의 차분 방정식, 13절의 유한요소 방정식이 전부 선형계이고, 그것을 얼마나 빨리 정확히 푸는가가 시뮬레이션의 속도를 정한다. 1.2에서 가우스 소거를 개념으로 봤다면(1.2.2가우스 소거와 선형계의 해), 여기서는 알고리즘으로 본다 — 몇 번 계산하고, 어디서 오차가 생기며, 어떻게 재활용하는가.

앞선 소거로 AA를 상삼각으로 만든 뒤 후진 대입한다. 연산 횟수를 세 보면, kk번째 열을 소거할 때 아래 (n−k)(n - k)개 행 각각에 (n−k)(n - k)개 성분을 갱신하므로

∑k=1n−1(n−k)2≈n33(곱셈⋅덧셈 각각),후진 대입≈n22\sum_{k=1}^{n-1} (n-k)^2 \approx \frac{n^3}{3} \quad(\text{곱셈·덧셈 각각}), \qquad \text{후진 대입} \approx \frac{n^2}{2}

소거가 n3n^3, 대입이 n2n^2. nn이 두 배가 되면 시간이 여덟 배다. 크래머 공식이 n!n!이니 비교가 안 되고, 역행렬을 구해 곱하는 것은 소거의 세 배라 역행렬을 구하는 것은 언제나 손해다(1.2.4역행렬). n=104n = 10^{4}이면 101210^{12}번 — 초 단위, n=106n = 10^{6}이면 101810^{18}번 — 불가능. 소자 시뮬레이션의 nn이 그 사이에 있고, 그래서 아래의 희소성이 없으면 아무것도 못 푼다.

피벗팅 — 작은 수로 나누지 않는다

섹션 제목: “피벗팅 — 작은 수로 나누지 않는다”

수학적으로 가우스 소거는 피벗(대각 성분)이 0만 아니면 된다. 수치적으로는 작기만 해도 망한다. 유효숫자 4자리로

0.0004 x1+1.402 x2=1.4060.4003 x1−1.502 x2=2.501\begin{aligned} 0.0004\,x_1 + 1.402\,x_2 &= 1.406 \\ 0.4003\,x_1 - 1.502\,x_2 &= 2.501 \end{aligned}

을 풀어 보자(Kreyszig의 예). 첫 행을 피벗으로 쓰면 곱수가 0.4003/0.0004≈10010.4003/0.0004 \approx 1001이고, 둘째 행은 −1.502−1001×1.402=−1405-1.502 - 1001 \times 1.402 = -1405가 되어 원래의 −1.502-1.502가 자릿수 밖으로 밀려난다. 결과 x2=1.002x_2 = 1.002, x1=−2.500x_1 = -2.500 — 참값 x2=1x_2 = 1, x1=10x_1 = 10과 딴판이다. 두 행을 바꿔 0.40030.4003을 피벗으로 쓰면 곱수가 0.0010.001이 되어 정확히 x1=10.00x_1 = 10.00, x2=1.000x_2 = 1.000이 나온다.

부분 피벗팅은 매 단계에서 그 열의 남은 성분 중 절댓값이 가장 큰 것을 피벗으로 올리는 규칙이다. 곱수가 언제나 1 이하가 되어, 소거 과정에서 성분이 폭발적으로 자라는 일을 막는다. 행렬이 대각 우세이거나 대칭 양의 정부호이면 피벗팅 없이도 안전하다는 것이 알려져 있고, 그 경우가 아니면 언제나 켠다.

소거 과정에서 쓴 곱수를 버리지 않고 모으면, 소거 결과와 합쳐 원래 행렬의 곱 분해가 된다.

A=LU,L=[1l211l31l321],U=[u11u12u13u22u23u33]A = LU, \qquad L = \begin{bmatrix} 1 & & \\ l_{21} & 1 & \\ l_{31} & l_{32} & 1 \end{bmatrix}, \quad U = \begin{bmatrix} u_{11} & u_{12} & u_{13} \\ & u_{22} & u_{23} \\ & & u_{33} \end{bmatrix}

LL은 곱수를 아래에 채운 단위 하삼각(대각이 1), UU는 소거가 끝난 상삼각이다. 이렇게 대각을 LL 쪽에서 1로 고정한 것이 둘리틀(Doolittle) 분해, UU 쪽에서 1로 고정하면 크라우트 (Crout) 분해다. 둘은 대각행렬 하나 차이라 본질이 같다.

분해가 있으면 Ax=bA\mathbf{x} = \mathbf{b}는 두 번의 삼각계로 쪼개진다.

Ly=b(전진 대입),Ux=y(후진 대입)L\mathbf{y} = \mathbf{b} \quad(\text{전진 대입}), \qquad U\mathbf{x} = \mathbf{y} \quad(\text{후진 대입})

각각 n2/2n^2/2이므로 **한 번 분해해 두면 우변마다 n2n^2**이다. 우변이 여러 개인 문제 — 같은 구조에 바이어스만 바꾸는 소자 시뮬레이션, 같은 회로에 입력만 바꾸는 과도 해석, 역행렬의 열을 하나씩 구하는 일 — 에서 이것이 n3n^3과 n2n^2의 차이다. 회로 시뮬레이터가 한 시간 걸음의 뉴턴 반복 안에서 야코비 행렬이 크게 변하지 않으면 분해를 재활용하는 것도 같은 이유다(수정 뉴턴법).

행렬식도 공짜다. det⁡A=det⁡Ldet⁡U=u11u22⋯unn\det A = \det L \det U = u_{11}u_{22}\cdots u_{nn} — 피벗의 곱이고, 행 교환마다 부호가 바뀐다. 피벗 중 하나가 0에 가까우면 그 행렬이 특이에 가깝다는 경고다.

콜레스키 — 대칭 양의 정부호이면 절반

섹션 제목: “콜레스키 — 대칭 양의 정부호이면 절반”

AA가 대칭이고 양의 정부호(1.3.7이차 형식과 주축 변환)이면 U=LTU = L^{\mathsf{T}}로 잡을 수 있다.

A=LLT,ljj=ajj−∑k<jljk2,lij=1ljj(aij−∑k<jlikljk)A = LL^{\mathsf{T}}, \qquad l_{jj} = \sqrt{a_{jj} - \sum_{k<j} l_{jk}^2}, \qquad l_{ij} = \frac{1}{l_{jj}}\Bigl(a_{ij} - \sum_{k<j} l_{ik}l_{jk}\Bigr)

절반의 저장 공간과 절반의 연산(n3/6n^3/6)으로 끝나고, 피벗팅이 필요 없다 — 제곱근 안이 언제나 양수라는 것이 양의 정부호의 정의이고, 그래서 성분이 자라지 않는다. 제곱근 안이 음수가 되면 그 행렬은 양의 정부호가 아니라는 판정이 되기도 한다. 13절의 유한요소 강성 행렬, 8절의 정규방정식 ATAA^{\mathsf{T}}A, 11절의 (부호를 바꾼) 이산 라플라시안이 전부 이 부류라 콜레스키가 기본 도구다.

띠와 희소 — n3n^3을 피하는 유일한 길

섹션 제목: “띠와 희소 — n3n^3n3을 피하는 유일한 길”

이산화한 PDE의 행렬은 각 격자점이 이웃과만 결합하므로 대부분의 성분이 0이다. 1차원이면 삼중대각이고, 이때 소거는 각 행에서 한 성분만 없애면 되므로 전체가 O(n)O(n)이다 — 이것이 토머스 알고리즘이고, 3절의 스플라인과 12절의 크랭크–니콜슨이 여기에 올라탄다.

[b1c1a2b2c2⋱⋱⋱anbn]⟶cj′=cjbj−ajcj−1′,dj′=dj−ajdj−1′bj−ajcj−1′\begin{bmatrix} b_1 & c_1 & & \\ a_2 & b_2 & c_2 & \\ & \ddots & \ddots & \ddots \\ & & a_n & b_n \end{bmatrix} \quad\longrightarrow\quad c'_j = \frac{c_j}{b_j - a_j c'_{j-1}}, \qquad d'_j = \frac{d_j - a_j d'_{j-1}}{b_j - a_j c'_{j-1}}

한 번 전진해서 cj′, dj′c'_j,\ d'_j를 만들고 한 번 후진해서 xj=dj′−cj′xj+1x_j = d'_j - c'_j x_{j+1}로 푼다.

일반적으로 대각에서 거리 ww 안에만 성분이 있으면(띠 폭 ww) 소거 비용이 nw2n w^2이다. 2차원 N×NN \times N 격자를 행 순서로 번호 매기면 n=N2n = N^2, w=Nw = N이므로 비용은 N4=n2N^4 = n^2; 3차원은 n=N3n = N^3, w=N2w = N^2이라 N7=n7/3N^7 = n^{7/3}이다. 차원이 오를수록 직접법의 상대적 비용이 급히 커지는데, 6절의 반복법이 필요한 자리가 정확히 여기다.

반복 해법과 수렴(야코비·가우스-자이델)

섹션 제목: “반복 해법과 수렴(야코비·가우스-자이델)”

5절의 직접법은 유한 번의 연산으로 (반올림을 빼면) 정확한 답을 준다. 그런데 3차원 소자를 100×100×100100 \times 100 \times 100 격자로 이산화하면 미지수가 10610^{6}개이고, 띠 폭이 10410^{4}라 직접법의 비용 nw2=1014n w^2 = 10^{14}은 감당이 안 된다. 반면 행렬–벡터 곱 AxA\mathbf{x}는 0이 아닌 성분 수만큼, 즉 7×1067 \times 10^{6}번이면 된다. 행렬–벡터 곱만으로 답에 다가가는 방법이 반복법이고, 반복 횟수가 10810^{8}번보다 훨씬 적으면 이긴다.

Ax=bA\mathbf{x} = \mathbf{b}의 ii번째 방정식을 xix_i에 대해 푼 꼴로 다시 쓴다.

xi=1aii(bi−∑j≠iaij xj)x_i = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \neq i} a_{ij}\,x_j\Bigr)

우변에 현재 추정 x(m)\mathbf{x}^{(m)}을 넣어 좌변의 새 추정 x(m+1)\mathbf{x}^{(m+1)}을 얻는 것이 야코비 반복이다. 한 바퀴(sweep)에 모든 ii를 돈다. 가우스–자이델 반복은 한 가지만 다르다 — xix_i를 갱신할 때 이미 갱신된 x1,…,xi−1x_1, \ldots, x_{i-1}의 새 값을 즉시 쓴다.

xi(m+1)=1aii(bi−∑j<iaij xj(m+1)−∑j>iaij xj(m))x_i^{(m+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j < i} a_{ij}\,x_j^{(m+1)} - \sum_{j > i} a_{ij}\,x_j^{(m)}\Bigr)

야코비는 두 벡터를 들고 있어야 하고 순서가 상관없어 병렬화가 쉽다. 가우스–자이델은 한 벡터를 제자리에서 덮어쓰고, 대개 야코비의 두 배 빠르다.

Kreyszig는 대각을 1로 정규화한 뒤(aii=1a_{ii} = 1이 되게 각 행을 나눈다) A=I+L+UA = I + L + U로 쪼개 적는다 — 여기서 L, UL,\ U는 5절의 LU 인자가 아니라 AA의 순수한 아래·위 삼각 부분이다. 그러면

야코비:x(m+1)=b−(L+U) x(m)가우스–자이델:x(m+1)=b−L x(m+1)−U x(m)  ⟹  x(m+1)=(I+L)−1(b−Ux(m))\begin{aligned} \text{야코비:}\quad &\mathbf{x}^{(m+1)} = \mathbf{b} - (L + U)\,\mathbf{x}^{(m)} \\ \text{가우스–자이델:}\quad &\mathbf{x}^{(m+1)} = \mathbf{b} - L\,\mathbf{x}^{(m+1)} - U\,\mathbf{x}^{(m)} \;\Longrightarrow\; \mathbf{x}^{(m+1)} = (I + L)^{-1}\bigl(\mathbf{b} - U\mathbf{x}^{(m)}\bigr) \end{aligned}

두 방법 모두 x(m+1)=Cx(m)+c\mathbf{x}^{(m+1)} = C\mathbf{x}^{(m)} + \mathbf{c} 꼴이다(야코비는 C=−(L+U)C = -(L + U), 가우스–자이델은 C=−(I+L)−1UC = -(I + L)^{-1}U). 참해 x\mathbf{x}도 같은 식을 만족하므로 빼면 오차 e(m)=x−x(m)\mathbf{e}^{(m)} = \mathbf{x} - \mathbf{x}^{(m)}에 대해

e(m+1)=C e(m)  ⟹  e(m)=Cm e(0)\mathbf{e}^{(m+1)} = C\,\mathbf{e}^{(m)} \;\Longrightarrow\; \mathbf{e}^{(m)} = C^m\,\mathbf{e}^{(0)}

Cm→OC^m \to O일 필요충분조건은 CC의 모든 고유값의 절댓값이 1보다 작은 것, 즉 스펙트럼 반지름 ρ(C)<1\rho(C) < 1이다(1.3.5닮음 변환과 대각화 — 대각화하면 Cm=XDmX−1C^m = X D^m X^{-1}이고 DmD^m의 성분이 λjm\lambda_j^m). 수렴 속도는 가장 큰 고유값이 정한다.

∥e(m)∥∼ρ(C)m ∥e(0)∥  ⟹  자릿수 하나 얻는 데 ln⁡10−ln⁡ρ(C) 번\lVert \mathbf{e}^{(m)} \rVert \sim \rho(C)^m\, \lVert \mathbf{e}^{(0)} \rVert \;\Longrightarrow\; \text{자릿수 하나 얻는 데 } \frac{\ln 10}{-\ln \rho(C)} \text{ 번}

ρ=0.5\rho = 0.5면 3.3번, ρ=0.99\rho = 0.99면 230번, ρ=0.999\rho = 0.999면 2300번이다. 반복법의 좋고 나쁨은 전부 ρ\rho가 1에 얼마나 가까운가의 문제다.

고유값을 미리 구하기는 어려우므로 실제로는 충분조건을 쓴다. 어떤 행렬 노름(7절)에서든 ∥C∥<1\lVert C \rVert < 1이면 ρ(C)≤∥C∥<1\rho(C) \le \lVert C \rVert < 1이다. 행합 노름으로 쓰면 가장 쉬운 판정이 나온다 —

∣aii∣>∑j≠i∣aij∣(모든 i)\lvert a_{ii} \rvert > \sum_{j \neq i} \lvert a_{ij} \rvert \quad(\text{모든 } i)

즉 강한 대각 우세이면 야코비도 가우스–자이델도 수렴한다. 이산 라플라시안은 대각이 −4-4, 비대각 합이 4라 등호가 성립하는 경계 상황인데, 경계 조건이 있는 행 몇 개에서 부등호가 성립하면 그것으로 충분하다는 것이 알려져 있다(약한 대각 우세 + 기약).

얼마나 느린가 — 라플라스 방정식의 경우

섹션 제목: “얼마나 느린가 — 라플라스 방정식의 경우”

N×NN \times N 격자의 5점 라플라시안(11절)에 대해 야코비 반복 행렬의 고유값은 정확히 알려져 있다.

λpq=12(cos⁡pπN+1+cos⁡qπN+1),ρJ=cos⁡πN+1≈1−π22N2\lambda_{pq} = \tfrac12\Bigl(\cos\frac{p\pi}{N+1} + \cos\frac{q\pi}{N+1}\Bigr), \qquad \rho_J = \cos\frac{\pi}{N+1} \approx 1 - \frac{\pi^2}{2N^2}

N=100N = 100이면 ρJ≈0.9995\rho_J \approx 0.9995 — 자릿수 하나에 4700번, 여섯 자리에 3만 번이다. 가우스–자이델은 ρGS=ρJ2\rho_{GS} = \rho_J^2이라 절반, 그래도 만 번이 넘는다. 게다가 NN을 두 배로 하면 ρ\rho가 1에 네 배 가까워져 반복 횟수가 네 배가 되고, 한 바퀴 비용도 네 배이니 전체가 열여섯 배다.

0 50 100 150 200 10⁰ 10⁻² 10⁻⁴ 10⁻⁶ 10⁻⁸ 반복 횟수 m → 오차 ‖e⁽ᵐ⁾‖ / ‖e⁽⁰⁾‖ 야코비 ρ = 0.959 가우스–자이델 ρ = 0.921 SOR (ω = 1.56) ρ = 0.560 10 × 10 격자의 라플라스 방정식 — 기울기 = log ρ(C)
그림 1.12-4. 같은 라플라스 문제에 대한 세 반복법의 오차를 반복 횟수에 대해 반대수 축에 그린 것. 직선의 기울기가 log ρ(C)이므로 기울기가 가파를수록 빠르다. 가우스–자이델은 야코비의 정확히 두 배 기울기(ρ_GS = ρ_J²)이고, 최적 과완화(SOR)는 격자가 커질수록 두 방법과의 격차가 벌어져 반복 횟수가 N²이 아니라 N에 비례한다. 오차가 곧장 직선을 타지 않고 처음 몇 번 빨리 떨어지는 것은 고주파 오차 성분이 먼저 사라지는 구간이다.직접 작도

가우스–자이델이 한 걸음에 Δxi\Delta x_i만큼 고친다면, 그보다 더 밀어 본다.

xi(m+1)=xi(m)+ω ΔxiGS,1<ω<2x_i^{(m+1)} = x_i^{(m)} + \omega\,\Delta x_i^{GS}, \qquad 1 < \omega < 2

ω=1\omega = 1이면 가우스–자이델이고, ω>1\omega > 1이 연속 과완화(SOR, successive over-relaxation)다. ω≥2\omega \ge 2면 발산한다. 최적 ω\omega는 야코비의 스펙트럼 반지름으로 정해진다.

ωopt=21+1−ρJ2,ρSOR=ωopt−1≈1−2πN\omega_{\text{opt}} = \frac{2}{1 + \sqrt{1 - \rho_J^2}}, \qquad \rho_{\text{SOR}} = \omega_{\text{opt}} - 1 \approx 1 - \frac{2\pi}{N}

1−π2/2N21 - \pi^2/2N^2이 1−2π/N1 - 2\pi/N으로 — 11에서의 거리가 N2N^2 급에서 NN 급으로 좋아졌다. N=100N = 100이면 ρSOR≈0.94\rho_{\text{SOR}} \approx 0.94, 자릿수 하나에 37번이다. 가우스–자이델의 4700번에 비하면 백 배가 넘는다. 단 ω\omega가 최적에서 조금만 벗어나도 이득이 급히 줄고, 최적값은 문제마다 다르므로 실제로는 ρJ\rho_J를 추정해 가며 맞춘다.

크릴로프 부분공간법 — 현대의 표준

섹션 제목: “크릴로프 부분공간법 — 현대의 표준”

야코비·가우스–자이델·SOR은 고정 반복이다 — 매번 같은 CC를 곱한다. 현대의 반복법은 다르게 간다. 지금까지 만든 벡터들 r, Ar, A2r, …\mathbf{r},\ A\mathbf{r},\ A^2\mathbf{r},\ \ldots이 펼치는 공간(크릴로프 부분공간) 안에서 가장 좋은 근사를 매번 고른다.

  • 켤레 기울기법(CG) — AA가 대칭 양의 정부호일 때. 잔차가 서로 AA-직교가 되게 방향을 고르며, 반복 횟수가 κ(A)\sqrt{\kappa(A)}에 비례한다(7절). 라플라시안이면 κ∼N2\kappa \sim N^2이라 NN번 — SOR과 같은 급이지만 ω\omega 같은 조율 파라미터가 없다. 14절에서 최적화로 다시 나온다.
  • GMRES · BiCGSTAB — 비대칭 행렬용. 소자 시뮬레이션의 야코비 행렬은 드리프트 항 때문에 비대칭이라 이쪽을 쓴다.

어느 방법이든 성패는 전처리(preconditioning)에 달려 있다. Ax=bA\mathbf{x} = \mathbf{b} 대신 M−1Ax=M−1bM^{-1}A\mathbf{x} = M^{-1}\mathbf{b}를 풀되, MM은 AA와 비슷하면서 풀기 쉬운 행렬로 잡는다 (불완전 LU, 야코비의 대각, 다중 격자 한 바퀴). M−1AM^{-1}A의 고유값이 1 근처로 뭉치면 반복이 몇 십 번에 끝난다. 시뮬레이터 설정의 ILU, AMG 같은 항목이 이 MM의 선택이다.

“오차가 작다”고 말하려면 벡터의 크기를 재는 자가 있어야 한다. 1.2에서 내적으로 정의한 유클리드 길이(1.2.5벡터공간과 내적공간)가 그 하나이고, 수치해석은 셋을 나란히 쓴다.

∥x∥1=∑j∣xj∣,∥x∥2=(∑jxj2)1/2,∥x∥∞=max⁡j∣xj∣\lVert \mathbf{x} \rVert_1 = \sum_j \lvert x_j \rvert, \qquad \lVert \mathbf{x} \rVert_2 = \Bigl(\sum_j x_j^2\Bigr)^{1/2}, \qquad \lVert \mathbf{x} \rVert_\infty = \max_j \lvert x_j \rvert

∥⋅∥1\lVert \cdot \rVert_1은 성분의 합(택시 거리), ∥⋅∥2\lVert \cdot \rVert_2는 유클리드 길이, ∥⋅∥∞\lVert \cdot \rVert_\infty는 가장 큰 성분이다. 어느 것을 써도 “0에 간다”는 결론은 같다 — 유한 차원에서는 상수배 안에서 서로 갈음되기 때문이다(∥x∥∞≤∥x∥2≤n ∥x∥∞\lVert \mathbf{x} \rVert_\infty \le \lVert \mathbf{x} \rVert_2 \le \sqrt{n}\, \lVert \mathbf{x} \rVert_\infty). 다만 값과 편의가 다르다. ∞\infty-노름은 계산이 가장 싸고 “최악의 성분”을 말해 주며, 2-노름은 회전에 불변이라 이론에 편하다.

행렬의 노름은 벡터를 얼마나 늘일 수 있는가로 정의한다.

∥A∥=max⁡x≠0∥Ax∥∥x∥\lVert A \rVert = \max_{\mathbf{x} \neq \mathbf{0}} \frac{\lVert A\mathbf{x} \rVert}{\lVert \mathbf{x} \rVert}

벡터 노름마다 하나씩 딸려 나오고(유도 노름), 셋은 닫힌 꼴이 있다.

노름값읽는 법
∥A∥1\lVert A \rVert_1max⁡j∑i∣aij∣\max_j \sum_i \lvert a_{ij} \rvert열합의 최대
∥A∥∞\lVert A \rVert_\inftymax⁡i∑j∣aij∣\max_i \sum_j \lvert a_{ij} \rvert행합의 최대
∥A∥2\lVert A \rVert_2ρ(ATA)=σmax⁡\sqrt{\rho(A^{\mathsf{T}}A)} = \sigma_{\max}최대 특이값. AA 대칭이면 max⁡∣λ∣\max \lvert \lambda \rvert
∥A∥F\lVert A \rVert_F(∑i,jaij2)1/2\bigl(\sum_{i,j} a_{ij}^2\bigr)^{1/2}프로베니우스. 유도 노름은 아니지만 계산이 쉽다

유도 노름은 정의에서 바로 ∥Ax∥≤∥A∥ ∥x∥\lVert A\mathbf{x} \rVert \le \lVert A \rVert\, \lVert \mathbf{x} \rVert와 ∥AB∥≤∥A∥ ∥B∥\lVert AB \rVert \le \lVert A \rVert\, \lVert B \rVert를 만족한다. 6절의 수렴 판정 ∥C∥<1\lVert C \rVert < 1이 이 부등식이었다. 그리고 어느 노름에서든 ρ(A)≤∥A∥\rho(A) \le \lVert A \rVert다 — 고유벡터를 넣으면 ∥Ax∥=∣λ∣ ∥x∥\lVert A\mathbf{x} \rVert = \lvert \lambda \rvert\, \lVert \mathbf{x} \rVert이기 때문이다.

조건수 — 문제가 얼마나 예민한가

섹션 제목: “조건수 — 문제가 얼마나 예민한가”

Ax=bA\mathbf{x} = \mathbf{b}에서 우변이 δb\delta\mathbf{b}만큼 흔들리면 해는 얼마나 흔들리는가. A(x+δx)=b+δbA(\mathbf{x} + \delta\mathbf{x}) = \mathbf{b} + \delta\mathbf{b}에서 δx=A−1δb\delta\mathbf{x} = A^{-1}\delta\mathbf{b}이므로

∥δx∥≤∥A−1∥ ∥δb∥,∥b∥≤∥A∥ ∥x∥\lVert \delta\mathbf{x} \rVert \le \lVert A^{-1} \rVert\, \lVert \delta\mathbf{b} \rVert, \qquad \lVert \mathbf{b} \rVert \le \lVert A \rVert\, \lVert \mathbf{x} \rVert

두 부등식을 나누면 상대 변화 사이의 관계가 나온다.

  ∥δx∥∥x∥≤∥A∥ ∥A−1∥⏟κ(A)  ∥δb∥∥b∥  \boxed{\; \frac{\lVert \delta\mathbf{x} \rVert}{\lVert \mathbf{x} \rVert} \le \underbrace{\lVert A \rVert\, \lVert A^{-1} \rVert}_{\kappa(A)}\; \frac{\lVert \delta\mathbf{b} \rVert}{\lVert \mathbf{b} \rVert} \;}

κ(A)=∥A∥ ∥A−1∥\kappa(A) = \lVert A \rVert\, \lVert A^{-1} \rVert가 조건수다. 입력의 상대 오차가 답의 상대 오차로 최대 κ\kappa배 증폭된다. AA가 δA\delta A만큼 흔들릴 때도 1차 근사에서 같은 꼴이다. 언제나 κ≥1\kappa \ge 1이고(∥I∥=1=∥AA−1∥≤κ\lVert I \rVert = 1 = \lVert AA^{-1} \rVert \le \kappa), 직교행렬은 κ2=1\kappa_2 = 1로 최선이다. κ\kappa가 크면 불량 조건(ill-conditioned)이라 한다.

조건이 좋다 — κ 작음 직선을 옮긴 만큼만 교점이 움직인다 조건이 나쁘다 — κ 큼 같은 만큼 옮겼는데 교점이 멀리 달아난다 점선: 우변 b가 조금 흔들린 방정식 채운 점: 원래 해 · 빈 점: 흔들린 해
그림 1.12-5. 2 × 2 선형계의 두 방정식을 직선으로 그린 것. 왼쪽은 두 직선이 거의 수직이라(조건이 좋다) 한 직선을 조금 옮겨도 교점이 조금만 움직인다. 오른쪽은 두 직선이 거의 평행이라(조건이 나쁘다) 같은 크기로 옮겼는데 교점이 멀리 달아난다. 두 경우 모두 행렬은 정칙이고 가우스 소거는 정상적으로 끝난다 — 조건수는 알고리즘이 아니라 문제의 성질이다.직접 작도

Kreyszig가 드는 표준 예가 힐베르트 행렬 hij=1/(i+j−1)h_{ij} = 1/(i + j - 1)이다. 3×33 \times 3만 해도 κ≈748\kappa \approx 748, 6×66 \times 6은 10710^{7}, 10×1010 \times 10은 101310^{13}이다. 단항식 1,x,x2,…1, x, x^2, \ldots로 최소제곱 다항식 맞춤을 하면 정규방정식이 정확히 이 꼴이 되므로, 8절에서 말하듯 고차 다항식 맞춤은 단항식 기저로 하면 안 된다.

계산한 x~\tilde{\mathbf{x}}가 얼마나 좋은지 보려고 잔차 r=b−Ax~\mathbf{r} = \mathbf{b} - A\tilde{\mathbf{x}}를 계산해 작으면 안심한다. 위험한 습관이다. r=A(x−x~)\mathbf{r} = A(\mathbf{x} - \tilde{\mathbf{x}})이므로 위 정리에 δb=r\delta\mathbf{b} = \mathbf{r}을 넣으면

∥x−x~∥∥x∥≤κ(A) ∥r∥∥b∥\frac{\lVert \mathbf{x} - \tilde{\mathbf{x}} \rVert}{\lVert \mathbf{x} \rVert} \le \kappa(A)\,\frac{\lVert \mathbf{r} \rVert}{\lVert \mathbf{b} \rVert}

잔차가 10−1010^{-10}이어도 κ=108\kappa = 10^{8}이면 오차는 10−210^{-2}일 수 있다. 반대 방향의 부등식도 있어서, 잔차가 크면 오차도 확실히 크다. 즉 잔차는 오차의 하한은 주지만 상한은 κ\kappa를 알아야 준다. 2절의 뉴턴 수렴 판정에서 “잔차만으로는 안 된다”고 한 것이 이 식이다.

조건수는 문제의 성질이라 알고리즘으로는 못 고친다. 할 수 있는 것은 문제를 바꾸는 것이다.

  • 스케일링. 미지수와 방정식의 단위를 맞춘다. 행렬의 한 행이 102010^{20} 급이고 다른 행이 10010^{0} 급이면 그 자체로 κ≥1020\kappa \ge 10^{20}이다. 각 행·열을 적당한 대각행렬로 나누면 κ\kappa가 극적으로 준다.
  • 기저 바꾸기. 단항식 대신 직교 다항식(르장드르·체비쇼프), 정규방정식 대신 QR(8절).
  • 정칙화. 뭉개진 방향을 아예 버리거나(σmin⁡\sigma_{\min} 절단, 8절의 SVD) 작은 벌칙 항을 더해 그 방향을 고정한다(ATA+μIA^{\mathsf{T}}A + \mu I, 14절의 레벤버그–마쿼트).

측정은 언제나 미지수보다 많다. 저항 하나를 재려고 전류 열 점에서 전압을 재면 방정식이 열 개, 미지수는 하나다. Ax=bA\mathbf{x} = \mathbf{b}에서 AA가 m×nm \times n, m>nm > n이면 일반적으로 해가 없다 — b\mathbf{b}가 AA의 열공간 밖에 있다. 1.2에서 본 대로(1.2.4역행렬) 그때 할 수 있는 최선은 잔차의 길이를 최소로 하는 것이다.

min⁡x∥b−Ax∥22=min⁡x∑i=1m(bi−∑jaijxj)2\min_{\mathbf{x}} \lVert \mathbf{b} - A\mathbf{x} \rVert_2^2 = \min_{\mathbf{x}} \sum_{i=1}^{m}\Bigl(b_i - \sum_j a_{ij}x_j\Bigr)^2

제곱합을 쓰는 이유는 셋이다. 미분이 되어 닫힌 해가 나오고, 2-노름이라 기하(정사영)가 있으며, 잡음이 정규분포이면 이것이 최대가능도 추정이다(1.11.12회귀와 상관 (공정 데이터로의 적용은 19.9·19.12)). 각 xjx_j로 미분해 0으로 놓으면

  ATA x=ATb  \boxed{\;A^{\mathsf{T}}A\,\mathbf{x} = A^{\mathsf{T}}\mathbf{b}\;}

정규방정식이다. n×nn \times n 대칭 양의 정부호 계라 콜레스키(5절)로 풀린다. 기하로는 “잔차 b−Ax\mathbf{b} - A\mathbf{x}가 AA의 모든 열에 수직”이고, 그것이 정사영의 조건이다.

y=a+bxy = a + bx를 점 (xi,yi)(x_i, y_i) mm개에 맞추면 AA의 열이 (1,…,1)(1, \ldots, 1)과 (x1,…,xm)(x_1, \ldots, x_m)이므로 정규방정식은 2×22 \times 2다.

[m∑xi∑xi∑xi2][ab]=[∑yi∑xiyi]  ⟹  b=m∑xiyi−∑xi∑yim∑xi2−(∑xi)2,a=yˉ−bxˉ\begin{bmatrix} m & \sum x_i \\ \sum x_i & \sum x_i^2 \end{bmatrix} \begin{bmatrix} a \\ b \end{bmatrix} = \begin{bmatrix} \sum y_i \\ \sum x_i y_i \end{bmatrix} \;\Longrightarrow\; b = \frac{m\sum x_i y_i - \sum x_i \sum y_i}{m \sum x_i^2 - (\sum x_i)^2}, \quad a = \bar y - b\bar x

bb의 분모는 m2×(x의 분산)m^2 \times (x\text{의 분산})이고 분자는 m2×(x,y의 공분산)m^2 \times (x, y\text{의 공분산})이다 — 기울기 = 공분산/분산. 다항식 y=a0+a1x+⋯+akxky = a_0 + a_1 x + \cdots + a_k x^k이면 AA의 열이 xi0,…,xikx_i^0, \ldots, x_i^k이고 정규방정식은 (k+1)×(k+1)(k+1) \times (k+1)이다. 여기서 7절의 힐베르트 행렬이 나온다 — xix_i가 [0,1][0, 1]에 고르게 있으면 ∑xij+l≈m/(j+l+1)\sum x_i^{j+l} \approx m/(j + l + 1)이라 정확히 힐베르트 꼴이다.

정규방정식은 κ(ATA)=κ(A)2\kappa(A^{\mathsf{T}}A) = \kappa(A)^2이다(2-노름에서 ATAA^{\mathsf{T}}A의 고유값이 AA의 특이값의 제곱이므로). κ(A)=106\kappa(A) = 10^{6}이면 정규방정식은 101210^{12} — 열 자리 얻을 문제를 네 자리로 만든다. ATAA^{\mathsf{T}}A를 만드는 순간 자릿수를 절반 잃는다.

우회로는 AA를 직접 직교 분해하는 것이다. 그람–슈미트(1.2.5벡터공간과 내적공간)나 하우스홀더 반사로 A=QRA = QR(QQ는 열이 정규직교인 m×nm \times n, RR은 n×nn \times n 상삼각)을 만들면

∥b−Ax∥=∥b−QRx∥  ⟹  Rx=QTb\lVert \mathbf{b} - A\mathbf{x} \rVert = \lVert \mathbf{b} - QR\mathbf{x} \rVert \;\Longrightarrow\; R\mathbf{x} = Q^{\mathsf{T}}\mathbf{b}

직교행렬은 길이를 보존하므로 조건수가 제곱되지 않고 κ(A)\kappa(A) 그대로다. 후진 대입 하나로 끝난다. 라이브러리의 lstsq가 기본으로 하는 것이 이것(또는 아래의 SVD)이고, 정규방정식은 교과서의 유도용이다.

특이값 분해 — 뭉개진 방향을 본다

섹션 제목: “특이값 분해 — 뭉개진 방향을 본다”

1.2가 “1.12에서 다룬다”고 미뤄 둔 것이 이것이다. 임의의 m×nm \times n 행렬은

A=UΣVT,Σ=diag⁡(σ1≥σ2≥⋯≥σn≥0)A = U\Sigma V^{\mathsf{T}}, \qquad \Sigma = \operatorname{diag}(\sigma_1 \ge \sigma_2 \ge \cdots \ge \sigma_n \ge 0)

으로 쪼개진다. UU(m×mm \times m)와 VV(n×nn \times n)는 직교행렬, σj\sigma_j가 특이값이다. ATA=VΣ2VTA^{\mathsf{T}}A = V\Sigma^2 V^{\mathsf{T}}이므로 σj2\sigma_j^2은 ATAA^{\mathsf{T}}A의 고유값, VV의 열은 그 고유벡터다 — 1.3의 대칭 행렬 대각화를 정사각이 아닌 행렬로 확장한 것이다.

SVD가 있으면 최소제곱은 각 특이 방향에서 나눗셈이다.

x=VΣ+UTb=∑jujTbσj vj\mathbf{x} = V\Sigma^{+}U^{\mathsf{T}}\mathbf{b} = \sum_{j} \frac{\mathbf{u}_j^{\mathsf{T}}\mathbf{b}}{\sigma_j}\,\mathbf{v}_j

Σ+\Sigma^{+}는 0이 아닌 σj\sigma_j를 역수로 바꾼 것이고, 이것이 1.2에서 이름만 나온 유사역행렬 A+A^{+}다. 식이 말해 주는 것이 두 가지다. 첫째, σj\sigma_j가 0이면 그 항을 버린다 — 계수가 모자란 경우에도 노름이 가장 작은 해를 준다. 둘째, σj\sigma_j가 0은 아닌데 아주 작으면 1/σj1/\sigma_j가 잡음을 폭발시킨다. 그때 그 항을 버리거나(절단 SVD) σj/(σj2+μ2)\sigma_j/(\sigma_j^2 + \mu^2)로 눌러 주는 것(티호노프 정칙화)이 7절 끝에서 말한 처방이다.

파라미터 추출에서 이것이 뜻하는 바 — 두 파라미터가 데이터에 같은 방향으로만 영향을 주면(예: 이동도와 채널 폭은 선형 영역 전류에 곱으로만 들어간다) 그 조합에 해당하는 σj\sigma_j가 0에 가깝고, 둘을 따로 추출하려는 시도는 잡음을 맞추는 일이 된다. SVD의 작은 특이값에 딸린 vj\mathbf{v}_j가 어느 파라미터 조합이 결정되지 않는지를 알려 준다.

측정마다 잡음의 크기가 다르면 정확한 점에 더 무게를 준다.

min⁡∑iwi (bi−(Ax)i)2,wi=1σi2\min \sum_i w_i\,(b_i - (A\mathbf{x})_i)^2, \qquad w_i = \frac{1}{\sigma_i^2}

잡음의 분산 σi2\sigma_i^2의 역수가 통계적으로 맞는 가중치다. 앞의 아레니우스 예에서 로그를 취하면 자동으로 wi∝Di2w_i \propto D_i^2이 되는 셈이고, 그것이 잡음의 성질과 맞는지가 로그 맞춤의 타당성을 정한다. 전류처럼 열 자릿수를 오가는 양을 맞출 때는 로그 잔차나 상대 잔차를 쓰지 않으면 큰 전류만 맞고 서브스레숄드 영역은 전혀 맞지 않는다.

비선형 최소제곱 — 가우스–뉴턴과 레벤버그–마쿼트

섹션 제목: “비선형 최소제곱 — 가우스–뉴턴과 레벤버그–마쿼트”

모델이 파라미터에 비선형이면(I=Is(eV/nVT−1)I = I_s(e^{V/nV_T} - 1)에서 nn, 타원계측의 굴절률 모델, SPICE 모델 파라미터 전부) 정규방정식이 없다. 2절의 뉴턴법을 끌어온다. 잔차 벡터 r(p)=b−f(p)\mathbf{r}(\mathbf{p}) = \mathbf{b} - \mathbf{f}(\mathbf{p})를 현재 파라미터 근처에서 선형화하면 r(p+δ)≈r−Jδ\mathbf{r}(\mathbf{p} + \delta) \approx \mathbf{r} - J\delta(Jij=∂fi/∂pjJ_{ij} = \partial f_i/\partial p_j)이고, 이것의 최소제곱이

JTJ δ=JTrJ^{\mathsf{T}}J\,\delta = J^{\mathsf{T}}\mathbf{r}

가우스–뉴턴법이다. 매 걸음이 선형 최소제곱이고, 해 근처에서 거의 2차로 수렴한다. 멀리서는 뉴턴법과 같은 이유로 튀므로 감쇠를 넣는다.

(JTJ+μI) δ=JTr(J^{\mathsf{T}}J + \mu I)\,\delta = J^{\mathsf{T}}\mathbf{r}

μ\mu가 크면 δ≈JTr/μ\delta \approx J^{\mathsf{T}}\mathbf{r}/\mu — 14절의 최급강하 방향으로 작은 걸음이고, μ→0\mu \to 0이면 가우스–뉴턴이다. 걸음이 잔차를 줄이면 μ\mu를 낮추고, 늘리면 μ\mu를 올린다. 이것이 레벤버그–마쿼트법이고, 곡선 맞춤 라이브러리의 기본 알고리즘이다. μI\mu I가 JTJJ^{\mathsf{T}}J의 작은 고유값을 밀어 올려 조건수를 낮추는 정칙화이기도 하다는 점이 7절과 잇는 고리다.

특성 다항식으로는 구하지 않는다

섹션 제목: “특성 다항식으로는 구하지 않는다”

1.3에서 고유값을 det⁡(A−λI)=0\det(A - \lambda I) = 0의 근으로 정의했고, 손 계산은 그렇게 했다. 컴퓨터는 절대 그렇게 하지 않는다. 이유는 1.3의 1절에서 이미 봤다(1.3.1고유값 방정식과 특성 다항식 — 윌킨슨의 예) — 다항식의 근은 계수에 극도로 예민해서, 계수를 10−1010^{-10}만큼 흔들면 근이 10−110^{-1}만큼 움직인다. 특성 다항식의 계수를 계산하는 과정에서 반올림이 반드시 들어가므로, 얻은 근은 원래 행렬의 고유값과 무관해진다.

그래서 수치 고유값 계산은 행렬에서 다항식을 거치지 않고 행렬을 직접 변형해 간다. 크게 두 부류다 — 고유값 하나(또는 몇 개)를 반복으로 얻는 멱승법 계열과, 전부를 닮음 변환으로 얻는 QR 계열.

게르슈고린 — 계산 없이 고유값이 있는 자리

섹션 제목: “게르슈고린 — 계산 없이 고유값이 있는 자리”

먼저 계산 없이 아는 것이 있다. 모든 고유값은 복소평면의 원판

∣λ−ajj∣≤∑k≠j∣ajk∣(j=1,…,n)\lvert \lambda - a_{jj} \rvert \le \sum_{k \neq j} \lvert a_{jk} \rvert \qquad (j = 1, \ldots, n)

의 합집합 안에 있다(게르슈고린 정리). 증명은 한 줄이다 — 고유벡터의 가장 큰 성분을 xjx_j라 하고 jj번째 방정식 ∑kajkxk=λxj\sum_k a_{jk}x_k = \lambda x_j를 (λ−ajj)xj=∑k≠jajkxk(\lambda - a_{jj})x_j = \sum_{k \neq j} a_{jk}x_k로 정리한 뒤 ∣xj∣\lvert x_j \rvert로 나누면 우변이 원판의 반지름 이하다.

대각 성분을 중심으로, 그 행의 비대각 절댓값 합을 반지름으로 하는 원판이다. 비대각이 작으면 고유값은 대각 성분 근처에 있고, 대각 우세면 원판이 원점을 포함하지 않아 행렬이 정칙이다 — 6절의 대각 우세 수렴 판정이 이 정리의 따름이다. 반복법의 초기값과 아래 QR의 이동량(shift)을 고를 때 쓴다.

아무 벡터 x(0)\mathbf{x}^{(0)}에 AA를 거듭 곱한다. 고유기저로 전개하면 (1.3.5닮음 변환과 대각화)

Amx(0)=∑jcjλjmvj=λ1m[c1v1+c2(λ2λ1)mv2+⋯ ]A^m\mathbf{x}^{(0)} = \sum_j c_j \lambda_j^m \mathbf{v}_j = \lambda_1^m\Bigl[c_1\mathbf{v}_1 + c_2\Bigl(\frac{\lambda_2}{\lambda_1}\Bigr)^m\mathbf{v}_2 + \cdots\Bigr]

∣λ1∣>∣λ2∣≥⋯\lvert \lambda_1 \rvert > \lvert \lambda_2 \rvert \ge \cdots이면 대괄호 안의 둘째 항부터 전부 0으로 가고, 절댓값이 가장 큰 고유값의 고유벡터만 남는다. 매번 노름으로 나눠 크기를 1로 유지하면 그것이 멱승법이다. 수렴 속도는 ∣λ2/λ1∣m\lvert \lambda_2/\lambda_1 \rvert^m — 두 고유값의 비가 수렴의 전부다. 비가 0.5면 빠르고, 0.99면 6절의 야코비 반복만큼 느리다.

고유값 자체는 레일리 몫으로 읽는다(1.3.7이차 형식과 주축 변환).

q=xTAxxTxq = \frac{\mathbf{x}^{\mathsf{T}}A\mathbf{x}}{\mathbf{x}^{\mathsf{T}}\mathbf{x}}

AA가 대칭이면 qq는 고유값의 가중 평균이고, Kreyszig가 증명하는 오차 한계가 딸려 있다.

∣λ−q∣≤δ,δ2=xTA2xxTx−q2=∥Ax−qx∥2∥x∥2\lvert \lambda - q \rvert \le \delta, \qquad \delta^2 = \frac{\mathbf{x}^{\mathsf{T}}A^2\mathbf{x}}{\mathbf{x}^{\mathsf{T}}\mathbf{x}} - q^2 = \frac{\lVert A\mathbf{x} - q\mathbf{x} \rVert^2}{\lVert \mathbf{x} \rVert^2}

δ\delta는 “x\mathbf{x}가 고유벡터에서 얼마나 벗어났는가”의 잔차이고, 어떤 고유값 하나는 반드시 qq에서 δ\delta 안에 있다. 고유벡터의 오차가 ε\varepsilon이면 레일리 몫의 오차는 ε2\varepsilon^2이다 — 1.3의 변분 원리가 수치적으로 하는 말이다.

역반복 — 원하는 고유값을 골라 뽑는다

섹션 제목: “역반복 — 원하는 고유값을 골라 뽑는다”

AA 대신 (A−σI)−1(A - \sigma I)^{-1}에 멱승법을 쓴다. 이 행렬의 고유값은 1/(λj−σ)1/(\lambda_j - \sigma)이므로 σ\sigma에 가장 가까운 λj\lambda_j가 지배적이 되고, 수렴비는 ∣λj−σ∣/∣λk−σ∣\lvert \lambda_j - \sigma \rvert / \lvert \lambda_k - \sigma \rvert(λk\lambda_k는 둘째로 가까운 것)다. σ\sigma를 목표 고유값 가까이 잡으면 이 비가 0에 가까워 두세 번에 끝난다. 역행렬은 구하지 않고, 매 반복 (A−σI)y=x(A - \sigma I)\mathbf{y} = \mathbf{x}를 5절의 LU로 푼다 — 한 번 분해해 두고 우변만 바꾸는 바로 그 경우다.

σ\sigma를 매번 최신 레일리 몫으로 갱신하면 레일리 몫 반복이고, 대칭 행렬에서 수렴이 3차다 — 자릿수가 매번 세 배. 1.3의 7절이 “1.12에서 다룬다”고 미룬 것이 이것이다.

고유값 전부가 필요하면 멱승법을 nn번 돌리지 않는다. 행렬을 닮음 변환으로 삼각으로 만든다 (1.3.5닮음 변환과 대각화 — 닮음은 고유값을 보존한다). 절차는 두 단계다.

① 삼중대각(또는 헤센베르크)으로 줄인다. 하우스홀더 반사(직교행렬 P=I−2vvTP = I - 2\mathbf{v}\mathbf{v}^{\mathsf{T}})를 n−2n - 2번 적용해 대칭 행렬을 삼중대각 T=PTAPT = P^{\mathsf{T}}AP로 만든다. 비용 O(n3)O(n^3)이 한 번. 비대칭이면 위 헤센베르크(대각 아래 한 줄까지만 0이 아님)까지 간다.

② QR 반복. TT를 T=QRT = QR로 분해하고 순서를 바꿔 곱한다.

Tk=QkRk,Tk+1=RkQk=QkT Tk QkT_k = Q_k R_k, \qquad T_{k+1} = R_k Q_k = Q_k^{\mathsf{T}}\,T_k\,Q_k

Tk+1T_{k+1}은 TkT_k와 닮음이므로 고유값이 같고, k→∞k \to \infty에서 **상삼각(대칭이면 대각)**으로 수렴한다. 대각선에 고유값이 절댓값 크기 순으로 늘어선다. 삼중대각이라 한 번의 QR 분해가 O(n)O(n)이고, 그래서 전체가 O(n2)O(n^2)에 끝난다.

큰 희소 행렬 — 몇 개만 필요할 때

섹션 제목: “큰 희소 행렬 — 몇 개만 필요할 때”

밴드 계산이나 양자우물의 슈뢰딩거 방정식을 이산화하면 n=104n = 10^{4}에서 10710^{7}의 희소 행렬이 나오고, 필요한 것은 가장 낮은 몇 개의 고유값뿐이다(페르미 준위 근처의 밴드, 속박 준위 몇 개). 삼중대각화는 채워짐 때문에 못 쓰고, 행렬–벡터 곱만으로 가야 한다.

란초스법이 그 답이다. 멱승법이 마지막 벡터 하나만 남기고 버린 것을, 전부 보관해 정규직교화하면(6절의 크릴로프 부분공간) 그 부분공간에서 AA의 표현이 작은 삼중대각 행렬이 되고, 그 고유값이 원래 행렬의 극단 고유값(가장 크고 가장 작은 것)에 빠르게 수렴한다. mm번 곱하면 m×mm \times m 삼중대각 — 그것을 위의 QR로 푼다. 비대칭 버전이 아놀디법이고, 6절의 GMRES와 같은 뼈대다. 평면파 밀도범함수 계산이 매 자기일관 반복마다 하는 일이 이것이다 (정확히는 그 변형인 다비드슨법·켤레기울기 최소화).

ODE의 수치 해법(룽게-쿠타·다단계법)

섹션 제목: “ODE의 수치 해법(룽게-쿠타·다단계법)”

y′=f(x,y)y' = f(x, y), y(x0)=y0y(x_0) = y_0. 1.4에서 해의 존재와 유일성을 보았고(1.4.3방향장과 해의 존재·유일성), 닫힌 해가 있는 경우도 몇 가지 보았다. 그 밖의 경우 — 이동도가 전기장에 비선형인 캐리어 운동, 비선형 소자가 든 회로의 과도 응답, 산화막 성장 속도식 — 는 시작점에서 출발해 한 걸음씩 전진한다. xn=x0+nhx_n = x_0 + nh에서의 근사 yny_n을 앞의 값들로부터 만든다.

이 절의 이름표를 정리해 둔다. 일단계법(one-step)은 yn+1y_{n+1}을 yny_n만으로 만들고 (오일러·룽게–쿠타), 다단계법(multistep)은 yn,yn−1,…y_n, y_{n-1}, \ldots를 함께 쓴다(아담스). 명시적(explicit) 방법은 yn+1y_{n+1}이 우변에 나오지 않아 대입으로 끝나고, 암시적 (implicit) 방법은 yn+1y_{n+1}이 양변에 있어 매 걸음 방정식(비선형이면 2절의 뉴턴법)을 풀어야 한다. 암시적이 비싼데도 쓰는 이유가 이 절의 뒷부분이다.

오일러법 — 접선을 따라 한 걸음

섹션 제목: “오일러법 — 접선을 따라 한 걸음”

가장 단순한 방법이다. 현재 점에서의 기울기 f(xn,yn)f(x_n, y_n)으로 hh만큼 직진한다.

yn+1=yn+h f(xn,yn)y_{n+1} = y_n + h\,f(x_n, y_n)

테일러 전개 y(xn+h)=yn+hy′+12h2y′′+⋯y(x_n + h) = y_n + hy' + \tfrac12 h^2 y'' + \cdots의 첫 두 항이다. 버린 첫 항이 12h2y′′\tfrac12 h^2 y''이므로 한 걸음의 오차(국소 절단 오차)는 O(h2)O(h^2)다. 그런데 구간 [x0,X][x_0, X]를 건너려면 (X−x0)/h(X - x_0)/h 걸음이 필요하고, 오차가 쌓이므로 끝점의 오차 (전역 오차)는 O(h)O(h)다. 이것을 1차 방법이라 한다 — 차수는 언제나 전역 오차로 센다.

1.4의 방향장(1.4.3방향장과 해의 존재·유일성) 위에서 오일러법은 화살표를 따라 짧은 직선을 잇는 일이다. 곡선이 휘는 쪽으로 항상 바깥에서 따라가므로, y′=yy' = y처럼 위로 볼록한 해에서는 늘 아래로 처지고, 그 처짐이 걸음마다 쌓인다.

처짐을 줄이려면 구간 안의 기울기를 여러 곳에서 재어 평균한다. 오일러법으로 끝점을 예측한 뒤 그곳의 기울기와 시작점의 기울기를 평균하는 것이 개선된 오일러법(호인법)이다.

k1=h f(xn,yn)k2=h f(xn+h, yn+k1)yn+1=yn+12(k1+k2)\begin{aligned} k_1 &= h\,f(x_n, y_n) \\ k_2 &= h\,f(x_n + h,\ y_n + k_1) \\ y_{n+1} &= y_n + \tfrac12(k_1 + k_2) \end{aligned}

전역 오차 O(h2)O(h^2) — 4절의 사다리꼴 공식에 해당한다(실제로 ff가 xx만의 함수이면 정확히 사다리꼴이 된다). 기울기를 네 곳에서 재어 심프슨 가중치로 섞으면 고전적 4차 룽게–쿠타법이다.

k1=h f(xn, yn)k2=h f(xn+12h, yn+12k1)k3=h f(xn+12h, yn+12k2)k4=h f(xn+h, yn+k3)yn+1=yn+16 (k1+2k2+2k3+k4)\begin{aligned} k_1 &= h\,f(x_n,\ y_n) \\ k_2 &= h\,f(x_n + \tfrac12 h,\ y_n + \tfrac12 k_1) \\ k_3 &= h\,f(x_n + \tfrac12 h,\ y_n + \tfrac12 k_2) \\ k_4 &= h\,f(x_n + h,\ y_n + k_3) \\[4pt] y_{n+1} &= y_n + \tfrac16\,(k_1 + 2k_2 + 2k_3 + k_4) \end{aligned}

k1k_1은 시작점, k2k_2와 k3k_3은 중점(두 번째는 첫 번째 중점 기울기로 다시 예측한 중점), k4k_4는 끝점의 기울기이고, 1:2:2:11 : 2 : 2 : 1의 가중치가 심프슨의 1:4:11 : 4 : 1이다. 전역 오차 O(h4)O(h^4). 한 걸음에 ff를 네 번 계산하지만, 오일러법으로 같은 정확도를 얻으려면 걸음을 수천 배 잘게 해야 하므로 비교가 안 된다. RK4는 “특별한 사정이 없으면 이것”인 기본값이다.

걸음 폭 조절 — 오차를 재면서 걷는다

섹션 제목: “걸음 폭 조절 — 오차를 재면서 걷는다”

걸음 폭 hh를 처음부터 고정하면 낭비이거나 위험하다. 해가 완만한 곳에서는 크게, 급한 곳에서는 작게 걸어야 한다. 그러려면 걸음마다 오차를 추정해야 하고, 4절의 리처드슨 요령이 그대로 쓰인다. 같은 걸음을 hh로 한 번, h/2h/2로 두 번 걸어 차이를 보면 오차가 추정된다. 더 싼 방법은 차수가 다른 두 공식이 같은 kik_i를 공유하게 짜는 것이다 — 4차와 5차 공식이 여섯 개의 kik_i를 나눠 쓰는 룽게–쿠타–펠베르크(RKF45)가 그것이고, 두 답의 차이가 곧 오차 추정이다. 추정이 허용치보다 크면 hh를 줄여 다시 걷고, 훨씬 작으면 다음 걸음을 키운다.

라이브러리의 ode45, RK45가 이것이다. 사용자가 주는 것은 hh가 아니라 허용 오차이고, hh는 알고리즘이 정한다. SPICE의 시간 걸음도 마찬가지다 — .TRAN의 최대 걸음은 상한일 뿐, 실제 걸음은 국소 절단 오차 추정(LTE)이 정한다. “timestep too small” 오류는 오차 추정이 허용치 안으로 들어오지 않아 hh를 줄이다 바닥에 닿았다는 뜻이다. 대개 회로 안의 불연속 (이상적 스위치, 꺾인 모델 방정식)이 원인이다.

다단계법 — 지난 걸음을 재활용한다

섹션 제목: “다단계법 — 지난 걸음을 재활용한다”

RK4는 한 걸음에 ff를 네 번 계산하고 버린다. 다단계법은 지난 걸음에서 계산한 fn,fn−1,fn−2,…f_n, f_{n-1}, f_{n-2}, \ldots를 보관해 두고 그것으로 ff를 다항식 보간(3절)한 뒤 적분(4절)한다. y′=fy' = f를 xnx_n에서 xn+1x_{n+1}까지 적분하면 yn+1−yn=∫f dxy_{n+1} - y_n = \int f\,dx이고, 적분 안의 ff를 지난 네 점의 3차 보간 다항식으로 바꾸면

yn+1=yn+h24 (55fn−59fn−1+37fn−2−9fn−3)y_{n+1} = y_n + \frac{h}{24}\,\bigl(55 f_n - 59 f_{n-1} + 37 f_{n-2} - 9 f_{n-3}\bigr)

4차 아담스–배시포스법이다. 계수 55,−59,37,−955, -59, 37, -9는 마디 밖(외삽)으로 적분하기 때문에 부호가 번갈아 크다 — 3절에서 경고한 외삽이다. 한 걸음에 ff 한 번으로 4차. 대신 처음 세 걸음은 RK4로 만들어야 하고(자기 시동이 안 된다), hh를 바꾸려면 보관한 값을 다시 만들어야 한다.

외삽을 피하려면 fn+1f_{n+1}을 보간에 포함시킨다.

yn+1=yn+h24 (9fn+1+19fn−5fn−1+fn−2)y_{n+1} = y_n + \frac{h}{24}\,\bigl(9 f_{n+1} + 19 f_n - 5 f_{n-1} + f_{n-2}\bigr)

아담스–몰턴법이고, 계수가 작고 얌전한 대신 fn+1=f(xn+1,yn+1)f_{n+1} = f(x_{n+1}, y_{n+1})에 미지수가 들어 있어 암시적이다. 둘을 짝지어 쓴다 — 배시포스로 예측한 yn+1∗y_{n+1}^{*}를 몰턴의 우변에 넣어 수정한다(예측자–수정자). 두 값의 차이 ∣yn+1−yn+1∗∣\lvert y_{n+1} - y_{n+1}^{*} \rvert가 오차 추정이고, Kreyszig가 보이듯 실제 오차의 약 1/151/15가 그 차이다.

연립과 고계 — 벡터로 쓰면 같다

섹션 제목: “연립과 고계 — 벡터로 쓰면 같다”

미지수가 여럿이거나 2계 이상이면 1.4에서 한 대로(1.4.9연립 ODE와 위상 평면) 1계 연립으로 바꾼다. y′′=f(x,y,y′)y'' = f(x, y, y')는 y1=y, y2=y′y_1 = y,\ y_2 = y'로 놓아 y1′=y2, y2′=f(x,y1,y2)y_1' = y_2,\ y_2' = f(x, y_1, y_2)이고, 위의 모든 공식은 y, f, kiy,\ f,\ k_i를 굵은 벡터로 바꾸면 그대로다. RK4의 kik_i가 벡터가 되고 네 번의 f\mathbf{f} 계산이 각각 연립 전체를 평가한다.

강성 — 왜 암시적 방법이 필요한가

섹션 제목: “강성 — 왜 암시적 방법이 필요한가”

여기서부터가 이 절의 핵심이다. 시험 방정식 y′=λyy' = \lambda y(λ<0\lambda < 0, 해 eλxe^{\lambda x}는 감쇠)에 오일러법을 쓰면

yn+1=(1+hλ) yn=(1+hλ)n+1 y0y_{n+1} = (1 + h\lambda)\,y_n = (1 + h\lambda)^{n+1}\,y_0

참해는 0으로 가는데 수치해가 0으로 가려면 ∣1+hλ∣<1\lvert 1 + h\lambda \rvert < 1, 즉 **h<2/∣λ∣h < 2/\lvert \lambda \rvert**여야 한다. 넘으면 부호를 바꾸며 폭발한다. 정확도가 아니라 안정성이 hh의 상한을 정한 것이다.

연립에서는 λ\lambda가 야코비 행렬 ∂f/∂y\partial\mathbf{f}/\partial\mathbf{y}의 고유값들이고 (1.4.9연립 ODE와 위상 평면 — 선형화한 계의 모드), 가장 큰 ∣λ∣\lvert \lambda \rvert가 hh를 묶는다. 문제는 고유값들이 크게 다를 때 생긴다. 시정수 1 ps1\ \mathrm{ps}인 모드와 1 ms1\ \mathrm{ms}인 모드가 같은 계에 있으면, 빠른 모드는 몇 ps 만에 사라져 관심도 없는데 그것의 안정성 때문에 h<2 psh < 2\ \mathrm{ps}로 묶여 1 ms1\ \mathrm{ms}까지 10910^{9} 걸음을 걸어야 한다. 이런 계를 강성(stiff)이라 하고, 강성비 ∣λ∣max⁡/∣λ∣min⁡\lvert \lambda \rvert_{\max}/\lvert \lambda \rvert_{\min}이 그 정도다.

암시적으로 바꾸면 사라진다. 후진 오일러법 yn+1=yn+hf(xn+1,yn+1)y_{n+1} = y_n + h f(x_{n+1}, y_{n+1})을 시험 방정식에 쓰면

yn+1=yn1−hλ  ⟹  ∣11−hλ∣<1모든 h>0, λ<0y_{n+1} = \frac{y_n}{1 - h\lambda} \;\Longrightarrow\; \Bigl\lvert \frac{1}{1 - h\lambda} \Bigr\rvert < 1 \quad\text{모든 } h > 0,\ \lambda < 0

어떤 hh에서도 안정하다(A-안정). 빠른 모드는 hh가 크면 한 걸음에 그냥 뭉개져 0이 되고 — 그것이 물리적으로 맞다, 어차피 사라질 모드였으니 — 느린 모드만 정확도에 맞는 hh로 따라가면 된다. 걸음마다 yn+1y_{n+1}에 대한 방정식을 풀어야 하는 비용을 치르고 10910^{9} 걸음을 10310^{3} 걸음으로 바꾼다.

-4 -3 -2 -1 1 2 -2i 2i Re hλ Im hλ 전진 오일러 RK4 후진 오일러: 이 원 바깥 전부 사다리꼴: 왼쪽 반평면 전부 강성 모드 hλ (h를 줄여야 원판 안으로)
그림 1.12-6. 복소 hλ 평면에서 각 방법이 안정한 영역. 전진 오일러는 −1을 중심으로 한 반지름 1의 원판 안에서만, RK4는 그보다 조금 넓은 영역 안에서만 안정하다 — 둘 다 유계라서 |λ|가 큰 모드가 h를 묶는다. 후진 오일러는 +1을 중심으로 한 원판의 바깥 전부, 사다리꼴법은 왼쪽 반평면 전부가 안정 영역이라 감쇠하는 모드(Re λ < 0)에서는 h가 얼마든 안정하다. 강성 문제는 왼쪽 멀리(음의 실축 끝)에 고유값이 있는 문제이고, 그곳을 덮는 방법만 큰 h로 걸을 수 있다.직접 작도

암시적 방법 중 실제로 쓰이는 것은 세 가지다.

방법공식차수안정비고
후진 오일러yn+1=yn+hfn+1y_{n+1} = y_n + hf_{n+1}1A-안정, 강하게 감쇠빠른 모드를 과하게 죽인다(수치 감쇠)
사다리꼴yn+1=yn+h2(fn+fn+1)y_{n+1} = y_n + \tfrac{h}{2}(f_n + f_{n+1})2A-안정, 감쇠 없음hλ→−∞h\lambda \to -\infty에서 증폭률 →−1\to -1: 부호가 번갈아 남는 링잉
기어(BDF)yn+1y_{n+1}을 지난 값들의 후진 차분으로1–62차까지 A-안정SPICE의 METHOD=GEAR

사다리꼴법의 링잉이 SPICE 사용자가 만나는 “시간 걸음마다 부호가 뒤집히는 톱니”의 원인이다. 정확도는 좋지만 빠른 모드를 죽이지 않고 ±\pm로 튕기게 남긴다. 후진 오일러는 죽이지만 1차라 부정확하다. 그래서 실무는 사다리꼴로 걷다가 스위칭처럼 급한 순간에 후진 오일러 몇 걸음을 끼우거나, 2차 BDF(기어)를 쓴다.

타원형 PDE의 차분법과 경계 조건

섹션 제목: “타원형 PDE의 차분법과 경계 조건”

1.7에서 2계 PDE를 타원·포물·쌍곡으로 나누었다(1.7.32계 PDE의 분류 — 타원·포물·쌍곡). 타원형은 경계값 문제다 — 시간이 없고, 영역 전체의 해가 경계 조건으로 한꺼번에 정해진다. 라플라스 ∇2u=0\nabla^2 u = 0과 푸아송 ∇2u=f\nabla^2 u = f가 대표이고(1.7.10라플라스·푸아송 방정식), 반도체에서는 정전 퍼텐셜이 곧 이것이다.

영역을 간격 hh의 격자로 덮고 격자점 (xi,yj)=(ih,jh)(x_i, y_j) = (ih, jh)에서의 값을 uiju_{ij}로 쓴다. 4절의 2계 중심 차분을 xx와 yy에 각각 쓰면

∇2u≈ui+1,j−2uij+ui−1,jh2+ui,j+1−2uij+ui,j−1h2\nabla^2 u \approx \frac{u_{i+1,j} - 2u_{ij} + u_{i-1,j}}{h^2} + \frac{u_{i,j+1} - 2u_{ij} + u_{i,j-1}}{h^2}

이므로 푸아송 방정식은 격자점마다 하나씩

  ui+1,j+ui−1,j+ui,j+1+ui,j−1−4uij=h2fij  \boxed{\; u_{i+1,j} + u_{i-1,j} + u_{i,j+1} + u_{i,j-1} - 4u_{ij} = h^2 f_{ij} \;}

5점 공식이다. 절단 오차는 O(h2)O(h^2). 라플라스(f=0f = 0)이면 uij=14(ui+1,j+ui−1,j+ui,j+1+ui,j−1)u_{ij} = \tfrac14(u_{i+1,j} + u_{i-1,j} + u_{i,j+1} + u_{i,j-1}) — 각 점은 네 이웃의 평균이다. 이것은 조화함수의 평균값 성질(1.1.9퍼텐셜 이론)의 이산판이고, Sadiku가 정전기장을 격자에서 손으로 풀 때 쓰는 규칙 그 자체다.

−4 u_ij +1 +1 +1 +1 가상점 u_{i,N+1} = u_{i,N−1} + 2hg ah 디리클레 u = g, 미지수 아님 노이만 ∂u/∂n = g 곡선 경계 비균등 공식 격자 간격 h — 안쪽 점마다 식 하나, 경계는 종류별로 처리
그림 1.12-7. 5점 공식의 스텐실과 세 종류의 경계. 안쪽 격자점(가운데)은 상하좌우 네 이웃과 자기 자신으로 식 하나를 만든다. 왼쪽 경계는 디리클레 조건 — 경계 위의 값이 주어져 있어 그 점은 미지수가 아니라 우변으로 넘어간다. 위쪽 경계는 노이만 조건 — 경계 바깥에 가상점을 하나 두고, 법선 도함수의 중심 차분이 주어진 값이 되게 가상점을 안쪽 점으로 표현해 소거한다. 오른쪽 아래처럼 경계가 격자와 어긋나면 그 점에서만 간격이 다른 비균등 공식을 쓴다.직접 작도

N×NN \times N개의 안쪽 격자점에 식이 N2N^2개 — n=N2n = N^2차 선형계 Au=bA\mathbf{u} = \mathbf{b}다. 격자점을 행 순서로 번호 매기면 AA는 대각이 −4-4, 좌우 이웃이 ±1\pm1 자리, 상하 이웃이 ±N\pm N 자리에 1이 있는 블록 삼중대각 행렬이다.

A=[TIITI⋱⋱⋱IT],T=[−411−41⋱⋱⋱1−4]A = \begin{bmatrix} T & I & & \\ I & T & I & \\ & \ddots & \ddots & \ddots \\ & & I & T \end{bmatrix}, \qquad T = \begin{bmatrix} -4 & 1 & & \\ 1 & -4 & 1 & \\ & \ddots & \ddots & \ddots \\ & & 1 & -4 \end{bmatrix}

성질 셋이 앞 절들을 불러온다. 대칭이고, −A-A가 양의 정부호이며(고유값이 6절에서 본 −4+2cos⁡pπN+1+2cos⁡qπN+1-4 + 2\cos\frac{p\pi}{N+1} + 2\cos\frac{q\pi}{N+1}, 전부 음수), 띠 폭이 NN인 희소 행렬이다. 그래서 콜레스키(5절, 비용 N4N^4), 가우스–자이델(6절 — 타원형 문제에서는 리브만 반복이라 부른다), SOR, 그리고 켤레 기울기·다중 격자가 전부 후보다. 조건수는 κ≈4N2/π2\kappa \approx 4N^2/\pi^2 — 격자를 촘촘히 할수록 나빠진다(7절).

디리클레(값이 주어짐, u=gu = g). 경계 격자점의 값을 알고 있으므로 그 점은 미지수가 아니다. 안쪽 점의 식에 경계값이 나오면 우변으로 넘긴다. 가장 쉽다. 반도체에서는 옴 접촉 — 접촉 전극의 퍼텐셜은 인가 전압으로 고정된다.

노이만(법선 도함수가 주어짐, ∂u/∂n=g\partial u/\partial n = g). 경계 점의 값 자체가 미지수다. 경계 바깥에 가상점(ghost point) ui,N+1u_{i,N+1}을 두고, 법선 도함수의 중심 차분

ui,N+1−ui,N−12h=gi  ⟹  ui,N+1=ui,N−1+2hgi\frac{u_{i,N+1} - u_{i,N-1}}{2h} = g_i \;\Longrightarrow\; u_{i,N+1} = u_{i,N-1} + 2hg_i

로 가상점을 안쪽 점으로 바꿔 5점 공식에 넣는다. 경계 점에도 식이 하나 생기고, 그 식은 2ui,N−12u_{i,N-1} 항을 갖는다. 전진 차분 (ui,N−ui,N−1)/h=gi(u_{i,N} - u_{i,N-1})/h = g_i로 해도 되지만 O(h)O(h)라 전체의 O(h2)O(h^2)를 망친다 — Kreyszig가 가상점을 쓰는 이유다. 반도체에서는 대칭면 (소자의 절반만 풀 때 ∂ψ/∂n=0\partial\psi/\partial n = 0)과 인공 경계(멀리 떨어진 기판 바닥, 전기장이 0이라 놓는다)가 노이만이다.

혼합·로빈(αu+β ∂u/∂n=g\alpha u + \beta\,\partial u/\partial n = g). 위 둘의 조합으로, 같은 가상점 요령이 든다. 반도체에서는 쇼트키 접촉(전류가 표면 재결합 속도에 비례)이나 대류 열전달 경계가 이것이다.

경계가 곡선이면 격자와 어긋난다. 어긋난 점에서는 이웃까지의 거리가 hh가 아니라 ah, bhah,\ bh (a,b<1a, b < 1)이고, Kreyszig의 비균등 공식

2h2[ui+1,ja(1+a)+ui−1,j1+a−uija](x 방향, 오른쪽 이웃까지 ah)\frac{2}{h^2}\left[\frac{u_{i+1,j}}{a(1+a)} + \frac{u_{i-1,j}}{1+a} - \frac{u_{ij}}{a}\right] \quad(x\text{ 방향, 오른쪽 이웃까지 } ah)

를 그 점에서만 쓴다. 절단 오차가 그 점에서 O(h)O(h)로 떨어지지만 몇 점뿐이라 전체에는 크게 영향하지 않는다.

더 중요한 것은 계면이다. 소자에는 산화막/실리콘 경계가 있고, 그곳에서 유전율이 3.9ε03.9\varepsilon_0에서 11.7ε011.7\varepsilon_0으로 뛴다. 푸아송 방정식은 ∇⋅(ε∇ψ)=−ρ\nabla\cdot(\varepsilon\nabla\psi) = -\rho이고, 계면에서 성립해야 하는 것은 ψ\psi의 연속과 전속 밀도 ε ∂ψ/∂n\varepsilon\,\partial\psi/\partial n의 연속이다. 5점 공식을 그냥 쓰면 두 번째가 깨진다. 표준 처방은 유한 체적(box) 이산화다 — 각 격자점 주위에 상자를 두고 발산 정리(1.1.7발산정리와 스토크스 정리)로 방정식을 “상자 표면을 지나는 전속의 합 = 상자 안의 전하”로 바꾼다. 상자 면마다 그 면이 놓인 재료의 ε\varepsilon을 쓰면 계면 조건이 저절로 들어가고, 전하 보존이 격자 수준에서 정확히 성립한다. 균일한 재료에서는 5점 공식과 같은 식이 나오므로 손해가 없다. 소자 시뮬레이터가 전부 이 방식이고, 6·7절에서 “이산 라플라시안”이라 부른 행렬은 정확히는 이 상자 행렬이다.

정확도의 확인 — 격자를 절반으로

섹션 제목: “정확도의 확인 — 격자를 절반으로”

수치해가 맞는지는 참해를 모르니 직접 확인할 수 없다. 대신 격자를 절반으로 줄여 다시 푼다. 오차가 Ch2Ch^2이면 두 해의 차이가 오차의 3/43/4이고(4절의 리처드슨 논리), 차이가 1/41/4로 줄면 방법이 2차로 수렴하고 있다는 증거다. 차이가 줄지 않으면 격자가 아직 물리를 담지 못한 것이고(위의 디바이 길이), 1/21/2로만 줄면 어딘가에 O(h)O(h)짜리 처리(전진 차분 경계, 비균등 점)가 지배하고 있는 것이다. 이 검사를 하지 않은 시뮬레이션 결과는 그림이지 답이 아니다.

시간이 들어오면 — 공간은 차분, 시간은 전진

섹션 제목: “시간이 들어오면 — 공간은 차분, 시간은 전진”

열·확산 방정식 ut=c2uxxu_t = c^2 u_{xx}(1.7.6열·확산 방정식)와 파동 방정식 utt=c2uxxu_{tt} = c^2 u_{xx}(1.7.5파동 방정식과 달랑베르 해)는 초기값 문제다. 공간은 11절처럼 격자로 놓고 (xi=ihx_i = ih), 시간은 10절처럼 걸어간다(tj=jkt_j = jk). 이 절에서 kk는 시간 걸음이다. uij=u(xi,tj)u_{ij} = u(x_i, t_j)이고, 첫 인덱스가 공간, 둘째가 시간이다.

공간을 먼저 이산화하면 격자점마다 ODE 하나가 생긴다 — dui/dt=c2(ui+1−2ui+ui−1)/h2du_i/dt = c^2(u_{i+1} - 2u_i + u_{i-1})/h^2. 이것은 nn차 연립 ODE이고(선분법, method of lines), 그 야코비 행렬은 11절의 이산 라플라시안이다. 그러므로 10절의 모든 결론이 적용된다 — 고유값의 범위가 hh에 따라 −4c2/h2-4c^2/h^2까지 뻗으니 강성이고, 명시적 방법은 kk가 묶인다. 그것이 아래의 안정성 조건이다.

명시적 방법과 r≤1/2r \le 1/2

섹션 제목: “명시적 방법과 r≤1/2r \le 1/2r≤1/2”

시간에 전진 차분, 공간에 중심 차분(FTCS)을 쓰면

ui,j+1−uijk=c2 ui+1,j−2uij+ui−1,jh2\frac{u_{i,j+1} - u_{ij}}{k} = c^2\,\frac{u_{i+1,j} - 2u_{ij} + u_{i-1,j}}{h^2} ⟹ui,j+1=(1−2r) uij+r (ui+1,j+ui−1,j),r=c2kh2\Longrightarrow\quad u_{i,j+1} = (1 - 2r)\,u_{ij} + r\,(u_{i+1,j} + u_{i-1,j}), \qquad r = \frac{c^2 k}{h^2}

새 값이 지난 시각의 세 값으로 대입 한 번에 나온다. 격자비 rr이 방법의 전부다. r=1/2r = 1/2이면 ui,j+1=12(ui+1,j+ui−1,j)u_{i,j+1} = \tfrac12(u_{i+1,j} + u_{i-1,j}) — 자기 값은 사라지고 양쪽 이웃의 평균이 된다. r>1/2r > 1/2이면 uiju_{ij}의 계수가 음수가 되고, 그때부터 문제가 시작된다.

폰 노이만 안정성 해석. 오차를 푸리에 모드로 쪼개(1.10.6이산 푸리에 변환과 FFT) uij=Gjeiθiu_{ij} = G^j e^{\mathrm{i}\theta i}(θ\theta는 격자 파수, 여기서 i\mathrm{i}는 허수단위)를 넣으면 한 시간 걸음의 증폭률이

G(θ)=1−2r+r (eiθ+e−iθ)=1−4rsin⁡2θ2G(\theta) = 1 - 2r + r\,(e^{\mathrm{i}\theta} + e^{-\mathrm{i}\theta}) = 1 - 4r\sin^2\frac{\theta}{2}

모든 θ\theta에서 ∣G∣≤1\lvert G \rvert \le 1이어야 오차가 자라지 않는다. GG의 최솟값은 θ=π\theta = \pi(이웃끼리 부호 반대인 체스판 모드)에서 1−4r1 - 4r이고, 이것이 −1-1 이상이려면

  r=c2kh2≤12  \boxed{\;r = \frac{c^2 k}{h^2} \le \frac12\;}

넘으면 체스판 모드가 부호를 바꾸며 지수적으로 자란다 — 처음엔 안 보이다가 몇 십 걸음 뒤에 톱니가 폭발하는 전형적 불안정이다.

공간 차분을 지난 시각과 새 시각의 평균으로 잡으면(10절의 사다리꼴법에 해당)

(2+2r) ui,j+1−r (ui+1,j+1+ui−1,j+1)=(2−2r) uij+r (ui+1,j+ui−1,j)(2 + 2r)\,u_{i,j+1} - r\,(u_{i+1,j+1} + u_{i-1,j+1}) = (2 - 2r)\,u_{ij} + r\,(u_{i+1,j} + u_{i-1,j})

크랭크–니콜슨법이다. 좌변에 새 시각의 값 세 개가 얽혀 있으므로 매 걸음 삼중대각 선형계를 풀어야 한다 — 5절의 토머스 알고리즘으로 O(n)O(n)이니 명시적 방법과 비용이 거의 같다. 증폭률은

G(θ)=1−2rsin⁡2(θ/2)1+2rsin⁡2(θ/2)  ⟹  ∣G∣≤1모든 rG(\theta) = \frac{1 - 2r\sin^2(\theta/2)}{1 + 2r\sin^2(\theta/2)} \;\Longrightarrow\; \lvert G \rvert \le 1 \quad\text{모든 } r

무조건 안정이고, 시간·공간 모두 2차 정확도 O(k2+h2)O(k^2 + h^2)다. Kreyszig는 r=1r = 1 (k=h2/c2k = h^2/c^2)을 권하는데, 그때 좌변이 4ui,j+1−ui+1,j+1−ui−1,j+14u_{i,j+1} - u_{i+1,j+1} - u_{i-1,j+1}로 특히 간단해진다.

utt=c2uxxu_{tt} = c^2 u_{xx}는 시간에도 2계 중심 차분을 쓴다.

ui,j+1−2uij+ui,j−1k2=c2 ui+1,j−2uij+ui−1,jh2\frac{u_{i,j+1} - 2u_{ij} + u_{i,j-1}}{k^2} = c^2\,\frac{u_{i+1,j} - 2u_{ij} + u_{i-1,j}}{h^2} ⟹ui,j+1=2(1−r∗) uij+r∗ (ui+1,j+ui−1,j)−ui,j−1,r∗=c2k2h2\Longrightarrow\quad u_{i,j+1} = 2(1 - r^{*})\,u_{ij} + r^{*}\,(u_{i+1,j} + u_{i-1,j}) - u_{i,j-1}, \qquad r^{*} = \frac{c^2 k^2}{h^2}

새 값이 두 시각 전의 값까지 쓰므로 첫 걸음을 따로 만들어야 한다. 초기 속도 ut(x,0)=g(x)u_t(x, 0) = g(x)를 중심 차분 (ui,1−ui,−1)/2k=gi(u_{i,1} - u_{i,-1})/2k = g_i로 쓰고 가상 시각 ui,−1u_{i,-1}을 소거하면

ui,1=(1−r∗) ui,0+12r∗ (ui+1,0+ui−1,0)+k giu_{i,1} = (1 - r^{*})\,u_{i,0} + \tfrac12 r^{*}\,(u_{i+1,0} + u_{i-1,0}) + k\,g_i

폰 노이만 해석은 GG에 대한 2차 방정식이 되고, 결과는

  r∗=c2k2h2≤1⟺c k≤h  \boxed{\;r^{*} = \frac{c^2 k^2}{h^2} \le 1 \quad\Longleftrightarrow\quad c\,k \le h\;}

쿠랑–프리드리히스–레비(CFL) 조건이다. 한 시간 걸음 동안 파동이 진행하는 거리 ckck가 격자 간격 hh를 넘으면 안 된다.

(xᵢ, tⱼ₊₁) t = 0 ck ≤ h — 안정 필요한 초기값이 전부 들어온다 (xᵢ, tⱼ₊₁) t = 0 ck > h — 불안정 색칠한 부분의 정보가 계산에 빠진다 실선: 수치적 의존 영역 (기울기 h/k) 색칠: 물리적 의존 영역 (특성선 x ± ct)
그림 1.12-8. CFL 조건의 기하. 파동 방정식에서 점 (xᵢ, tⱼ₊₁)의 참값은 아래로 뻗은 특성선 x ± ct 안쪽(물리적 의존 영역)의 초기값으로 정해진다. 차분 공식은 그 점을 아래 시각의 이웃 세 점으로만 만들므로, 수치적 의존 영역은 기울기 h/k의 삼각형이다. 왼쪽처럼 ck ≤ h이면 수치 삼각형이 물리 삼각형을 품어 필요한 정보가 전부 들어온다. 오른쪽처럼 ck > h이면 물리 삼각형이 더 넓어, 답에 영향을 줘야 할 초기값이 계산에 들어오지 않는다 — 어떤 공식으로도 맞을 수 없고, 실제로는 폭발한다.직접 작도

세 방법을 한 줄로 — 라크스의 동치 정리

섹션 제목: “세 방법을 한 줄로 — 라크스의 동치 정리”

이 절이 세운 조건들을 하나로 묶는 정리가 있다. 차분 공식이 일관(consistent: h,k→0h, k \to 0에서 원래 PDE로 돌아간다)하고 안정(오차가 유계)하면, 그리고 그때에만, 수치해가 참해로 수렴한다. 일관성은 테일러 전개로 확인하고(절단 오차가 0으로 가는가), 안정성은 폰 노이만 해석으로 확인한다. 둘 다 국소적 계산인데 그 결과가 전역적 수렴을 보장한다 — 4절에서 “오차의 차수를 알면 그 차수로 수렴한다”고 한 것의 PDE 버전이다.

이류항 — 풍상 차분과 셰르페터–검멜

섹션 제목: “이류항 — 풍상 차분과 셰르페터–검멜”

반도체의 연속 방정식은 순수 확산이 아니다.

∂n∂t=1q∇⋅Jn+G−R,Jn=qμnnE+qDn∇n\frac{\partial n}{\partial t} = \frac{1}{q}\nabla\cdot J_n + G - R, \qquad J_n = q\mu_n n E + qD_n \nabla n

드리프트 항 μnnE\mu_n nE는 **1계 미분(이류)**이고, 이류–확산 방정식은 이 절의 어느 쪽도 아닌 중간이다. 이류항을 중심 차분으로 이산화하면 격자 페클레 수 Pe=μEh/2D=Eh/2VT\mathrm{Pe} = \mu E h / 2D = Eh / 2V_T가 1을 넘을 때 — 즉 한 격자 간격의 전압 강하가 2VT≈52 mV2V_T \approx 52\ \mathrm{mV}를 넘을 때 — 농도가 이웃끼리 부호를 바꾸며 진동한다(음의 농도!). 공핍층의 전기장 105 V/cm10^{5}\ \mathrm{V/cm}에서 이것은 h>5 nmh > 5\ \mathrm{nm}면 벌써 깨진다는 뜻이다.

처방은 풍상 차분(upwind) — 이류 방향의 상류 값만 쓰는 것 — 인데 O(h)O(h)이고 수치 확산이 크다. 반도체는 더 좋은 답을 갖고 있다. 두 격자점 사이에서 전류 JJ가 일정하고 EE가 상수라 가정하면 J=qμnE+qD dn/dxJ = q\mu nE + qD\,dn/dx는 nn에 대한 1계 선형 ODE라 정확히 풀리고, 그 해가

Ji+1/2=qDnh[ni+1 B(ψi+1−ψiVT)−ni B(ψi−ψi+1VT)],B(x)=xex−1J_{i+1/2} = \frac{qD_n}{h}\Bigl[n_{i+1}\,B\Bigl(\frac{\psi_{i+1} - \psi_i}{V_T}\Bigr) - n_i\,B\Bigl(\frac{\psi_i - \psi_{i+1}}{V_T}\Bigr)\Bigr], \qquad B(x) = \frac{x}{e^x - 1}

셰르페터–검멜 이산화다. BB는 베르누이 함수이고, ∣ψi+1−ψi∣≪VT\lvert\psi_{i+1} - \psi_i\rvert \ll V_T이면 B≈1−x/2B \approx 1 - x/2가 되어 중심 차분으로, ≫VT\gg V_T이면 한쪽 BB가 0으로 가서 풍상 차분으로 저절로 넘어간다. 1절에서 예고한 대로 드리프트와 확산을 하나의 지수 식으로 합쳐 상쇄를 피했고, 어떤 hh에서도 농도가 양수로 유지된다. 소자 시뮬레이터가 예외 없이 이것을 쓰는 이유이며, 격자 페클레 수의 제약이 사라져 공핍층을 굳이 VT/EV_T/E보다 잘게 자르지 않아도 된다.

11·12절의 차분법은 격자가 직교해야 한다. 곡선 경계, 비스듬한 계면, 국소적으로만 촘촘해야 하는 영역에서는 직교 격자가 낭비이거나 부정확하다. 그리고 미분을 차분으로 바꾸는 방식이라 해가 매끄럽지 않은 곳(재료 경계의 꺾임)에서 근거가 약하다. 두 방법이 이 불편을 다른 길로 피한다 — 유한요소법(FEM)은 미분 방정식을 적분 형태(변분 원리)로 바꾸고, 모멘트법 (MoM)은 아예 적분 방정식에서 출발한다. Sadiku의 14장이 정전기 문제로 둘을 소개하는 순서를 그대로 따른다.

유한요소법 — 에너지를 최소화하는 조각 함수

섹션 제목: “유한요소법 — 에너지를 최소화하는 조각 함수”

① 출발점은 미분 방정식이 아니라 에너지다. 라플라스 방정식 ∇2V=0\nabla^2 V = 0의 해는 경계 조건을 만족하는 모든 함수 중 정전 에너지

W=ε2∫Ω∣∇V∣2 dSW = \frac{\varepsilon}{2}\int_{\Omega} \lvert \nabla V \rvert^2\, dS

를 최소로 하는 함수다(1.6의 변분 원리 — 1.6.6변분법과 오일러 방정식. 오일러 방정식을 쓰면 ∇2V=0\nabla^2 V = 0이 나온다). 그러니 방정식을 푸는 대신 WW를 최소화하면 된다. 1.6의 레일리–리츠법(1.6.8레일리-리츠 변분 근사)이 정확히 이것인데, 거기서는 시험 함수를 영역 전체에 걸친 몇 개의 함수로 잡았다. 유한요소법의 새 발상은 시험 함수를 작은 조각마다 따로 잡는 것이다.

② 영역을 요소로 쪼갠다. 2차원이면 삼각형, 3차원이면 사면체. 크기가 제각각이어도 되고, 경계 모양을 따라가도 되며, 필요한 곳만 잘게 해도 된다. 꼭짓점을 절점(node)이라 하고, 미지수는 절점에서의 값 V1,…,VnV_1, \ldots, V_n이다.

③ 요소 안에서는 1차식. 삼각형 요소 ee 안에서 Ve(x,y)=a+bx+cyV_e(x, y) = a + bx + cy로 잡는다. 세 꼭짓점의 값 Ve1,Ve2,Ve3V_{e1}, V_{e2}, V_{e3}이 a,b,ca, b, c를 정하므로

Ve(x,y)=∑i=13αi(x,y) Vei,αi(꼭짓점 j)=δijV_e(x, y) = \sum_{i=1}^{3} \alpha_i(x, y)\, V_{ei}, \qquad \alpha_i(\text{꼭짓점 } j) = \delta_{ij}

αi\alpha_i가 형상 함수(shape function)다 — 3절의 라그랑주 기저 LkL_k의 2차원판으로, 자기 꼭짓점에서 1, 다른 꼭짓점에서 0인 평면이다. Sadiku의 표기로 α1=12A[(x2y3−x3y2)+(y2−y3)x+(x3−x2)y]\alpha_1 = \frac{1}{2A}[(x_2 y_3 - x_3 y_2) + (y_2 - y_3)x + (x_3 - x_2)y]이고(AA는 삼각형 넓이), 나머지는 첨자를 순환한 것이다.

x₀ x₁ x₂ x₃ x₄ x₅ x₆ α₃ — 절점 3에서 1, 이웃에서 0 형상 함수(모자 함수) Σ Vⱼ αⱼ(x) — 절점값의 꺾은선 점선: 참 함수 V₃
그림 1.12-9. 1차원에서 본 유한요소 기저. 위: 절점마다 자기 절점에서 1이고 이웃 절점에서 0으로 떨어지는 모자 함수(hat function)가 하나씩 있다. 아래: 절점값 V_j에 모자 함수를 곱해 더하면 절점을 지나는 꺾은선이 되고, 그것이 유한요소 근사다. 절점값 하나를 바꾸면 그 절점에 붙은 두 요소만 바뀐다 — 강성 행렬이 희소한 이유이자 3절의 스플라인과 같은 국소성이다. 2차원의 형상 함수 αᵢ는 이 모자를 삼각형 위의 피라미드로 세운 것이다.직접 작도

④ 요소의 에너지를 절점값으로 쓴다. ∇Ve=∑iVei∇αi\nabla V_e = \sum_i V_{ei}\nabla\alpha_i이고 1차식이라 ∇αi\nabla\alpha_i는 요소 안에서 상수다. 따라서

We=ε2∫e∣∇Ve∣2 dS=ε2∑i,jVei Cij(e) Vej,Cij(e)=∫e∇αi⋅∇αj dSW_e = \frac{\varepsilon}{2}\int_e \lvert \nabla V_e \rvert^2\, dS = \frac{\varepsilon}{2}\sum_{i,j} V_{ei}\, C^{(e)}_{ij}\, V_{ej}, \qquad C^{(e)}_{ij} = \int_e \nabla\alpha_i \cdot \nabla\alpha_j\, dS

C(e)C^{(e)}가 3×33 \times 3 요소 계수 행렬(강성 행렬)이고, 적분이 상수 × 넓이라 닫힌 꼴이 있다. Sadiku의 식으로

C12(e)=14A[(y2−y3)(y3−y1)+(x3−x2)(x1−x3)],C11(e)=14A[(y2−y3)2+(x3−x2)2]C^{(e)}_{12} = \frac{1}{4A}\bigl[(y_2 - y_3)(y_3 - y_1) + (x_3 - x_2)(x_1 - x_3)\bigr], \qquad C^{(e)}_{11} = \frac{1}{4A}\bigl[(y_2 - y_3)^2 + (x_3 - x_2)^2\bigr]

이며 나머지는 첨자 순환이다. 각 행의 합이 0이다(∑jCij=0\sum_j C_{ij} = 0 — 상수 퍼텐셜은 에너지가 0). 1.3의 이차 형식(1.3.7이차 형식과 주축 변환)이 여기서 에너지의 얼굴로 나타난다.

⑤ 조립한다. 전체 에너지는 요소 에너지의 합 W=∑eWe=ε2VTCVW = \sum_e W_e = \frac{\varepsilon}{2}\mathbf{V}^{\mathsf{T}}C\mathbf{V}이고, 전역 행렬 CC는 각 요소의 3×33 \times 3을 그 요소의 절점 번호 자리에 더해 넣어 만든다. 한 절점이 여러 요소에 속하면 그만큼 겹쳐 더해진다. CijC_{ij}는 절점 ii와 jj가 같은 요소에 속할 때만 0이 아니므로 희소·대칭·(반)양의 정부호 — 11절의 이산 라플라시안과 같은 부류다.

⑥ 최소화. ∂W/∂Vk=0\partial W/\partial V_k = 0 (모든 자유 절점 kk)에서 CV=0C\mathbf{V} = \mathbf{0}. 경계에서 값이 지정된 절점(고정 절점)과 나머지(자유 절점)로 나누면

[CffCfpCpfCpp][VfVp]  ⟹  Cff Vf=−Cfp Vp\begin{bmatrix} C_{ff} & C_{fp} \\ C_{pf} & C_{pp} \end{bmatrix} \begin{bmatrix} \mathbf{V}_f \\ \mathbf{V}_p \end{bmatrix} \;\Longrightarrow\; C_{ff}\,\mathbf{V}_f = -C_{fp}\,\mathbf{V}_p

우변이 알려진 경계값이고, 좌변이 5·6절로 푸는 선형계다. 푸아송 방정식이면 우변에 전하 항 ∫ρ αi dS\int \rho\,\alpha_i\, dS가 더해진다.

에너지가 없는 문제(비대칭 연산자, 이류항)에도 같은 뼈대가 통한다. 방정식 Lu=f\mathcal{L}u = f의 잔차 Lu~−f\mathcal{L}\tilde u - f가 형상 함수 각각과 직교하도록 요구하는 것 — ∫(Lu~−f) αi dS=0\int (\mathcal{L}\tilde u - f)\,\alpha_i\, dS = 0 — 이 갈러킨법이고, 에너지가 있으면 레일리–리츠와 같은 방정식을 준다. 상용 유한요소 도구(COMSOL, ANSYS)의 내부가 이것이고, 반도체에서는 채널 응력의 탄성 해석, 패키지의 열–기계 해석, 웨이퍼 휨이 유한요소법으로 풀린다. 소자 시뮬레이터가 쓰는 유한 체적법(11절)은 형상 함수 대신 상자를 쓴 사촌이고, 둘 다 비정형 격자를 다룬다.

모멘트법 — 적분 방정식을 행렬로

섹션 제목: “모멘트법 — 적분 방정식을 행렬로”

정전기 문제를 거꾸로 세울 수 있다. 퍼텐셜을 구하는 대신, 도체 표면의 전하 분포를 미지수로 잡는다. 전하가 만드는 퍼텐셜은 1.1·1.8의 적분(1.8.42·3차원 문제)으로 쓰이고, 도체 표면에서 그 값이 인가 전압과 같아야 한다.

V(r)=14πε0∫LρL(r′) dl′∣r−r′∣=V0(r는 도체 위)V(\mathbf{r}) = \frac{1}{4\pi\varepsilon_0}\int_{L} \frac{\rho_L(\mathbf{r}')\, dl'}{\lvert \mathbf{r} - \mathbf{r}' \rvert} = V_0 \qquad (\mathbf{r} \text{는 도체 위})

미지 함수 ρL\rho_L이 적분 안에 있다 — 적분 방정식이다. Sadiku의 예는 길이 LL, 반지름 aa의 가는 도선에 V0=1 VV_0 = 1\ \mathrm{V}를 건 경우다.

① 도선을 NN개의 조각으로 나누고, 각 조각에서 ρL\rho_L이 상수 ρn\rho_n이라 놓는다 (펄스 기저). 미지수 NN개.

② 각 조각의 중점 rm\mathbf{r}_m에서 방정식이 성립하도록 요구한다(점 정합, point matching). 방정식 NN개.

∑n=1NAmn ρn=V0,Amn=14πε0∫조각 ndl′∣rm−r′∣≈Δ4πε0 ∣xm−xn∣(m≠n)\sum_{n=1}^{N} A_{mn}\,\rho_n = V_0, \qquad A_{mn} = \frac{1}{4\pi\varepsilon_0}\int_{\text{조각 } n} \frac{dl'}{\lvert \mathbf{r}_m - \mathbf{r}' \rvert} \approx \frac{\Delta}{4\pi\varepsilon_0\,\lvert x_m - x_n \rvert} \quad (m \neq n)

Δ=L/N\Delta = L/N이 조각 길이다. m=nm = n이면 분모가 0이라 근사가 깨지는데, 조각 안에서 도선의 반지름 aa를 살려 적분하면 자기 항 Amm=24πε0ln⁡ΔaA_{mm} = \frac{2}{4\pi\varepsilon_0}\ln\frac{\Delta}{a}이 나온다. 이 항이 대각을 지배하므로 행렬은 대각 우세다.

③ N×NN \times N 선형계를 푼다. AA는 꽉 찬(dense) 행렬이다 — 모든 조각이 모든 조각에 퍼텐셜을 만들기 때문이다. 그래서 NN을 크게 못 잡지만(10310^{3} 급), 미지수가 표면에만 있어 3차원 문제가 2차원 미지수로 줄어든다. 얻은 ρn\rho_n을 더하면 총전하 Q=∑ρnΔQ = \sum \rho_n\Delta이고, C=Q/V0C = Q/V_0이 도선의 커패시턴스다.

일반화. 펄스 기저와 점 정합은 가장 거친 선택이다. 미지 함수를 기저 {fn}\{f_n\}으로 전개하고 잔차를 가중 함수 {wm}\{w_m\}과 내적해 0으로 놓는 것이 일반적인 모멘트법이고, wmw_m이 델타 함수이면 점 정합, wm=fnw_m = f_n이면 갈러킨이다. 즉 유한요소법과 모멘트법은 같은 가중 잔차법의 두 얼굴이고, 다른 것은 연산자가 미분(국소·희소)이냐 적분(전역·꽉 참)이냐뿐이다. “모멘트”라는 이름은 잔차와 가중 함수의 내적을 확률의 모멘트에 빗댄 것이다.

지금까지는 “이 식을 만족하는 x\mathbf{x}“를 찾았다. 마지막 절은 “이 값을 가장 작게 하는 x\mathbf{x}“다. 8절의 최소제곱이 이미 그것이었고, 13절의 에너지 최소화도 그것이었다. 반도체에서 최적화는 어디에나 있다 — 소자 모델 파라미터 추출(측정과의 차이를 최소로), 공정 조건 최적화(수율을 최대로), 광 근접 보정(웨이퍼 패턴과 설계의 차이를 최소로), 그리고 신경망 학습(손실 함수를 최소로).

min⁡f(x)\min f(\mathbf{x})에서 ff를 목적 함수라 한다. 미분 가능하면 최솟값에서 ∇f=0\nabla f = \mathbf{0}이다(필요조건). 이것은 nn개의 미지수에 대한 nn개의 방정식이니 2절의 뉴턴법으로 풀 수 있다 — 그러면 도함수 JJ가 ff의 헤세 행렬 Hij=∂2f/∂xi∂xjH_{ij} = \partial^2 f/\partial x_i\partial x_j가 된다. 그런데 헤세 행렬은 n2n^2개의 2계 도함수라 비싸고, 멀리서는 뉴턴법이 튄다. 그래서 1계 도함수만 쓰는 방법이 먼저 온다.

최급강하법 — 가장 가파른 내리막으로

섹션 제목: “최급강하법 — 가장 가파른 내리막으로”

현재 점에서 ff가 가장 빨리 줄어드는 방향은 −∇f-\nabla f다(1.1.2기울기·발산·회전 — 기울기는 가장 빨리 커지는 방향). 그 방향으로 얼마나 갈지(tt)는 그 직선 위에서 ff가 최소가 되는 곳으로 정한다.

xk+1=xk−tk ∇f(xk),tk=arg⁡min⁡t>0 g(t),g(t)=f(xk−t ∇f(xk))\mathbf{x}_{k+1} = \mathbf{x}_k - t_k\,\nabla f(\mathbf{x}_k), \qquad t_k = \arg\min_{t > 0}\ g(t), \quad g(t) = f\bigl(\mathbf{x}_k - t\,\nabla f(\mathbf{x}_k)\bigr)

g(t)g(t)는 1변수 함수라 2절의 방법이나 해석적으로 최소화한다(선 탐색). Kreyszig의 예로 f=x12+3x22f = x_1^2 + 3x_2^2, 시작점 (6,3)(6, 3)이면 ∇f=(2x1,6x2)\nabla f = (2x_1, 6x_2)이고 g(t)g(t)가 tt의 2차식이라 tkt_k가 닫힌 꼴로 나온다.

(6, 3)→(3.484, −0.774)→(1.327, 0.664)→(0.771, −0.171)→⋯(6,\ 3) \to (3.484,\ -0.774) \to (1.327,\ 0.664) \to (0.771,\ -0.171) \to \cdots

x2x_2의 부호가 매번 뒤집히며 지그재그로 원점에 다가간다. 수렴은 하되 느리다.

x₁ x₂ x₀ = (6, 3) x₁ x₂ 최솟값 최급강하 — 걸음마다 직각으로 꺾인다 점선: 켤레 기울기 — 두 걸음에 끝난다 등고선 f = x₁² + 3x₂²
그림 1.12-10. f = x₁² + 3x₂²의 등고선(타원) 위에서 최급강하법이 걷는 길. 각 걸음은 등고선에 수직인 방향으로 출발해, 그 직선 위에서 f가 최소인 곳 — 직선이 어떤 등고선에 접하는 곳 — 에서 멈춘다. 다음 걸음은 그 접점의 등고선에 수직이므로 직전 걸음과 정확히 직각이다. 그래서 길이 지그재그가 되고, 타원이 길쭉할수록(조건수가 클수록) 골짜기 벽을 오가느라 바닥을 따라 내려가지 못한다. 켤레 기울기법은 두 번째 걸음부터 방향을 보정해 2차원 이차 함수를 정확히 두 걸음에 끝낸다.직접 작도

목적 함수를 2차까지 전개하면 f(x+δ)≈f+∇fTδ+12δTHδf(\mathbf{x} + \delta) \approx f + \nabla f^{\mathsf{T}}\delta + \tfrac12\delta^{\mathsf{T}}H\delta이고, 이것을 δ\delta에 대해 최소화하면

H δ=−∇fH\,\delta = -\nabla f

뉴턴법이다. 이차 함수라면 한 걸음에 정확히 최솟값에 간다 — 최급강하가 골짜기 벽을 오갈 때 뉴턴은 골짜기의 모양(HH)을 알고 바닥으로 곧장 간다. 해 근처에서 2차 수렴. 그러나 HH가 양의 정부호가 아닌 곳(안장점, 오목한 곳)에서는 그 방향이 오르막일 수 있고, HH를 만들고 푸는 비용이 n2n^2과 n3n^3이다.

준뉴턴법(BFGS)은 HH를 계산하지 않고, 걸음마다 관측된 기울기의 변화 ∇fk+1−∇fk\nabla f_{k+1} - \nabla f_k로 H−1H^{-1}의 근사를 갱신해 간다 — 2절의 할선법을 벡터로 올린 것이다. 1계 도함수만으로 초선형 수렴을 얻고, 변수가 수천 개인 곡선 맞춤·모델 보정의 표준이다. 8절의 레벤버그–마쿼트는 최소제곱에 특화된 같은 부류로, H≈JTJH \approx J^{\mathsf{T}}J로 놓은 것이 다르다.

변수가 수백만 개(신경망, 픽셀 단위의 마스크 최적화)면 H−1H^{-1} 근사조차 못 들고 있으므로 최급강하로 돌아간다 — 다만 선 탐색 대신 고정 걸음(학습률)과 운동량 항으로 지그재그를 누르고, 기울기를 데이터 일부로만 추정한다(확률적 경사 하강). 걸음 폭이 6절의 ω\omega·10절의 hh와 같은 역할이라 너무 크면 발산하고 너무 작으면 느리다.

구속 조건 — 라그랑주 승수와 선형 계획

섹션 제목: “구속 조건 — 라그랑주 승수와 선형 계획”

g(x)=0g(\mathbf{x}) = 0을 만족하면서 ff를 최소화하는 문제는 1.6의 라그랑주 승수(1.6.7구속 조건이 있는 변분과 라그랑주 승수)로 ∇f=λ∇g\nabla f = \lambda\nabla g를 풀거나, 구속을 벌칙 항 μg2\mu g^2으로 목적 함수에 더해 무구속 문제로 바꾼다. 부등식 구속(g≤0g \le 0)이면 승수의 부호 조건이 붙는다(KKT 조건).

ff와 구속이 전부 선형이면 선형 계획법(Kreyszig 22.2)이다. 등고선이 평행한 직선이고 가능 영역이 다각형(다면체)이므로, 최솟값은 언제나 꼭짓점에 있다 — 안쪽에서는 기울기 방향으로 더 갈 수 있고, 변 위에서도 한쪽 꼭짓점으로 가면 더 좋아지기 때문이다. 심플렉스법은 꼭짓점에서 이웃 꼭짓점으로 목적 함수가 줄어드는 쪽으로만 옮겨 가는 방법이고, 웨이퍼 배정· 장비 스케줄링 같은 생산 계획이 이것으로 풀린다.

이 절의 방법은 전부 내리막으로만 간다. 그래서 도착하는 곳은 시작점에서 가장 가까운 골짜기이지 가장 깊은 골짜기가 아니다. 목적 함수가 볼록(등고선이 한 겹의 타원처럼 생김)이면 골짜기가 하나라 문제없다 — 8절의 선형 최소제곱, 13절의 에너지가 그렇다. 비선형 모델 맞춤, 공정 최적화, 역 리소그래피는 볼록하지 않고 골짜기가 여럿이다.

처방은 세 종류다. 여러 시작점에서 출발해 가장 좋은 것을 취하거나(다중 시작), 오르막도 확률적으로 허용해 얕은 골짜기를 빠져나오거나(모의 담금질 — 온도를 서서히 낮추는 열처리의 비유가 이름이다), 목적 함수 자체를 몇 번의 평가로 대리 모델로 만들어 그 위에서 탐색한다 (베이즈 최적화 — 시뮬레이션 한 번이 몇 시간인 TCAD 보정에서 쓴다). 어느 쪽이든 찾은 최솟값이 전역이라는 보장은 없다는 것이 이 절의 마지막 경고다.

이 장이 반도체에서 다시 나오는 곳

섹션 제목: “이 장이 반도체에서 다시 나오는 곳”
  • 소자 시뮬레이션(TCAD). 유한 체적 이산화(11절) → 셰르페터–검멜(12절) → 결합 뉴턴 또는 검멜 반복(2·6절) → 스케일링된 희소 야코비 행렬(7절)을 직접법·크릴로프법으로(5·6절) → 과도 해석은 후진 오일러·BDF(10절). 격자는 디바이 길이가 정한다(11절).
  • 회로 시뮬레이션(SPICE). 수정 노드 해석의 비선형 대수–미분 방정식을 사다리꼴·기어법으로 이산화(10절)하고 걸음마다 뉴턴–LU(2·5절). RELTOL·ABSTOL은 1절의 상대·절대 오차, “timestep too small”은 10절의 오차 추정과 2절의 수렴 실패.
  • 공정 시뮬레이션. 확산·산화는 비선형 포물형 PDE — 크랭크–니콜슨·후진 오일러(12절), 격자 이동. 이온 주입은 몬테카를로(1.11).
  • 밴드 구조·양자 소자. 큰 에르미트 행렬의 가장 낮은 고유값 몇 개 — 란초스·다비드슨(9절). 슈뢰딩거–푸아송 자기일관 반복은 2절의 고정점 반복이고, 혼합(mixing) 파라미터가 6절의 ω\omega다.
  • 계측과 파라미터 추출. 곡선 맞춤은 레벤버그–마쿼트(8절), C–V 미분은 4절의 경고, TLM·아레니우스는 직선 맞춤(8절), 신뢰구간과 파라미터 보상은 SVD(8절)와 국소 최솟값(14절).
  • 배선·패키지. 기생 커패시턴스·인덕턴스 추출은 모멘트법 + 빠른 다중극(13절), 응력·열은 유한요소법(13절), 신호 무결성은 FDTD — 12절의 CFL 조건이 시간 걸음을 정한다.
  • 리소그래피. 광 근접 보정과 역 리소그래피는 픽셀 단위 최급강하(14절), 공정 창 최적화는 구속 최적화.

전부 “연속을 이산으로 바꾸고 무엇을 잃는지 잰다”의 변주이고, 잃는 것은 언제나 절단·반올림· 반복·조건의 네 층 중 하나다.