Chapter 13

반복 해법

12장의 LU 분해는 n3/3n^3/3번의 곱셈과 n2n^2칸의 메모리로 연립방정식을 정확히 풉니다. n=103n = 10^3이면 문제없지만 열전도·구조·유체 시뮬레이션의 nn은 10610^6을 넘고, 행렬은 한 행에 0이 아닌 원소가 다섯 개쯤뿐입니다. 이런 행렬은 분해하는 대신 곱하기만 하면서 해에 다가가는 것이 낫습니다. 이 장은 가장 오래된 반복(야코비, 가우스–자이델)이 왜 수렴하는지를 스펙트럼 반지름으로 정확히 말하고, 매개변수 하나로 수십 배 빨라지는 SOR, 방정식을 그릇의 바닥 찾기로 바꾼 켤레 기울기법, 그 속도를 다시 몇 배 올리는 전처리, 비대칭 행렬의 GMRES, 그리고 격자 크기와 무관한 횟수로 끝나는 다중 격자까지 다룹니다.

이 수식이 없었다면백만 개의 미지수를 가진 시뮬레이션

자동차 충돌 해석, 일기예보의 압력 방정식, 반도체 소자의 전위 분포, 영상의 매끄러운 합성은 모두 결국 거대한 희소 연립방정식 Ax=bA\mathbf x = \mathbf b를 풉니다. 밀집 행렬로 다루면 n=106n = 10^6에서 저장에만 8 TB, 소거에 3×10173\times10^{17}번의 곱셈이 듭니다. 반복 해법은 같은 문제를 AA와 벡터의 곱 수백 번, 곧 원소 수십억 번의 연산으로 풉니다.

이웃 평균을 되풀이하는 생각은 19세기 가우스와 야코비(Carl Jacobi)까지 거슬러 올라갑니다. 1950년대 컴퓨터와 함께 영(David M. Young)의 SOR 이론, 헤스테네스(Magnus Hestenes)와 슈티펠(Eduard Stiefel)의 켤레 기울기법(1952)이 나왔고, 1986년 사드(Yousef Saad)와 슐츠(Martin Schultz)가 GMRES를 발표했습니다. 오늘날 PETSc, hypre 같은 대형 계산 라이브러리의 중심이 이 방법들입니다.

편미분방정식 → 격자→희소 행렬 A→x ← x + (전처리된 잔차 방향)→곱셈 수백 번으로 해

큰 희소 행렬: 왜 분해하지 않는가

금속판의 온도, 격자 1000 × 1000

정사각형 판의 가장자리 온도를 정해 두고 안쪽의 정상 상태 온도를 구합니다. 판을 한 변 NN칸으로 나누면 각 격자점의 온도는 상하좌우 네 이웃의 평균이라는 식(라플라스 방정식의 5점 차분, 16장) 하나로 묶입니다. N=1000N = 1000이면 미지수가 10610^6개입니다. 12장의 띠 촐레스키로 풀면 얼마나 들까요?

격자점을 행 순서로 번호 매기면 n=N2n = N^2차 행렬 AA의 각 행에는 대각 원소 4와 이웃 네 개의 −1-1만 있습니다. 0이 아닌 원소 수(nnz)는 약 5n5n입니다. 이런 행렬을 희소 행렬(sparse matrix)이라 합니다. 문제는 분해입니다. 위아래 이웃이 NN칸 떨어져 있어 띠 폭이 NN이고, 촐레스키 인수는 띠 안을 거의 다 채웁니다(채움(fill-in), 12장).

n=106n = 10^6 (N = 1000)저장연산
밀집 LU101210^{12}칸 = 8 TBn3/3≈3×1017n^3/3 \approx 3\times10^{17}
띠 촐레스키 (띠 폭 N)nN=109nN = 10^9칸 = 8 GBnN2/2=5×1011nN^2/2 = 5\times10^{11}
반복법 한 번 (행렬–벡터 곱)nnz ≈5×106\approx 5\times10^6칸 = 40 MB≈107\approx 10^7

반복법은 AA를 바꾸지 않습니다. 필요한 것은 "벡터 v\mathbf v를 주면 AvA\mathbf v를 돌려주는" 함수뿐이고, 한 번의 비용은 nnz에 비례합니다. 그래서 반복 횟수를 kk라 하면 총비용은 k⋅nnzk\cdot\mathrm{nnz}이고, 이 장의 모든 아이디어는 결국 kk를 줄이는 기술입니다. 같은 문제에서 야코비는 수백만 번, 최적 SOR과 CG는 수천 번, 다중 격자는 열 번 안팎의 V-사이클이 필요하다는 것을 이 장 끝에서 보게 됩니다.

격자점 번호: 행 순서 A의 한 행 (점 6) 4·u₆ − u₂ − u₅ − u₇ − u₁₀ 대각 · 좌우 이웃(±1) 위아래 이웃(±N) 띠 폭 = N nnz ≈ 5n, 나머지는 0 촐레스키 인수는 띠 안을 거의 채운다
그림 13-1. 4 × 4 격자(왼쪽)를 행 순서로 번호 매긴 16차 라플라스 행렬의 희소 패턴(가운데). 검은 칸이 0이 아닌 원소, 연한 칸은 촐레스키 분해에서 새로 생기는 채움이다. 격자가 커질수록 0이 아닌 원소의 비율은 5/n5/n으로 줄지만, 채움은 nNnN으로 늘어난다.

야코비와 가우스–자이델

한 식에서 한 미지수씩

ii번째 방정식 ∑jaijxj=bi\sum_j a_{ij}x_j = b_i를 xix_i에 대해 풀면 xi=(bi−∑j≠iaijxj)/aiix_i = (b_i - \sum_{j\ne i} a_{ij}x_j)/a_{ii}입니다. 오른쪽의 다른 미지수에 지금의 추측값을 넣으면 xix_i의 새 추측이 나옵니다. 이것을 되풀이하면 해에 다가갈까요? 그리고 새 값을 언제부터 쓸까요?

두 가지 선택이 있습니다. 한 바퀴를 도는 동안 이전 값만 쓰는 것이 야코비 방법(Jacobi method), 방금 계산한 x1(k+1),…,xi−1(k+1)x_1^{(k+1)}, \dots, x_{i-1}^{(k+1)}을 즉시 쓰는 것이 가우스–자이델 방법(Gauss–Seidel method)입니다.

정의 13.1 (야코비와 가우스–자이델) aii≠0a_{ii} \ne 0일 때
야코비: xi(k+1)=1aii(bi−∑j≠iaijxj(k)),G–S: xi(k+1)=1aii(bi−∑j<iaijxj(k+1)−∑j>iaijxj(k)).\text{야코비: } x_i^{(k+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j\ne i} a_{ij}x_j^{(k)}\Bigr),\qquad \text{G–S: } x_i^{(k+1)} = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \lt i} a_{ij}x_j^{(k+1)} - \sum_{j \gt i} a_{ij}x_j^{(k)}\Bigr).
야코비는 새 벡터를 따로 저장해야 하지만 모든 ii를 동시에(병렬로) 계산할 수 있다. 가우스–자이델은 벡터 하나를 제자리에서 덮어쓰며, 계산 순서가 결과를 바꾼다.
function gauss_seidel(A, b, x, tol, maxit)
  for k = 1 .. maxit
    for i = 1 .. n                          // 희소 행렬이면 i행의 0 아닌 원소만
      s = b[i]
      for j in nonzeros(row i), j != i
        s = s - A[i][j] * x[j]               // j < i 는 이미 새 값
      x[i] = s / A[i][i]                     // 야코비는 여기서 xnew[i]에 쓴다
    if norm(b - A x) <= tol * norm(b) then return x
  return x                                  // 수렴 실패: 호출자가 확인

2 × 2에서 기하가 분명해집니다. 두 방정식은 평면의 두 직선이고 해는 교점입니다. 가우스–자이델의 첫 갱신은 x2x_2를 고정한 채 x1x_1을 바꿔 첫째 직선 위로 수평 이동하고, 둘째 갱신은 둘째 직선 위로 수직 이동합니다. 계단을 타고 교점으로 내려가는 셈입니다. 야코비는 두 좌표를 동시에 바꾸므로 두 직선 어느 쪽에도 놓이지 않은 점으로 대각선 이동합니다.

예제 13.1 (3 × 3 손계산) 4x1−x2+x3=5, −x1+4x2−2x3=1, x1−2x2+5x3=124x_1 - x_2 + x_3 = 5,\ -x_1 + 4x_2 - 2x_3 = 1,\ x_1 - 2x_2 + 5x_3 = 12의 해는 (1,2,3)(1, 2, 3)이다. x(0)=0\mathbf x^{(0)} = \mathbf 0에서 출발한다.
  1. 야코비 1회: x1=5/4=1.25x_1 = 5/4 = 1.25, x2=1/4=0.25x_2 = 1/4 = 0.25, x3=12/5=2.4x_3 = 12/5 = 2.4.
  2. 가우스–자이델 1회: x1=1.25x_1 = 1.25, 이 값을 곧바로 써서 x2=(1+1.25)/4=0.5625x_2 = (1 + 1.25)/4 = 0.5625, x3=(12−1.25+2⋅0.5625)/5=2.375x_3 = (12 - 1.25 + 2\cdot0.5625)/5 = 2.375.
  3. 여덟 번까지의 최대 오차 ∥x(k)−x∥∞\|\mathbf x^{(k)} - \mathbf x\|_\infty는 아래 표와 같다. 가우스–자이델은 매번 약 0.160.16배, 야코비는 0.50.5–0.650.65배씩 준다. 다음 절에서 이 비율이 반복 행렬의 스펙트럼 반지름 ρJ=0.626\rho_J = 0.626, ρGS=0.158\rho_{GS} = 0.158임을 본다.
k12345678
야코비1.750.7500.4470.2040.1280.06200.04060.0207
가우스–자이델1.440.3630.06850.01352.27×10⁻³3.14×10⁻⁴3.36×10⁻⁵2.73×10⁻⁶
SIMULATOR

2 × 2 반복 경로: 야코비 · 가우스–자이델 · SOR

시작점을 끌기 · 해는 (1, 1)
방법
두 방정식의 직선야코비가우스–자이델SOR
ρ(GJ)—
ρ(GGS)—
ρ(Gω)—
오차 10⁻⁶까지 (J · GS · SOR)—
해볼 것: ① 가우스–자이델(초록)의 경로는 수평–수직 계단이고, 꺾이는 점은 언제나 두 직선 위에 있습니다. ② '결합 강함'에서는 두 직선이 거의 평행해 계단이 길고 촘촘해집니다. ρGS = 0.64 = ρJ²입니다. 이제 ω를 1.25 근처로 두면 SOR이 훨씬 빨리 갑니다. ③ '대각 우세 아님'은 대칭이지만 양정치가 아니어서(고유값 3, −1) 세 방법이 모두 발산합니다. 모델: b = A(1, 1)ᵀ, 반복 행렬의 고유값은 2 × 2 공식으로 계산합니다.

분할과 반복 행렬, 스펙트럼 반지름

세 방법을 한 틀에 넣습니다. AA를 쉽게 풀리는 부분 MM과 나머지로 분할해 A=M−NA = M - N이라 쓰면 Ax=bA\mathbf x = \mathbf b는 Mx=Nx+bM\mathbf x = N\mathbf x + \mathbf b이고, 이를 반복식으로 읽습니다.

정의 13.2 (분할과 반복 행렬) A=M−NA = M - N, MM은 가역이고 Mz=rM\mathbf z = \mathbf r이 싸게 풀린다고 하자. 정상 반복법(stationary iterative method)
Mxk+1=Nxk+b  ⟺  xk+1=xk+M−1(b−Axk)M\mathbf x_{k+1} = N\mathbf x_k + \mathbf b \iff \mathbf x_{k+1} = \mathbf x_k + M^{-1}(\mathbf b - A\mathbf x_k)
의 반복 행렬(iteration matrix)은 G=M−1N=I−M−1AG = M^{-1}N = I - M^{-1}A이다. A=D−L−UA = D - L - U(대각, 순하삼각의 부호 반대, 순상삼각의 부호 반대)로 쓰면 야코비는 M=DM = D, 가우스–자이델은 M=D−LM = D - L, SOR은 M=1ωD−LM = \frac1\omega D - L이다.

오른쪽 꼴이 핵심입니다. 모든 정상 반복법은 "잔차 rk=b−Axk\mathbf r_k = \mathbf b - A\mathbf x_k를 M−1M^{-1}로 근사 풀이해 더한다"는 한 줄이고, MM이 AA에 가까울수록 한 번에 많이 나아갑니다. 오차 ek=xk−x\mathbf e_k = \mathbf x_k - \mathbf x는 b\mathbf b와 무관하게 ek+1=Gek\mathbf e_{k+1} = G\mathbf e_k, 곧 ek=Gke0\mathbf e_k = G^k\mathbf e_0를 따릅니다.

정리 13.3 (수렴의 필요충분조건) 정상 반복이 모든 x0\mathbf x_0에서 수렴할 필요충분조건은 스펙트럼 반지름(spectral radius) ρ(G)=max⁡i∣λi(G)∣\rho(G) = \max_i|\lambda_i(G)|가 1보다 작은 것이다. 또 어떤 노름에서든 lim⁡k→∞∥Gk∥1/k=ρ(G)\lim_{k\to\infty}\|G^k\|^{1/k} = \rho(G)이므로, 오차를 10−m10^{-m}배로 줄이는 데 점근적으로 m/(−log⁡10ρ)m/(-\log_{10}\rho)회가 든다.

증명의 핵심. GG가 대각화 가능하면 e0=∑civi\mathbf e_0 = \sum c_i\mathbf v_i에서 Gke0=∑ciλikviG^k\mathbf e_0 = \sum c_i\lambda_i^k\mathbf v_i이므로 모든 ∣λi∣<1|\lambda_i| \lt 1일 때만 모든 e0\mathbf e_0가 0으로 간다(∣λi∣≥1|\lambda_i| \ge 1이면 e0=vi\mathbf e_0 = \mathbf v_i가 반례). 일반적인 경우에는 조르당 블록 J=λI+EJ = \lambda I + E의 거듭제곱 Jk=∑j(kj)λk−jEjJ^k = \sum_{j} \binom kj \lambda^{k-j}E^j가 ∣λ∣<1|\lambda| \lt 1이면 다항식 × 지수 감소로 0이 된다. ∎

필요충분조건은 고유값을 알아야 쓸 수 있습니다. 실무에서는 행렬을 보고 바로 판정할 수 있는 충분조건이 더 유용합니다.

정리 13.4 (대각 우세와 대칭 양정치)
  1. AA가 엄격한 대각 우세(strictly diagonally dominant), 곧 모든 행에서 ∣aii∣>∑j≠i∣aij∣|a_{ii}| \gt \sum_{j\ne i}|a_{ij}|이면 야코비와 가우스–자이델은 모든 시작점에서 수렴한다.
  2. AA가 대칭 양정치(SPD)이면 가우스–자이델, 그리고 0<ω<20 \lt \omega \lt 2인 SOR이 수렴한다.
  3. (카한) 어떤 행렬이든 ρ(Gω)≥∣ω−1∣\rho(G_\omega) \ge |\omega - 1|이다. 따라서 SOR이 수렴하려면 0<ω<20 \lt \omega \lt 2가 필요하다.

①의 증명. 야코비의 GJ=D−1(L+U)G_J = D^{-1}(L + U)의 ii행 절댓값 합은 ∑j≠i∣aij∣/∣aii∣<1\sum_{j\ne i}|a_{ij}|/|a_{ii}| \lt 1이므로 ρ(GJ)≤∥GJ∥∞<1\rho(G_J) \le \|G_J\|_\infty \lt 1. 가우스–자이델은 ek+1\mathbf e_{k+1}의 성분 중 절댓값이 가장 큰 ii번째를 보면 ∣ei(k+1)∣≤∑j<i∣aij∣∣aii∣∣ej(k+1)∣+∑j>i∣aij∣∣aii∣∣ej(k)∣|e_i^{(k+1)}| \le \sum_{j \lt i}\frac{|a_{ij}|}{|a_{ii}|}|e_j^{(k+1)}| + \sum_{j \gt i}\frac{|a_{ij}|}{|a_{ii}|}|e_j^{(k)}|에서 같은 결론이 나온다. ③의 증명. det⁡Gω=det⁡(D−ωL)−1det⁡((1−ω)D+ωU)=(1−ω)n\det G_\omega = \det(D - \omega L)^{-1}\det((1-\omega)D + \omega U) = (1 - \omega)^n이고, 행렬식은 고유값의 곱이므로 ρn≥∣1−ω∣n\rho^n \ge |1 - \omega|^n. ∎

예제 13.2 (예제 13.1의 반복 행렬) 예제 13.1의 AA는 엄격한 대각 우세다(행마다 4>24 \gt 2, 4>34 \gt 3, 5>35 \gt 3).
  1. GJ=D−1(L+U)G_J = D^{-1}(L+U)의 행 합은 2/4, 3/4, 3/52/4,\ 3/4,\ 3/5이므로 ∥GJ∥∞=0.75\|G_J\|_\infty = 0.75. 정리 13.4의 상한이다.
  2. 실제 스펙트럼 반지름은 ρ(GJ)=0.626\rho(G_J) = 0.626, ρ(GGS)=0.158\rho(G_{GS}) = 0.158이다(반복 행렬에 거듭제곱을 많이 해서 얻은 값). 오차를 10−610^{-6}배 줄이는 데 점근적으로 야코비 6/0.203≈306/0.203 \approx 30회, 가우스–자이델 6/0.801≈7.56/0.801 \approx 7.5회가 든다. 표의 8회 오차 2.7×10−62.7\times10^{-6}과 맞다.
  3. ρGS\rho_{GS}가 ρJ2=0.392\rho_J^2 = 0.392보다 작다. ρGS=ρJ2\rho_{GS} = \rho_J^2은 다음 절의 "일관된 순서" 행렬(삼중대각, 5점 격자 등)에서 성립하는 관계이고, 이 AA는 그런 꼴이 아니다.
주의: 잔차와 오차 반복을 멈추는 기준은 보통 상대 잔차 ∥rk∥/∥b∥\|\mathbf r_k\|/\|\mathbf b\|입니다. 그런데 ek=−A−1rk\mathbf e_k = -A^{-1}\mathbf r_k이므로 ∥ek∥/∥x∥≤κ(A) ∥rk∥/∥b∥\|\mathbf e_k\|/\|\mathbf x\| \le \kappa(A)\,\|\mathbf r_k\|/\|\mathbf b\|입니다(2장). 조건수가 10610^6이면 잔차가 10−810^{-8}이어도 오차는 10−210^{-2}일 수 있습니다. 또 ρ\rho가 1에 가까운 반복에서는 연속한 두 반복값의 차이가 작다고 해서 해에 가깝다는 뜻이 아닙니다. 차이에 1/(1−ρ)1/(1 - \rho)를 곱한 것이 오차의 크기입니다.

SOR과 최적 이완 계수

가우스–자이델이 늘 모자라게 간다면

위 시뮬레이터의 '결합 강함'에서 가우스–자이델은 매번 같은 방향으로 조금씩, 모자라게 갑니다. 그렇다면 G–S가 제안하는 이동을 ω\omega배로 과하게 밀어 주면 어떨까요? 얼마나 밀어야 가장 빠를까요?

축차 과이완(successive over-relaxation, SOR)은 가우스–자이델 값 x~i\tilde x_i와 이전 값 xi(k)x_i^{(k)}의 가중 평균을 씁니다.

xi(k+1)=(1−ω) xi(k)+ω x~i,x~i=1aii(bi−∑j<iaijxj(k+1)−∑j>iaijxj(k)).x_i^{(k+1)} = (1 - \omega)\,x_i^{(k)} + \omega\,\tilde x_i,\qquad \tilde x_i = \frac{1}{a_{ii}}\Bigl(b_i - \sum_{j \lt i}a_{ij}x_j^{(k+1)} - \sum_{j \gt i}a_{ij}x_j^{(k)}\Bigr).
ω=1\omega = 1이면 가우스–자이델, ω>1\omega \gt 1은 과이완, ω<1\omega \lt 1은 부족 이완. 반복 행렬은 Gω=(D−ωL)−1((1−ω)D+ωU)G_\omega = (D - \omega L)^{-1}\bigl((1-\omega)D + \omega U\bigr).

놀랍게도 많은 실용 행렬에서 ρ(Gω)\rho(G_\omega)를 ω\omega의 함수로 정확히 쓸 수 있습니다. 조건은 행렬이 일관된 순서(consistently ordered)를 갖는 것인데, 삼중대각 행렬과 5점 격자 행렬(자연 순서나 적흑 순서)이 여기에 속합니다.

정리 13.5 (영의 정리) AA가 일관된 순서를 갖고 GJG_J의 고유값 μ\mu가 모두 실수이며 ρJ=ρ(GJ)<1\rho_J = \rho(G_J) \lt 1이라 하자. 그러면 GωG_\omega의 고유값 λ\lambda와 μ\mu는
(λ+ω−1)2=λ ω2μ2(\lambda + \omega - 1)^2 = \lambda\,\omega^2\mu^2
로 이어지고, 특히 ρGS=ρJ2\rho_{GS} = \rho_J^2이다. ρ(Gω)\rho(G_\omega)를 최소로 하는 값과 그때의 스펙트럼 반지름은
ω∗=21+1−ρJ2,ρ(Gω∗)=ω∗−1.\omega^* = \frac{2}{1 + \sqrt{1 - \rho_J^2}},\qquad \rho(G_{\omega^*}) = \omega^* - 1.
ω≥ω∗\omega \ge \omega^*에서는 ρ(Gω)=ω−1\rho(G_\omega) = \omega - 1로 직선이고, ω<ω∗\omega \lt \omega^*에서는 ρ=(12ωρJ+14ω2ρJ2−ω+1)2\rho = \bigl(\tfrac12\omega\rho_J + \sqrt{\tfrac14\omega^2\rho_J^2 - \omega + 1}\bigr)^2이다.

아이디어. 고유값 관계를 λ\lambda의 이차방정식 λ−ωμλ+(ω−1)=0\lambda - \omega\mu\sqrt\lambda + (\omega - 1) = 0(λ\sqrt\lambda에 대해)으로 보면, 판별식이 음수가 되는 ω\omega부터 두 근 λ\sqrt\lambda가 켤레 복소수가 되어 ∣λ∣2=ω−1|\sqrt\lambda|^2 = \omega - 1(근의 곱), 곧 ∣λ∣=ω−1|\lambda| = \omega - 1이다. 판별식이 정확히 0이 되는 ω\omega, 곧 ω2ρJ2=4(ω−1)\omega^2\rho_J^2 = 4(\omega - 1)의 작은 근이 ω∗\omega^*이다. ∎

2차원 푸아송 문제(한 변 NN점, h=1/(N+1)h = 1/(N+1))에서는 ρJ=cos⁡πh\rho_J = \cos\pi h이므로 1−ρJ2=sin⁡πh\sqrt{1 - \rho_J^2} = \sin\pi h이고

ρJ≈1−π2h22,ρGS≈1−π2h2,ω∗=21+sin⁡πh,ρSOR≈1−2πh.\rho_J \approx 1 - \frac{\pi^2h^2}{2},\qquad \rho_{GS} \approx 1 - \pi^2h^2,\qquad \omega^* = \frac{2}{1 + \sin\pi h},\qquad \rho_{SOR} \approx 1 - 2\pi h.

1에서 떨어진 거리가 h2h^2에서 hh로 바뀝니다. 오차를 일정 배 줄이는 반복 수가 O(N2)O(N^2)에서 O(N)O(N)으로 줄어든다는 뜻입니다.

예제 13.3 (N = 31 판의 SOR) h=1/32h = 1/32.
  1. ρJ=cos⁡(π/32)=0.99518\rho_J = \cos(\pi/32) = 0.99518, ρGS=0.99039\rho_{GS} = 0.99039, ω∗=2/(1+sin⁡(π/32))=1.8215\omega^* = 2/(1 + \sin(\pi/32)) = 1.8215, ρSOR=0.8215\rho_{SOR} = 0.8215.
  2. 오차를 10−610^{-6}배 줄이는 점근적 횟수 ln⁡10−6/ln⁡ρ\ln 10^{-6}/\ln\rho: 야코비 2863, 가우스–자이델 1432, 최적 SOR 71.
  3. 무작위 해 x∗\mathbf x^*로 실험하면 가우스–자이델 1091회, ω∗\omega^*의 SOR 83회였다. 가우스–자이델이 예측보다 빠른 것은 e0\mathbf e_0에 가장 느린 모드의 성분이 작기 때문이고, SOR이 조금 느린 것은 ω∗\omega^*에서 GωG_\omega가 대각화되지 않아(겹근) 초반에 kρkk\rho^k 꼴로 줄기 때문이다. 같은 실험에서 가장 적은 횟수(70회)는 ω=1.77\omega = 1.77에서 나왔다.
SIMULATOR

ω 슬라이더와 반복 수: 영의 곡선을 실험으로

오차 10⁻⁶까지의 반복 수 (점: 실측, 선: 영의 이론)
선택한 ω의 오차 감소 log₁₀‖e‖
격자 한 변 N
ω* = 2/(1 + sin πh)—
이론 ρ(Gω)—
실측 반복 수—
G–S 대비 속도—
해볼 것: ① 곡선은 ω*에서 가장 낮고, ω*를 지나면 ρ = ω − 1을 따라 올라갑니다. 이론적으로 ρ(ω)는 ω*의 왼쪽에서 기울기가 무한대로 가파르므로, ω*를 모를 때는 조금 작게보다 조금 크게 잡는 편이 덜 손해입니다. ② N을 10 → 30으로 키우면 G–S의 횟수는 127 → 961로 약 7.6배, 최적 SOR은 28 → 82로 약 3배 늘어납니다. O(N²)와 O(N)의 차이입니다. ③ 실측 최솟값이 ω*보다 약간 왼쪽에 있습니다. 예제 13.3의 겹근 효과입니다. 모델: 5점 라플라스 행렬, 자연 순서, 해 x*는 시드 고정 난수, x₀ = 0, 오차 ‖x − x*‖₂ / ‖x*‖₂ ≤ 10⁻⁶에서 멈춤.

이차 형식과 최급 강하

매개변수 없이 빠른 방법

SOR은 ω∗\omega^*를 알 때만 빠르고, ω∗\omega^*는 모델 문제에서나 공식으로 나옵니다. 행렬이 대칭 양정치이기만 하면 아무 매개변수 없이 빠른 방법은 없을까요? 실마리는 연립방정식을 최솟값 문제로 바꾸는 데 있습니다.

정리 13.6 (연립방정식 = 이차 함수의 최소화) AA가 SPD이면 Ax=bA\mathbf x = \mathbf b의 해 x∗\mathbf x^*는
ϕ(x)=12xTAx−bTx\phi(\mathbf x) = \tfrac12\mathbf x^{\mathsf T}A\mathbf x - \mathbf b^{\mathsf T}\mathbf x
의 유일한 최솟점이다. ∇ϕ=Ax−b=−r\nabla\phi = A\mathbf x - \mathbf b = -\mathbf r이고 ϕ(x)−ϕ(x∗)=12∥x−x∗∥A2\phi(\mathbf x) - \phi(\mathbf x^*) = \tfrac12\|\mathbf x - \mathbf x^*\|_A^2, 여기서 ∥e∥A=eTAe\|\mathbf e\|_A = \sqrt{\mathbf e^{\mathsf T}A\mathbf e}는 A-노름(energy norm)이다.

ϕ\phi의 등고선은 AA의 고유벡터를 축으로 하는 타원이고, 긴 축과 짧은 축의 길이 비는 κ\sqrt\kappa(κ=λmax⁡/λmin⁡\kappa = \lambda_{\max}/\lambda_{\min})입니다. 잔차 r\mathbf r은 가장 가파른 내리막 방향입니다. 그 방향의 직선 x+αr\mathbf x + \alpha\mathbf r 위에서 ϕ\phi를 최소로 하는 α\alpha는 ddαϕ=−rTr+α rTAr=0\frac{d}{d\alpha}\phi = -\mathbf r^{\mathsf T}\mathbf r + \alpha\,\mathbf r^{\mathsf T}A\mathbf r = 0에서 나옵니다.

function steepest_descent(A, b, x, tol)
  r = b - A x
  while norm(r) > tol * norm(b)
    q = A r                                // 반복마다 행렬–벡터 곱 한 번
    alpha = dot(r, r) / dot(r, q)          // 직선 위의 정확한 최솟점
    x = x + alpha * r
    r = r - alpha * q                      // b - A x 를 다시 계산하지 않는다
  return x
정리 13.7 (최급 강하의 수렴) SPD 행렬에서 정확한 직선 탐색을 쓰는 최급 강하법(steepest descent)은
∥ek+1∥A≤κ−1κ+1 ∥ek∥A\|\mathbf e_{k+1}\|_A \le \frac{\kappa - 1}{\kappa + 1}\,\|\mathbf e_k\|_A
를 만족한다(칸토로비치 부등식에서 나온다). 연속한 두 잔차는 서로 수직이다(rk+1Trk=0\mathbf r_{k+1}^{\mathsf T}\mathbf r_k = 0). 그래서 길쭉한 골짜기에서는 벽 사이를 오가는 지그재그가 된다.
예제 13.4 (2 × 2 최급 강하) A=[5222]A = \begin{bmatrix}5 & 2\\ 2 & 2\end{bmatrix}(고유값 6, 1, κ=6\kappa = 6), b=(7,4)\mathbf b = (7, 4), 해 (1,1)(1, 1), x0=0\mathbf x_0 = \mathbf 0.
  1. r0=(7,4)\mathbf r_0 = (7, 4), Ar0=(43,22)A\mathbf r_0 = (43, 22), α0=65/389=0.16710\alpha_0 = 65/389 = 0.16710, x1=(1.16967, 0.66838)\mathbf x_1 = (1.16967,\ 0.66838).
  2. r1=(−0.18509, 0.32391)\mathbf r_1 = (-0.18509,\ 0.32391). r0Tr1=7(−0.18509)+4(0.32391)=0\mathbf r_0^{\mathsf T}\mathbf r_1 = 7(-0.18509) + 4(0.32391) = 0으로 수직이다. α1=0.98485\alpha_1 = 0.98485, x2=(0.98738, 0.98738)\mathbf x_2 = (0.98738,\ 0.98738).
  3. A-노름 오차는 3.3166, 0.37258, 0.041855, 0.0047020, …로 매번 정확히 0.1123배다. 2차원에서는 지그재그가 두 방향을 번갈아 오가므로 비가 일정하다. 상한 (κ−1)/(κ+1)=5/7=0.714(\kappa - 1)/(\kappa + 1) = 5/7 = 0.714는 최악의 시작점에서 나온다.

켤레 기울기법

지그재그의 원인은 새 방향으로 최소화하면서 이전 방향에서 얻은 최소성을 망치는 데 있습니다. 해결책은 방향들을 AA에 대해 서로 "수직"으로 고르는 것입니다. piTApj=0\mathbf p_i^{\mathsf T}A\mathbf p_j = 0(i≠ji \ne j)이면 pi,pj\mathbf p_i, \mathbf p_j를 A-켤레(A-conjugate)라 합니다. A=RTRA = R^{\mathsf T}R로 좌표를 y=Rx\mathbf y = R\mathbf x로 바꾸면 타원 등고선이 원이 되고, A-켤레 방향은 그 좌표에서 평범한 직교 방향입니다. 원 위에서 서로 수직인 방향으로 한 번씩 최소화하면 nn번 만에 중심에 닿습니다.

A-켤레 방향을 미리 구하는 것은 비쌉니다(그람–슈미트에 모든 이전 방향이 필요). 켤레 기울기법(conjugate gradient, CG)의 기적은 새 잔차를 바로 직전 방향 하나에 대해서만 A-켤레로 만들어도 모든 이전 방향과 저절로 A-켤레가 된다는 것입니다.

function cg(A, b, x, tol)
  r = b - A x;  p = r;  rr = dot(r, r)
  while sqrt(rr) > tol * norm(b)
    q = A p
    alpha = rr / dot(p, q)                 // p 방향의 정확한 최소화
    x = x + alpha * p
    r = r - alpha * q
    rr_new = dot(r, r)
    beta = rr_new / rr                     // 새 방향을 p와 A-켤레로
    p = r + beta * p
    rr = rr_new
  return x                               // 반복당: 곱 1번, 내적 2번, 벡터 갱신 3번
정리 13.8 (CG의 구조) AA가 SPD이고 rk≠0\mathbf r_k \ne 0이면
  1. 잔차들은 서로 직교하고(riTrj=0\mathbf r_i^{\mathsf T}\mathbf r_j = 0), 방향들은 서로 A-켤레다(piTApj=0\mathbf p_i^{\mathsf T}A\mathbf p_j = 0), i≠ji \ne j.
  2. span{p0,…,pk−1}=span{r0,Ar0,…,Ak−1r0}=Kk(A,r0)\mathrm{span}\{\mathbf p_0, \dots, \mathbf p_{k-1}\} = \mathrm{span}\{\mathbf r_0, A\mathbf r_0, \dots, A^{k-1}\mathbf r_0\} = \mathcal K_k(A, \mathbf r_0), 크릴로프 부분공간(Krylov subspace).
  3. xk\mathbf x_k는 x0+Kk\mathbf x_0 + \mathcal K_k 안에서 ∥x−x∗∥A\|\mathbf x - \mathbf x^*\|_A를 최소로 하는 점이다. 따라서 정확한 산술에서 많아야 nn번에 끝난다.

증명의 핵심. 귀납법. rk+1=rk−αkApk\mathbf r_{k+1} = \mathbf r_k - \alpha_kA\mathbf p_k와 αk\alpha_k의 정의로 rk+1⊥rk\mathbf r_{k+1} \perp \mathbf r_k, βk\beta_k의 정의로 pk+1⊥Apk\mathbf p_{k+1} \perp_A \mathbf p_k가 바로 나온다. j<kj \lt k에 대해서는 Apj∈Kj+2=span{r0,…,rj+1}A\mathbf p_j \in \mathcal K_{j+2} = \mathrm{span}\{\mathbf r_0, \dots, \mathbf r_{j+1}\}이고 rk+1\mathbf r_{k+1}은 이미 그 모든 잔차와 직교하므로 rk+1TApj=0\mathbf r_{k+1}^{\mathsf T}A\mathbf p_j = 0, 따라서 pk+1TApj=0\mathbf p_{k+1}^{\mathsf T}A\mathbf p_j = 0. 잔차가 Kk\mathcal K_k에 직교한다는 것이 곧 A-노름 최소의 조건(갈료르킨 조건)이다. ∎

최소성에서 수렴 속도가 나옵니다. xk−x∗=Pk(A)(x0−x∗)\mathbf x_k - \mathbf x^* = P_k(A)(\mathbf x_0 - \mathbf x^*)이고 PkP_k는 Pk(0)=1P_k(0) = 1인 kk차 다항식 중 무엇이든 될 수 있으므로, 고유벡터로 전개하면

∥ek∥A∥e0∥A≤min⁡Pk(0)=1 max⁡λ∈σ(A)∣Pk(λ)∣.\frac{\|\mathbf e_k\|_A}{\|\mathbf e_0\|_A} \le \min_{P_k(0) = 1}\ \max_{\lambda \in \sigma(A)} |P_k(\lambda)|.
σ(A)\sigma(A)는 AA의 고유값 집합. CG는 고유값 위에서 작은 값을 갖는 다항식을 스스로 찾는다.
정리 13.9 (CG의 수렴 한계)
  1. (조건수) 고유값이 [λmin⁡,λmax⁡][\lambda_{\min}, \lambda_{\max}]에 있으면, 이 구간에서 체비쇼프 다항식(7장)을 쓰면 ∥ek∥A≤2(κ−1κ+1)k∥e0∥A\|\mathbf e_k\|_A \le 2\Bigl(\dfrac{\sqrt\kappa - 1}{\sqrt\kappa + 1}\Bigr)^k\|\mathbf e_0\|_A. 오차를 10−m10^{-m}배 줄이는 데 약 1.15 mκ1.15\,m\sqrt\kappa회.
  2. (서로 다른 고유값) AA의 서로 다른 고유값이 mm개뿐이면 P(λ)=∏i(1−λ/λi)P(\lambda) = \prod_i(1 - \lambda/\lambda_i)가 모든 고유값에서 0이므로 CG는 mm번 만에 끝난다.

최급 강하의 (κ−1)/(κ+1)≈1−2/κ(\kappa - 1)/(\kappa + 1) \approx 1 - 2/\kappa가 CG에서는 1−2/κ1 - 2/\sqrt\kappa로 바뀝니다. κ=104\kappa = 10^4이면 오차를 10배 줄이는 데 최급 강하는 약 11500회, CG는 약 115회입니다. 푸아송 문제의 κ≈4/(πh)2\kappa \approx 4/(\pi h)^2를 넣으면 CG의 반복 수는 O(N)O(N), 최적 SOR과 같은 차수이면서 ω\omega를 고를 필요가 없습니다.

예제 13.5 (3 × 3 CG 손계산) A=[410131012]A = \begin{bmatrix}4 & 1 & 0\\ 1 & 3 & 1\\ 0 & 1 & 2\end{bmatrix}(고유값 3±33 \pm \sqrt3, 3), b=(6,10,8)\mathbf b = (6, 10, 8), 해 (1,2,3)(1, 2, 3), x0=0\mathbf x_0 = \mathbf 0.
  1. r0=p0=(6,10,8)\mathbf r_0 = \mathbf p_0 = (6, 10, 8), r0Tr0=200\mathbf r_0^{\mathsf T}\mathbf r_0 = 200, Ap0=(34,44,26)A\mathbf p_0 = (34, 44, 26), p0TAp0=852\mathbf p_0^{\mathsf T}A\mathbf p_0 = 852, α0=200/852=0.23474\alpha_0 = 200/852 = 0.23474. x1=(1.4085, 2.3474, 1.8779)\mathbf x_1 = (1.4085,\ 2.3474,\ 1.8779).
  2. r1=(−1.9812, −0.3286, 1.8967)\mathbf r_1 = (-1.9812,\ -0.3286,\ 1.8967), ∥r1∥2=7.6308\|\mathbf r_1\|^2 = 7.6308, β0=7.6308/200=0.03815\beta_0 = 7.6308/200 = 0.03815, p1=(−1.7523, 0.0529, 2.2019)\mathbf p_1 = (-1.7523,\ 0.0529,\ 2.2019). α1=0.34630\alpha_1 = 0.34630, x2=(0.8016, 2.3657, 2.6405)\mathbf x_2 = (0.8016,\ 2.3657,\ 2.6405).
  3. ∥r2∥2=0.5986\|\mathbf r_2\|^2 = 0.5986, β1=0.07845\beta_1 = 0.07845, p2=(0.2903, −0.5352, 0.5261)\mathbf p_2 = (0.2903,\ -0.5352,\ 0.5261), α2=0.68342\alpha_2 = 0.68342. x3=(1,2,3)\mathbf x_3 = (1, 2, 3), 잔차 8.4×10−168.4\times10^{-16}.
  4. A-노름 오차 7.071 → 1.747 → 0.640 → 0. 세 번 만에 정확한 해(반올림 오차 범위)에 닿았다. 계산된 p0TAp1\mathbf p_0^{\mathsf T}A\mathbf p_1, r0Tr1\mathbf r_0^{\mathsf T}\mathbf r_1은 모두 10−1410^{-14} 이하로 0이다.
SIMULATOR

최급 강하의 지그재그 vs CG의 두 걸음

시작점을 끌기 · 바닥 = 해
좌표
최급 강하켤레 기울기φ의 등고선
최급 강하: A-노름 10⁻⁶까지—
CG: 정확한 해까지—
최급 강하 실측 비 · 상한 (κ−1)/(κ+1)—
p₀ᵀA p₁ (A-켤레 확인)—
해볼 것: ① κ를 키우면 최급 강하(빨강)가 좁은 골짜기를 수십 번 가로지릅니다. 연속한 두 걸음은 언제나 직각입니다. ② CG(보라)는 κ와 시작점에 관계없이 두 걸음에 끝납니다. ③ 'A-좌표'로 바꾸면 타원이 원이 되고, CG의 두 걸음이 직각으로 보입니다. A-켤레는 이 좌표에서의 직교입니다. 최급 강하의 걸음은 이 좌표에서는 더 이상 직각이 아닙니다. ④ 시작점을 타원의 축 위에 두면 두 방법 모두 한 걸음입니다. 모델: A = R diag(κ, 1) Rᵀ, 해 (0, 0).

2차원에서는 CG가 언제나 두 걸음이니 차이가 극적이지만, 실제로 관심 있는 것은 nn이 클 때 nn보다 훨씬 적은 반복으로 충분히 정확해지는가입니다. 정리 13.9의 두 한계는 같은 κ\kappa라도 고유값이 어떻게 흩어져 있느냐에 따라 CG가 아주 다르게 행동한다는 것을 말해 줍니다.

SIMULATOR

CG의 수렴은 고유값 분포가 정한다 (n = 100)

고유값 (로그 눈금)
상대 잔차 ‖rₖ‖/‖b‖ vs 반복 k
κ—
서로 다른 고유값—
CG 반복 (잔차 10⁻⁸)—
√κ 한계가 예측한 반복—
해볼 것: ① '[1, 100]에 고르게'는 한계(점선)보다 빨리 갑니다. ② '서로 다른 값 5개'는 정확히 5번, '세 무리'는 16번 만에 끝납니다. ③ '[1, 2] + 큰 값 3개'는 κ ≈ 10⁴인데도 21번입니다. CG는 처음 몇 번에 큰 고유값 몇 개를 "잡아 내고" 나머지의 작은 κ로 수렴합니다. ④ '로그로 고르게'는 정확한 산술이라면 100번에 끝나야 하지만 344번이 걸립니다. 반올림으로 방향들의 A-켤레성이 무너지기 때문입니다. 모델: A = diag(λ), b = (1, …, 1)/√n, x₀ = 0. 대각 행렬이어도 CG의 행동은 직교 닮음 Q diag(λ) Qᵀ와 같습니다.

전처리: 문제를 풀기 쉬운 꼴로 바꾸기

격자를 두 배로 하면 반복도 두 배

푸아송 문제의 CG 반복 수는 κ∝N\sqrt\kappa \propto N에 비례합니다. 3차원 격자 2003200^3이면 천 번을 넘고, 재료 상수가 1000배 차이 나는 문제에서는 κ\kappa가 함께 커져 반복이 열 배 넘게 늘어납니다(아래 표). AA 대신 조건수가 작은 다른 행렬을 풀 수 있다면?

AA와 비슷하면서 Mz=rM\mathbf z = \mathbf r이 싸게 풀리는 SPD 행렬 MM을 전처리기(preconditioner)라 합니다. M−1Ax=M−1bM^{-1}A\mathbf x = M^{-1}\mathbf b는 같은 해를 갖고, M≈AM \approx A이면 M−1A≈IM^{-1}A \approx I라 고유값이 1 근처에 모입니다. 대칭을 유지하려면 M=LLTM = LL^{\mathsf T}로 쓰고 L−1AL−TL^{-1}AL^{-\mathsf T}에 CG를 적용하는데, 식을 정리하면 LL이 사라지고 매 반복 Mz=rM\mathbf z = \mathbf r 하나만 더 푸는 전처리 CG(PCG)가 됩니다.

function pcg(A, b, x, M, tol)
  r = b - A x;  z = solve(M, r);  p = z;  rz = dot(r, z)
  while norm(r) > tol * norm(b)
    q = A p
    alpha = rz / dot(p, q)
    x = x + alpha * p;  r = r - alpha * q
    z = solve(M, r)                        // 전처리: M z = r (싸게!)
    rz_new = dot(r, z);  beta = rz_new / rz
    p = z + beta * p;  rz = rz_new
  return x

M=AM = A면 한 번에 끝나지만 MM을 푸는 것이 원래 문제이고, M=IM = I면 공짜지만 효과가 없습니다. 쓸모 있는 전처리기는 그 사이의 절충입니다.

정의 13.10 (야코비 전처리와 불완전 촐레스키)
  • 야코비(대각) 전처리 M=D=diag(A)M = D = \mathrm{diag}(A). 행과 열의 크기를 맞추는 역할을 하며, 계수가 크게 다른 영역이 섞인 문제에서 효과가 크다. 대각이 상수인 행렬에서는 효과가 없다.
  • 불완전 촐레스키 IC(0): 촐레스키 분해를 하되 AA에서 0이었던 자리에 생기는 채움은 버린다. 인수 L~\tilde L은 AA의 하삼각과 같은 희소 패턴을 가져 저장·풀이 비용이 nnz에 비례하고, M=L~L~T≈AM = \tilde L\tilde L^{\mathsf T} \approx A이다. 5점 격자 행렬에서는 대각만 다시 계산하면 된다: dp=app−ap,p−12/dp−1−ap,p−N2/dp−Nd_p = a_{pp} - a_{p,p-1}^2/d_{p-1} - a_{p,p-N}^2/d_{p-N}.
PCG 반복 수 (상대 잔차 10⁻⁸)N = 16N = 32N = 64
푸아송: 없음 / 야코비 / IC(0)28 / 28 / 1759 / 59 / 29119 / 119 / 52
가운데 정사각형 계수 1000배: 없음 / 야코비 / IC(0)125 / 32 / 22503 / 69 / 381592 / 139 / 72

표가 전처리의 두 얼굴을 보여 줍니다. 균일한 푸아송 문제에서 야코비 전처리는 대각이 모두 4라 아무 일도 하지 않고, IC(0)는 반복을 절반 아래로 줄이지만 NN에 비례해 느는 성질은 그대로입니다. 계수가 1000배 뛰는 문제에서는 야코비만으로도 반복이 7–11분의 1이 됩니다. 반복 수가 NN과 무관해지는 전처리기는 다음 절의 다중 격자에서 나옵니다.

SIMULATOR

전처리 CG: 없음 · 야코비 · 불완전 촐레스키

log₁₀ 상대 잔차 vs 반복
확산 계수 k(x, y) · 해 u
격자 한 변 N
CG (전처리 없음)야코비 PCGIC(0) PCG
CG—
야코비 PCG—
IC(0) PCG—
미지수 n—
해볼 것: ① 균일한 문제에서 빨강과 주황 곡선이 정확히 겹칩니다. 대각이 상수이면 야코비 전처리는 스칼라 배일 뿐입니다. ② '가운데 정사각형'에서 전처리 없는 CG는 계수가 뛰는 경계에서 오래 헤맵니다. ③ N을 두 배로 하면 세 곡선 모두 대략 두 배 길어집니다. 반복 수가 √κ ∝ N에 비례한다는 성질은 IC(0)로도 바뀌지 않습니다. 모델: 셀 중심 계수, 면 계수는 조화 평균, 경계 u = 0, h² 배율의 5점 행렬. 아래 그림의 색은 계수(왼쪽 절반)와 IC(0) PCG로 구한 해(오른쪽 절반)입니다.

크릴로프 부분공간과 GMRES

바람이 부는 열 방정식

오염 물질이 바람에 실려 가며 퍼지는 대류–확산 방정식 −Δu+βux=f-\Delta u + \beta u_x = f를 격자로 나누면, 대류 항 때문에 행렬이 비대칭이 됩니다. CG는 대칭 양정치를 가정하므로 쓸 수 없습니다. 실제로 억지로 돌리면 잔차가 줄지 않고 커집니다. 비대칭 행렬에서도 크릴로프 공간의 아이디어를 살릴 수 있을까요?

CG가 한 일을 다시 보면, xk\mathbf x_k를 크릴로프 공간 x0+Kk(A,r0)\mathbf x_0 + \mathcal K_k(A, \mathbf r_0)에서 골랐습니다. 이 공간은 행렬–벡터 곱만으로 만들어지므로 비대칭이어도 쓸 수 있습니다. 바뀌는 것은 "가장 좋은 점"의 기준입니다. A-노름은 SPD에서만 노름이므로, 대신 잔차의 2-노름을 최소화합니다. 이것이 GMRES(generalized minimal residual)입니다.

이를 위해 먼저 크릴로프 공간의 정규직교 기저를 만듭니다. r0,Ar0,A2r0,…\mathbf r_0, A\mathbf r_0, A^2\mathbf r_0, \dots를 그대로 쓰면 거듭제곱법처럼 모두 지배 고유벡터 쪽으로 쏠려 거의 평행해지므로, 새 벡터를 만들 때마다 그람–슈미트로 직교화합니다. 이것이 아놀디 과정(Arnoldi iteration)입니다.

function gmres(A, b, x0, m, tol)          // m: 재시작 길이
  r = b - A x0;  beta = norm(r);  v[1] = r / beta
  for j = 1 .. m                           // 아놀디: A V_m = V_(m+1) H
    w = A v[j]
    for i = 1 .. j
      H[i][j] = dot(w, v[i]);  w = w - H[i][j] * v[i]
    H[j+1][j] = norm(w);  v[j+1] = w / H[j+1][j]
    // 작은 최소제곱 문제: min_y ‖beta e1 - H y‖, 기븐스 회전으로 갱신
    if |잔차 추정| <= tol * norm(b) then break
  x = x0 + V y
  if 수렴하지 않았으면 x0 = x 로 다시 시작   // GMRES(m)
정리 13.11 (GMRES) 아놀디 과정은 AVk=Vk+1HˉkAV_k = V_{k+1}\bar H_k를 만족하는 정규직교 기저 VkV_k와 (k+1)×k(k+1)\times k 헤센베르크 행렬 Hˉk\bar H_k를 만든다. xk=x0+Vky\mathbf x_k = \mathbf x_0 + V_k\mathbf y로 두면 ∥b−Axk∥2=∥βe1−Hˉky∥2\|\mathbf b - A\mathbf x_k\|_2 = \|\beta\mathbf e_1 - \bar H_k\mathbf y\|_2이므로 nn차원 문제가 (k+1)×k(k+1)\times k 최소제곱 문제로 줄어든다. 잔차 노름은 단조 감소하며, 정확한 산술에서 많아야 nn번에 끝난다. 한편 kk번째 반복은 벡터 kk개를 저장하고 kk번의 내적을 하므로 비용이 kk에 비례해 커진다.

비용이 계속 커지므로 실무에서는 mm번마다 지금까지의 해를 새 출발점으로 삼아 다시 시작합니다. 이 재시작 GMRES(m)은 메모리를 mm개 벡터로 묶는 대가로 크릴로프 공간에 쌓인 정보를 버리므로 더 많은 반복이 필요하고, 때로는 정체합니다. 대칭 행렬에서는 아놀디의 HH가 삼중대각이 되어 직교화가 직전 두 벡터로 충분하며(란초시 과정), 이것이 CG가 짧은 점화식으로 끝나는 이유입니다. 비대칭에서 짧은 점화식을 원하면 BiCGSTAB 같은 방법을 쓰지만 최소성은 포기합니다.

SIMULATOR

대류–확산 방정식: 완전 GMRES vs 재시작 GMRES(m) vs CG

재시작 길이 m
완전 GMRESGMRES(m)CG재시작 시점
완전 GMRES 반복 (10⁻⁸)—
GMRES(m) 반복—
저장 벡터 수 (완전 · m)—
CG 최종 잔차—
해볼 것: ① β = 0(대칭)에서는 CG와 완전 GMRES가 같은 59회에 끝납니다. ② β를 10만 올려도 CG의 잔차는 줄지 않고 커집니다. 비대칭 행렬에서는 CG의 직교성 논리가 성립하지 않습니다. ③ GMRES(m)의 곡선은 재시작(세로 점선)마다 꺾입니다. 재시작 길이를 늘린다고 늘 빨라지지는 않습니다. β = 0에서는 m = 5, 10, 20, 40이 816, 445, 222, 101회로 차례로 빨라지지만, β = 20에서는 121, 128, 217, 195회입니다. 모델: N = 32, 5점 확산 + 중앙 차분 대류(셀 페클레 수 βh/2 ≤ 0.91), f = 1, 경계 u = 0, 최대 900회.

다중 격자: 매끄러운 오차는 거친 격자에서

잔차는 금방 주는데 해는 그대로

가우스–자이델로 판의 온도를 풀면 처음 몇 번은 잔차가 쑥 줄다가 곧 거의 멈춥니다. 남은 오차를 그려 보면 판 전체에 걸친 완만한 언덕 모양입니다. 왜 매끄러운 오차만 남을까요? 그리고 매끄러운 것은 적은 점으로 표현할 수 있다는 사실을 이용할 수 있을까요?

1차원 모델 −u′′=f-u'' = f(NN점, h=1/(N+1)h = 1/(N+1))에서 오차를 사인 모드 sin⁡(kπx)\sin(k\pi x)로 전개해 봅시다. 가중 야코비 x←x+ωD−1r\mathbf x \leftarrow \mathbf x + \omega D^{-1}\mathbf r는 각 모드를 독립적으로 줄이며, 그 배율은

gk=1−2ωsin⁡2kπh2,k=1,…,N.g_k = 1 - 2\omega\sin^2\frac{k\pi h}{2},\qquad k = 1, \dots, N.
ω=2/3\omega = 2/3이면 고주파 절반(k≥N/2k \ge N/2)에서 ∣gk∣≤1/3|g_k| \le 1/3이다. 그러나 k=1k = 1에서는 g1≈1−ωπ2h22g_1 \approx 1 - \frac{\omega\pi^2h^2}{2}, N=63N = 63이면 0.9992로 거의 줄지 않는다.

그래서 완화 반복은 해법으로는 느리지만 평활화(smoothing)로는 훌륭합니다. 몇 번만 돌리면 고주파 오차가 사라지고 매끄러운 오차가 남습니다. 매끄러운 오차는 격자 간격을 두 배로 한 거친 격자에서도 잘 표현되며, 거기서는 같은 모드가 상대적으로 두 배 높은 주파수라 평활화가 다시 효과적입니다. 이 관찰을 재귀로 엮은 것이 다중 격자법(multigrid)입니다.

h2h4h8h ① 평활화 ν번 ② 잔차를 제한 R ③ 가장 거친 격자에서 정확히 풀기 ④ 보정을 보간 P하여 더하기 ⑤ 다시 평활화 ν번
그림 13-2. V-사이클. 각 층에서 평활화로 고주파 오차를 없애고, 남은 잔차를 거친 격자로 내려 보낸다(제한). 가장 거친 격자의 작은 문제를 풀고, 그 보정을 보간해 올라오며 다시 평활화한다. 각 층의 비용이 위 층의 1/4(2차원)이므로 전체 비용은 가장 고운 층의 4/3배다.
function vcycle(h, u, f)
  if 격자가 가장 거칠면 return solve_exact(A_h, f)
  u = smooth(A_h, u, f, nu)                // 가우스–자이델 2번: 고주파 제거
  r = f - A_h u
  rc = restrict(r)                         // 2h 격자로 (가중 평균)
  ec = vcycle(2h, 0, rc)                   // 오차 방정식 A_2h e = rc 를 재귀로
  u = u + prolong(ec)                      // h 격자로 (선형 보간)
  u = smooth(A_h, u, f, nu)
  return u
정리 13.12 (다중 격자의 격자 무관 수렴, 개요) 푸아송 같은 타원형 문제에서 적절한 평활기와 제한·보간 연산을 쓰면 V-사이클 한 번의 오차 축소율은 hh와 무관한 상수 ρMG<1\rho_{MG} \lt 1로 묶인다. 한 사이클의 비용은 O(n)O(n)이므로 정해진 정확도까지 총비용이 O(n)O(n), 곧 미지수 하나당 상수 번의 연산이다. 핵심은 두 성질의 결합이다. 평활기가 고주파를 줄이고(평활 성질), 거친 격자가 저주파를 정확히 표현한다(근사 성질).
예제 13.6 (V-사이클의 축소율 측정) 2차원 푸아송 −Δu=1-\Delta u = 1, u=0u = 0 경계, 가우스–자이델 평활 앞뒤 2번, 완전 가중 제한, 쌍선형 보간, 가장 거친 격자 3 × 3.
  1. N=15,31,63,127N = 15, 31, 63, 127에서 사이클당 잔차 축소율은 0.080, 0.087, 0.089, 0.090. 격자를 8배로 세분해도 거의 그대로다.
  2. 상대 잔차 10−810^{-8}까지 네 경우 모두 8사이클. 같은 문제에서 가우스–자이델 반복 수는 N2N^2에, CG는 NN에 비례해 늘어난다.
SIMULATOR

오차 모드의 평활화: 고주파가 먼저 사라진다

오차 e(x) (N = 63)
모드별 크기 |êk| (로그 눈금)
평활기
평활 횟수0
‖e‖ / ‖e₀‖—
고주파(k ≥ 32) 비율—
해볼 것: ① 처음 오차 '저주파 + 고주파'에서 1번씩 눌러 보세요. 세 번이면 톱니가 사라지고 k = 2의 언덕만 남습니다. 막대 그림에서 오른쪽 절반이 먼저 내려앉습니다. ② ω = 1인 야코비는 가장 높은 모드(k = 63)를 g ≈ −1로 거의 줄이지 못해 톱니가 부호만 바꾸며 남습니다. 가중치 ⅔가 필요한 이유입니다. ③ 10번을 눌러도 k = 1, 2는 거의 그대로입니다. 이것을 없애는 것이 거친 격자의 몫입니다. 모델: 1차원 −u″ = 0(오차 방정식), 경계 0, 모드 크기는 이산 사인 변환.

마지막으로 판의 온도 문제에서 이 장의 방법을 모두 경주시켜 봅니다. 해만 보면 차이가 잘 보이지 않지만 오차를 보면 각 방법의 성격이 드러납니다. 가우스–자이델의 오차는 매끄러운 언덕으로 남아 천천히 가라앉고, 다중 격자의 오차는 사이클마다 전체가 한 자릿수씩 내려갑니다.

SIMULATOR

2차원 푸아송 판: 다섯 방법의 경주

온도 u
log₁₀ 상대 잔차 vs 반복 (MG는 V-사이클 수)
방법 (그림)
보기
격자 한 변 N
야코비가우스–자이델SOR ω*CG다중 격자 V(2,2)
반복 k0
상대 잔차—
최대 오차—
10⁻⁶까지 (J · GS · SOR · CG · MG)—
해볼 것: ① G–S로 '오차'를 보고 ▶를 누르세요. 톱니 무늬는 몇 번 만에 사라지고 판 전체의 둥근 언덕이 오래 남습니다. ② '다중 격자'로 바꾸면 다섯 사이클 만에 오차가 10⁻⁶ 아래로 갑니다. ③ N을 15 → 63으로 키우면 야코비·G–S의 반복 수는 약 13배, SOR·CG는 약 4배 늘지만 다중 격자는 그대로 5입니다. 모델: 위쪽 가장자리 온도 1, 나머지 0, 5점 차분, 시작값 0. 오차는 다중 격자를 10⁻¹³까지 돌린 해와 비교합니다.

이 도구가 쓰이는 곳

큰 희소 선형계는 편미분방정식, 그래프, 영상, 최적화의 내부 어디에나 있습니다. 어떤 반복법을 고를지는 행렬의 성질이 정합니다.

행렬알맞은 방법대표 쓰임
대칭 양정치 (확산, 탄성, 그래프 라플라시안)PCG + IC 또는 대수적 다중 격자구조 해석, 열 해석, 압력 푸아송(유체), 회로망
비대칭 (대류, 반도체 소자 방정식)GMRES(m), BiCGSTAB + ILU유체 역학, 소자 시뮬레이션, 화학 공정
격자 위의 타원형 문제기하적 다중 격자 (단독 또는 CG의 전처리)기상 모델, 천체 중력장, 실시간 유체
대각 우세, 병렬 기기야코비, 적흑 가우스–자이델GPU 계산, 다중 격자의 평활기
예제 13.7 (영상 처리: 구멍 메우기) 손상된 영상의 빈 픽셀을 주변과 매끄럽게 잇는 가장 단순한 방법은 빈 영역에서 라플라스 방정식 Δu=0\Delta u = 0을 풀고, 빈 영역 둘레의 알려진 픽셀을 경계값으로 쓰는 것이다. 이산화하면 "빈 픽셀 = 네 이웃의 평균"이고, 이는 정확히 이 장의 5점 행렬이다. 픽셀 하나하나가 미지수이므로 사진 한 장에서도 미지수가 수십만 개가 되고, 행렬을 만들 필요도 없이 가우스–자이델 스윕을 영상 위에서 직접 돌리면 된다. 붙여 넣은 영상의 경계를 매끄럽게 섞는 푸아송 영상 편집도 같은 방정식에 우변(붙일 영상의 라플라시안)만 더한 것이다.

핵심 정리

  1. 큰 희소 행렬은 분해하면 채움으로 메모리와 연산이 폭발한다. 반복법은 행렬–벡터 곱(비용 ∝ nnz)만 쓰며, 목표는 반복 횟수를 줄이는 것이다.
  2. 정상 반복 xk+1=xk+M−1rk\mathbf x_{k+1} = \mathbf x_k + M^{-1}\mathbf r_k의 오차는 ek+1=Gek\mathbf e_{k+1} = G\mathbf e_k, G=I−M−1AG = I - M^{-1}A. 수렴의 필요충분조건은 ρ(G)<1\rho(G) \lt 1이고, 오차를 10−m10^{-m}배 줄이는 데 약 m/(−log⁡10ρ)m/(-\log_{10}\rho)회가 든다.
  3. 엄격한 대각 우세이면 야코비·G–S가, SPD이면 G–S와 0<ω<20 \lt \omega \lt 2의 SOR이 수렴한다. 일관된 순서의 행렬에서 ρGS=ρJ2\rho_{GS} = \rho_J^2, ω∗=2/(1+1−ρJ2)\omega^* = 2/(1 + \sqrt{1 - \rho_J^2}), ρ=ω∗−1\rho = \omega^* - 1.
  4. 푸아송 문제에서 야코비·G–S는 O(N2)O(N^2)회, 최적 SOR과 CG는 O(N)O(N)회, 다중 격자는 NN과 무관한 횟수가 필요하다.
  5. SPD 연립방정식은 ϕ=12xTAx−bTx\phi = \tfrac12\mathbf x^{\mathsf T}A\mathbf x - \mathbf b^{\mathsf T}\mathbf x의 최소화다. 최급 강하는 (κ−1)/(κ+1)(\kappa - 1)/(\kappa + 1)로, CG는 (κ−1)/(κ+1)(\sqrt\kappa - 1)/(\sqrt\kappa + 1)로 수렴한다.
  6. CG는 크릴로프 공간에서 A-노름 오차를 최소화한다. 서로 다른 고유값이 mm개면 mm번에 끝나고, 몇 개의 큰 고유값은 몇 번의 반복으로 "잡아 낸다". 반올림은 이 성질을 늦춘다.
  7. 전처리 M≈AM \approx A는 고유값을 1 근처에 모아 반복을 줄인다. 야코비는 계수 크기 차이를, IC(0)는 채움을 버린 분해로 구조를 잡는다.
  8. 비대칭 행렬에는 아놀디 기저 위에서 잔차를 최소화하는 GMRES를 쓰고, 메모리 때문에 재시작한다. 다중 격자는 평활화로 고주파를, 거친 격자로 저주파를 없애 O(n)O(n) 비용에 푼다.

확인 퀴즈

Q1. 반복 행렬의 스펙트럼 반지름이 ρ=0.9\rho = 0.9이다. 오차를 10−610^{-6}배로 줄이려면 대략 몇 번 반복해야 하는가?

0.9k=10−60.9^k = 10^{-6}에서 k=6/(−log⁡100.9)=6/0.0458≈131k = 6/(-\log_{10}0.9) = 6/0.0458 \approx 131. 반복 한 번에 맞는 자릿수가 약 0.046개 늘어나는 셈이다.

Q2. A=[4−1−14]A = \begin{bmatrix}4 & -1\\ -1 & 4\end{bmatrix}에 야코비 방법을 쓸 때 ρ(GJ)\rho(G_J)와 ρ(GGS)\rho(G_{GS})는?

GJ=[01/41/40]G_J = \begin{bmatrix}0 & 1/4\\ 1/4 & 0\end{bmatrix}의 고유값은 ±1/4\pm1/4. 삼중대각(일관된 순서) 행렬이므로 ρGS=ρJ2=1/16\rho_{GS} = \rho_J^2 = 1/16. G–S가 같은 정확도에 절반의 반복으로 닿는다.

Q3. 영의 정리에서 ρJ=0.8\rho_J = 0.8이면 최적 이완 계수 ω∗\omega^*와 ρ(Gω∗)\rho(G_{\omega^*})는?

1−0.64=0.6\sqrt{1 - 0.64} = 0.6, ω∗=2/1.6=1.25\omega^* = 2/1.6 = 1.25, ρ=ω∗−1=0.25\rho = \omega^* - 1 = 0.25. 가우스–자이델의 ρJ2=0.64\rho_J^2 = 0.64보다 훨씬 작다. 2 × 2 시뮬레이터의 '결합 강함'이 바로 이 경우다.

Q4. 100 × 100 SPD 행렬의 고유값이 1, 2, 3, 4 네 값뿐이다. 정확한 산술에서 CG는 많아야 몇 번 만에 끝나는가?

P(λ)=(1−λ)(1−λ/2)(1−λ/3)(1−λ/4)P(\lambda) = (1 - \lambda)(1 - \lambda/2)(1 - \lambda/3)(1 - \lambda/4)는 P(0)=1P(0) = 1이고 모든 고유값에서 0이다. CG의 오차는 이런 다항식 중 가장 좋은 것으로 줄어드므로 4번째 반복에서 0이 된다.

Q5. 조건수가 κ=104\kappa = 10^4인 SPD 문제에서 최급 강하와 CG의 "오차 10배 축소당 반복 수"의 비는 대략?

최급 강하의 축소율 1−2/κ1 - 2/\kappa, CG의 1−2/κ1 - 2/\sqrt\kappa. 반복 수는 각각 κ\kappa와 κ\sqrt\kappa에 비례하므로 비는 κ=100\sqrt\kappa = 100이다.

Q6. 대각 원소가 모두 4인 2차원 푸아송 행렬에 야코비(대각) 전처리를 쓴 PCG의 반복 수는 전처리 없는 CG와 비교해?

M=4IM = 4I는 문제 전체를 1/4배 할 뿐 M−1AM^{-1}A의 고유값 분포(비율)를 바꾸지 않는다. 야코비 전처리는 계수가 영역마다 크게 다를 때 효과가 있다.

Q7. N=63N = 63 격자에서 가중 야코비(ω = 2/3)가 가장 매끄러운 오차 모드 k=1k = 1을 한 번에 줄이는 배율은 약 얼마인가?

g1=1−43sin⁡2(π/128)=0.9992g_1 = 1 - \tfrac43\sin^2(\pi/128) = 0.9992. 고주파는 1/3 이하로 줄지만 저주파는 거의 그대로라서, 다중 격자는 이를 거친 격자에서 처리한다.

Q8. 완전 GMRES 대신 재시작 GMRES(m)를 쓰는 주된 이유는?

완전 GMRES의 잔차는 단조 감소하고 가장 적은 반복으로 끝나지만, 아놀디 기저 전체를 저장하고 매번 모든 벡터와 직교화해야 한다. 재시작은 메모리를 묶는 대신 반복이 늘고 정체할 수도 있다.