12장의 LU 분해는 n3/3번의 곱셈과 n2칸의 메모리로 연립방정식을 정확히 풉니다. n=103이면 문제없지만 열전도·구조·유체 시뮬레이션의 n은 106을 넘고, 행렬은 한 행에 0이 아닌 원소가 다섯 개쯤뿐입니다. 이런 행렬은 분해하는 대신 곱하기만 하면서 해에 다가가는 것이 낫습니다. 이 장은 가장 오래된 반복(야코비, 가우스–자이델)이 왜 수렴하는지를 스펙트럼 반지름으로 정확히 말하고, 매개변수 하나로 수십 배 빨라지는 SOR, 방정식을 그릇의 바닥 찾기로 바꾼 켤레 기울기법, 그 속도를 다시 몇 배 올리는 전처리, 비대칭 행렬의 GMRES, 그리고 격자 크기와 무관한 횟수로 끝나는 다중 격자까지 다룹니다.
분할 A=M−N으로 야코비·가우스–자이델·SOR을 쓰고, 반복 행렬의 스펙트럼 반지름으로 수렴 여부와 속도를 판정한다.
Ax=b를 이차 형식의 최소화로 바꾸고, 최급 강하의 지그재그와 켤레 기울기법의 A-직교 방향을 비교한다.
CG의 수렴이 조건수 κ뿐 아니라 고유값 분포 전체에 달려 있음을 실험으로 확인한다.
야코비·불완전 촐레스키 전처리와 GMRES(아놀디 과정, 재시작)의 원리를 설명한다.
고주파 오차는 완화로, 저주파 오차는 거친 격자로 없애는 다중 격자의 아이디어를 이해한다.
이 수식이 없었다면백만 개의 미지수를 가진 시뮬레이션
자동차 충돌 해석, 일기예보의 압력 방정식, 반도체 소자의 전위 분포, 영상의 매끄러운 합성은 모두 결국 거대한 희소 연립방정식 Ax=b를 풉니다. 밀집 행렬로 다루면 n=106에서 저장에만 8 TB, 소거에 3×1017번의 곱셈이 듭니다. 반복 해법은 같은 문제를 A와 벡터의 곱 수백 번, 곧 원소 수십억 번의 연산으로 풉니다.
이웃 평균을 되풀이하는 생각은 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
정사각형 판의 가장자리 온도를 정해 두고 안쪽의 정상 상태 온도를 구합니다. 판을 한 변 N칸으로 나누면 각 격자점의 온도는 상하좌우 네 이웃의 평균이라는 식(라플라스 방정식의 5점 차분, 16장) 하나로 묶입니다. N=1000이면 미지수가 106개입니다. 12장의 띠 촐레스키로 풀면 얼마나 들까요?
격자점을 행 순서로 번호 매기면 n=N2차 행렬 A의 각 행에는 대각 원소 4와 이웃 네 개의 −1만 있습니다. 0이 아닌 원소 수(nnz)는 약 5n입니다. 이런 행렬을 희소 행렬(sparse matrix)이라 합니다. 문제는 분해입니다. 위아래 이웃이 N칸 떨어져 있어 띠 폭이 N이고, 촐레스키 인수는 띠 안을 거의 다 채웁니다(채움(fill-in), 12장).
n=106 (N = 1000)
저장
연산
밀집 LU
1012칸 = 8 TB
n3/3≈3×1017
띠 촐레스키 (띠 폭 N)
nN=109칸 = 8 GB
nN2/2=5×1011
반복법 한 번 (행렬–벡터 곱)
nnz ≈5×106칸 = 40 MB
≈107
반복법은 A를 바꾸지 않습니다. 필요한 것은 "벡터 v를 주면 Av를 돌려주는" 함수뿐이고, 한 번의 비용은 nnz에 비례합니다. 그래서 반복 횟수를 k라 하면 총비용은 k⋅nnz이고, 이 장의 모든 아이디어는 결국 k를 줄이는 기술입니다. 같은 문제에서 야코비는 수백만 번, 최적 SOR과 CG는 수천 번, 다중 격자는 열 번 안팎의 V-사이클이 필요하다는 것을 이 장 끝에서 보게 됩니다.
그림 13-1. 4 × 4 격자(왼쪽)를 행 순서로 번호 매긴 16차 라플라스 행렬의 희소 패턴(가운데). 검은 칸이 0이 아닌 원소, 연한 칸은 촐레스키 분해에서 새로 생기는 채움이다. 격자가 커질수록 0이 아닌 원소의 비율은 5/n으로 줄지만, 채움은 nN으로 늘어난다.
야코비와 가우스–자이델
한 식에서 한 미지수씩
i번째 방정식 ∑jaijxj=bi를 xi에 대해 풀면 xi=(bi−∑j=iaijxj)/aii입니다. 오른쪽의 다른 미지수에 지금의 추측값을 넣으면 xi의 새 추측이 나옵니다. 이것을 되풀이하면 해에 다가갈까요? 그리고 새 값을 언제부터 쓸까요?
두 가지 선택이 있습니다. 한 바퀴를 도는 동안 이전 값만 쓰는 것이 야코비 방법(Jacobi method), 방금 계산한 x1(k+1),…,xi−1(k+1)을 즉시 쓰는 것이 가우스–자이델 방법(Gauss–Seidel method)입니다.
야코비는 새 벡터를 따로 저장해야 하지만 모든 i를 동시에(병렬로) 계산할 수 있다. 가우스–자이델은 벡터 하나를 제자리에서 덮어쓰며, 계산 순서가 결과를 바꾼다.
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에서 기하가 분명해집니다. 두 방정식은 평면의 두 직선이고 해는 교점입니다. 가우스–자이델의 첫 갱신은 x2를 고정한 채 x1을 바꿔 첫째 직선 위로 수평 이동하고, 둘째 갱신은 둘째 직선 위로 수직 이동합니다. 계단을 타고 교점으로 내려가는 셈입니다. 야코비는 두 좌표를 동시에 바꾸므로 두 직선 어느 쪽에도 놓이지 않은 점으로 대각선 이동합니다.
예제 13.1 (3 × 3 손계산)4x1−x2+x3=5,−x1+4x2−2x3=1,x1−2x2+5x3=12의 해는 (1,2,3)이다. x(0)=0에서 출발한다.
야코비 1회: x1=5/4=1.25, x2=1/4=0.25, x3=12/5=2.4.
가우스–자이델 1회: x1=1.25, 이 값을 곧바로 써서 x2=(1+1.25)/4=0.5625, x3=(12−1.25+2⋅0.5625)/5=2.375.
여덟 번까지의 최대 오차 ∥x(k)−x∥∞는 아래 표와 같다. 가우스–자이델은 매번 약 0.16배, 야코비는 0.5–0.65배씩 준다. 다음 절에서 이 비율이 반복 행렬의 스펙트럼 반지름 ρJ=0.626, ρGS=0.158임을 본다.
k
1
2
3
4
5
6
7
8
야코비
1.75
0.750
0.447
0.204
0.128
0.0620
0.0406
0.0207
가우스–자이델
1.44
0.363
0.0685
0.0135
2.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 공식으로 계산합니다.
분할과 반복 행렬, 스펙트럼 반지름
세 방법을 한 틀에 넣습니다. A를 쉽게 풀리는 부분 M과 나머지로 분할해 A=M−N이라 쓰면 Ax=b는 Mx=Nx+b이고, 이를 반복식으로 읽습니다.
정의 13.2 (분할과 반복 행렬)A=M−N, M은 가역이고 Mz=r이 싸게 풀린다고 하자. 정상 반복법(stationary iterative method)
Mxk+1=Nxk+b⟺xk+1=xk+M−1(b−Axk)
의 반복 행렬(iteration matrix)은 G=M−1N=I−M−1A이다. A=D−L−U(대각, 순하삼각의 부호 반대, 순상삼각의 부호 반대)로 쓰면 야코비는 M=D, 가우스–자이델은 M=D−L, SOR은 M=ω1D−L이다.
오른쪽 꼴이 핵심입니다. 모든 정상 반복법은 "잔차 rk=b−Axk를 M−1로 근사 풀이해 더한다"는 한 줄이고, M이 A에 가까울수록 한 번에 많이 나아갑니다. 오차 ek=xk−x는 b와 무관하게 ek+1=Gek, 곧 ek=Gke0를 따릅니다.
정리 13.3 (수렴의 필요충분조건) 정상 반복이 모든 x0에서 수렴할 필요충분조건은 스펙트럼 반지름(spectral radius)ρ(G)=maxi∣λi(G)∣가 1보다 작은 것이다. 또 어떤 노름에서든 limk→∞∥Gk∥1/k=ρ(G)이므로, 오차를 10−m배로 줄이는 데 점근적으로 m/(−log10ρ)회가 든다.
증명의 핵심.G가 대각화 가능하면 e0=∑civi에서 Gke0=∑ciλikvi이므로 모든 ∣λi∣<1일 때만 모든 e0가 0으로 간다(∣λi∣≥1이면 e0=vi가 반례). 일반적인 경우에는 조르당 블록 J=λI+E의 거듭제곱 Jk=∑j(jk)λk−jEj가 ∣λ∣<1이면 다항식 × 지수 감소로 0이 된다. ∎
필요충분조건은 고유값을 알아야 쓸 수 있습니다. 실무에서는 행렬을 보고 바로 판정할 수 있는 충분조건이 더 유용합니다.
정리 13.4 (대각 우세와 대칭 양정치)
A가 엄격한 대각 우세(strictly diagonally dominant), 곧 모든 행에서 ∣aii∣>∑j=i∣aij∣이면 야코비와 가우스–자이델은 모든 시작점에서 수렴한다.
A가 대칭 양정치(SPD)이면 가우스–자이델, 그리고 0<ω<2인 SOR이 수렴한다.
(카한) 어떤 행렬이든 ρ(Gω)≥∣ω−1∣이다. 따라서 SOR이 수렴하려면 0<ω<2가 필요하다.
①의 증명. 야코비의 GJ=D−1(L+U)의 i행 절댓값 합은 ∑j=i∣aij∣/∣aii∣<1이므로 ρ(GJ)≤∥GJ∥∞<1. 가우스–자이델은 ek+1의 성분 중 절댓값이 가장 큰 i번째를 보면 ∣ei(k+1)∣≤∑j<i∣aii∣∣aij∣∣ej(k+1)∣+∑j>i∣aii∣∣aij∣∣ej(k)∣에서 같은 결론이 나온다. ③의 증명.detGω=det(D−ωL)−1det((1−ω)D+ωU)=(1−ω)n이고, 행렬식은 고유값의 곱이므로 ρn≥∣1−ω∣n. ∎
예제 13.2 (예제 13.1의 반복 행렬) 예제 13.1의 A는 엄격한 대각 우세다(행마다 4>2, 4>3, 5>3).
실제 스펙트럼 반지름은 ρ(GJ)=0.626, ρ(GGS)=0.158이다(반복 행렬에 거듭제곱을 많이 해서 얻은 값). 오차를 10−6배 줄이는 데 점근적으로 야코비 6/0.203≈30회, 가우스–자이델 6/0.801≈7.5회가 든다. 표의 8회 오차 2.7×10−6과 맞다.
ρGS가 ρJ2=0.392보다 작다. ρGS=ρJ2은 다음 절의 "일관된 순서" 행렬(삼중대각, 5점 격자 등)에서 성립하는 관계이고, 이 A는 그런 꼴이 아니다.
주의: 잔차와 오차 반복을 멈추는 기준은 보통 상대 잔차 ∥rk∥/∥b∥입니다. 그런데 ek=−A−1rk이므로 ∥ek∥/∥x∥≤κ(A)∥rk∥/∥b∥입니다(2장). 조건수가 106이면 잔차가 10−8이어도 오차는 10−2일 수 있습니다. 또 ρ가 1에 가까운 반복에서는 연속한 두 반복값의 차이가 작다고 해서 해에 가깝다는 뜻이 아닙니다. 차이에 1/(1−ρ)를 곱한 것이 오차의 크기입니다.
SOR과 최적 이완 계수
가우스–자이델이 늘 모자라게 간다면
위 시뮬레이터의 '결합 강함'에서 가우스–자이델은 매번 같은 방향으로 조금씩, 모자라게 갑니다. 그렇다면 G–S가 제안하는 이동을 ω배로 과하게 밀어 주면 어떨까요? 얼마나 밀어야 가장 빠를까요?
아이디어. 고유값 관계를 λ의 이차방정식 λ−ωμλ+(ω−1)=0(λ에 대해)으로 보면, 판별식이 음수가 되는 ω부터 두 근 λ가 켤레 복소수가 되어 ∣λ∣2=ω−1(근의 곱), 곧 ∣λ∣=ω−1이다. 판별식이 정확히 0이 되는 ω, 곧 ω2ρJ2=4(ω−1)의 작은 근이 ω∗이다. ∎
2차원 푸아송 문제(한 변 N점, h=1/(N+1))에서는 ρJ=cosπh이므로 1−ρJ2=sinπh이고
오차를 10−6배 줄이는 점근적 횟수 ln10−6/lnρ: 야코비 2863, 가우스–자이델 1432, 최적 SOR 71.
무작위 해 x∗로 실험하면 가우스–자이델 1091회, ω∗의 SOR 83회였다. 가우스–자이델이 예측보다 빠른 것은 e0에 가장 느린 모드의 성분이 작기 때문이고, SOR이 조금 느린 것은 ω∗에서 Gω가 대각화되지 않아(겹근) 초반에 kρk 꼴로 줄기 때문이다. 같은 실험에서 가장 적은 횟수(70회)는 ω=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은 ω∗를 알 때만 빠르고, ω∗는 모델 문제에서나 공식으로 나옵니다. 행렬이 대칭 양정치이기만 하면 아무 매개변수 없이 빠른 방법은 없을까요? 실마리는 연립방정식을 최솟값 문제로 바꾸는 데 있습니다.
정리 13.6 (연립방정식 = 이차 함수의 최소화)A가 SPD이면 Ax=b의 해 x∗는
ϕ(x)=21xTAx−bTx
의 유일한 최솟점이다. ∇ϕ=Ax−b=−r이고 ϕ(x)−ϕ(x∗)=21∥x−x∗∥A2, 여기서 ∥e∥A=eTAe는 A-노름(energy norm)이다.
ϕ의 등고선은 A의 고유벡터를 축으로 하는 타원이고, 긴 축과 짧은 축의 길이 비는 κ(κ=λmax/λmin)입니다. 잔차 r은 가장 가파른 내리막 방향입니다. 그 방향의 직선 x+αr 위에서 ϕ를 최소로 하는 α는 dαdϕ=−rTr+αrTAr=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
를 만족한다(칸토로비치 부등식에서 나온다). 연속한 두 잔차는 서로 수직이다(rk+1Trk=0). 그래서 길쭉한 골짜기에서는 벽 사이를 오가는 지그재그가 된다.
A-노름 오차는 3.3166, 0.37258, 0.041855, 0.0047020, …로 매번 정확히 0.1123배다. 2차원에서는 지그재그가 두 방향을 번갈아 오가므로 비가 일정하다. 상한 (κ−1)/(κ+1)=5/7=0.714는 최악의 시작점에서 나온다.
켤레 기울기법
지그재그의 원인은 새 방향으로 최소화하면서 이전 방향에서 얻은 최소성을 망치는 데 있습니다. 해결책은 방향들을 A에 대해 서로 "수직"으로 고르는 것입니다. piTApj=0(i=j)이면 pi,pj를 A-켤레(A-conjugate)라 합니다. A=RTR로 좌표를 y=Rx로 바꾸면 타원 등고선이 원이 되고, A-켤레 방향은 그 좌표에서 평범한 직교 방향입니다. 원 위에서 서로 수직인 방향으로 한 번씩 최소화하면 n번 만에 중심에 닿습니다.
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의 구조)A가 SPD이고 rk=0이면
잔차들은 서로 직교하고(riTrj=0), 방향들은 서로 A-켤레다(piTApj=0), i=j.
xk는 x0+Kk 안에서 ∥x−x∗∥A를 최소로 하는 점이다. 따라서 정확한 산술에서 많아야 n번에 끝난다.
증명의 핵심. 귀납법. rk+1=rk−αkApk와 αk의 정의로 rk+1⊥rk, βk의 정의로 pk+1⊥Apk가 바로 나온다. j<k에 대해서는 Apj∈Kj+2=span{r0,…,rj+1}이고 rk+1은 이미 그 모든 잔차와 직교하므로 rk+1TApj=0, 따라서 pk+1TApj=0. 잔차가 Kk에 직교한다는 것이 곧 A-노름 최소의 조건(갈료르킨 조건)이다. ∎
최소성에서 수렴 속도가 나옵니다. xk−x∗=Pk(A)(x0−x∗)이고 Pk는 Pk(0)=1인 k차 다항식 중 무엇이든 될 수 있으므로, 고유벡터로 전개하면
∥e0∥A∥ek∥A≤Pk(0)=1minλ∈σ(A)max∣Pk(λ)∣.
σ(A)는 A의 고유값 집합. CG는 고유값 위에서 작은 값을 갖는 다항식을 스스로 찾는다.
정리 13.9 (CG의 수렴 한계)
(조건수) 고유값이 [λmin,λmax]에 있으면, 이 구간에서 체비쇼프 다항식(7장)을 쓰면
∥ek∥A≤2(κ+1κ−1)k∥e0∥A. 오차를 10−m배 줄이는 데 약 1.15mκ회.
(서로 다른 고유값) A의 서로 다른 고유값이 m개뿐이면 P(λ)=∏i(1−λ/λi)가 모든 고유값에서 0이므로 CG는 m번 만에 끝난다.
최급 강하의 (κ−1)/(κ+1)≈1−2/κ가 CG에서는 1−2/κ로 바뀝니다. κ=104이면 오차를 10배 줄이는 데 최급 강하는 약 11500회, CG는 약 115회입니다. 푸아송 문제의 κ≈4/(πh)2를 넣으면 CG의 반복 수는 O(N), 최적 SOR과 같은 차수이면서 ω를 고를 필요가 없습니다.
A-노름 오차 7.071 → 1.747 → 0.640 → 0. 세 번 만에 정확한 해(반올림 오차 범위)에 닿았다. 계산된 p0TAp1, r0Tr1은 모두 10−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가 언제나 두 걸음이니 차이가 극적이지만, 실제로 관심 있는 것은 n이 클 때 n보다 훨씬 적은 반복으로 충분히 정확해지는가입니다. 정리 13.9의 두 한계는 같은 κ라도 고유값이 어떻게 흩어져 있느냐에 따라 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에 비례합니다. 3차원 격자 2003이면 천 번을 넘고, 재료 상수가 1000배 차이 나는 문제에서는 κ가 함께 커져 반복이 열 배 넘게 늘어납니다(아래 표). A 대신 조건수가 작은 다른 행렬을 풀 수 있다면?
A와 비슷하면서 Mz=r이 싸게 풀리는 SPD 행렬 M을 전처리기(preconditioner)라 합니다. M−1Ax=M−1b는 같은 해를 갖고, M≈A이면 M−1A≈I라 고유값이 1 근처에 모입니다. 대칭을 유지하려면 M=LLT로 쓰고 L−1AL−T에 CG를 적용하는데, 식을 정리하면 L이 사라지고 매 반복 Mz=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=A면 한 번에 끝나지만 M을 푸는 것이 원래 문제이고, M=I면 공짜지만 효과가 없습니다. 쓸모 있는 전처리기는 그 사이의 절충입니다.
정의 13.10 (야코비 전처리와 불완전 촐레스키)
야코비(대각) 전처리M=D=diag(A). 행과 열의 크기를 맞추는 역할을 하며, 계수가 크게 다른 영역이 섞인 문제에서 효과가 크다. 대각이 상수인 행렬에서는 효과가 없다.
불완전 촐레스키 IC(0): 촐레스키 분해를 하되 A에서 0이었던 자리에 생기는 채움은 버린다. 인수 L~은 A의 하삼각과 같은 희소 패턴을 가져 저장·풀이 비용이 nnz에 비례하고, M=L~L~T≈A이다. 5점 격자 행렬에서는 대각만 다시 계산하면 된다: dp=app−ap,p−12/dp−1−ap,p−N2/dp−N.
PCG 반복 수 (상대 잔차 10⁻⁸)
N = 16
N = 32
N = 64
푸아송: 없음 / 야코비 / IC(0)
28 / 28 / 17
59 / 59 / 29
119 / 119 / 52
가운데 정사각형 계수 1000배: 없음 / 야코비 / IC(0)
125 / 32 / 22
503 / 69 / 38
1592 / 139 / 72
표가 전처리의 두 얼굴을 보여 줍니다. 균일한 푸아송 문제에서 야코비 전처리는 대각이 모두 4라 아무 일도 하지 않고, IC(0)는 반복을 절반 아래로 줄이지만 N에 비례해 느는 성질은 그대로입니다. 계수가 1000배 뛰는 문제에서는 야코비만으로도 반복이 7–11분의 1이 됩니다. 반복 수가 N과 무관해지는 전처리기는 다음 절의 다중 격자에서 나옵니다.
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를 격자로 나누면, 대류 항 때문에 행렬이 비대칭이 됩니다. CG는 대칭 양정치를 가정하므로 쓸 수 없습니다. 실제로 억지로 돌리면 잔차가 줄지 않고 커집니다. 비대칭 행렬에서도 크릴로프 공간의 아이디어를 살릴 수 있을까요?
CG가 한 일을 다시 보면, xk를 크릴로프 공간 x0+Kk(A,r0)에서 골랐습니다. 이 공간은 행렬–벡터 곱만으로 만들어지므로 비대칭이어도 쓸 수 있습니다. 바뀌는 것은 "가장 좋은 점"의 기준입니다. A-노름은 SPD에서만 노름이므로, 대신 잔차의 2-노름을 최소화합니다. 이것이 GMRES(generalized minimal residual)입니다.
이를 위해 먼저 크릴로프 공간의 정규직교 기저를 만듭니다. r0,Ar0,A2r0,…를 그대로 쓰면 거듭제곱법처럼 모두 지배 고유벡터 쪽으로 쏠려 거의 평행해지므로, 새 벡터를 만들 때마다 그람–슈미트로 직교화합니다. 이것이 아놀디 과정(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ˉk를 만족하는 정규직교 기저 Vk와 (k+1)×k 헤센베르크 행렬 Hˉk를 만든다. xk=x0+Vky로 두면 ∥b−Axk∥2=∥βe1−Hˉky∥2이므로 n차원 문제가 (k+1)×k 최소제곱 문제로 줄어든다. 잔차 노름은 단조 감소하며, 정확한 산술에서 많아야 n번에 끝난다. 한편 k번째 반복은 벡터 k개를 저장하고 k번의 내적을 하므로 비용이 k에 비례해 커진다.
비용이 계속 커지므로 실무에서는 m번마다 지금까지의 해를 새 출발점으로 삼아 다시 시작합니다. 이 재시작 GMRES(m)은 메모리를 m개 벡터로 묶는 대가로 크릴로프 공간에 쌓인 정보를 버리므로 더 많은 반복이 필요하고, 때로는 정체합니다. 대칭 행렬에서는 아놀디의 H가 삼중대각이 되어 직교화가 직전 두 벡터로 충분하며(란초시 과정), 이것이 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(N점, h=1/(N+1))에서 오차를 사인 모드 sin(kπx)로 전개해 봅시다. 가중 야코비 x←x+ωD−1r는 각 모드를 독립적으로 줄이며, 그 배율은
gk=1−2ωsin22kπh,k=1,…,N.
ω=2/3이면 고주파 절반(k≥N/2)에서 ∣gk∣≤1/3이다. 그러나 k=1에서는 g1≈1−2ωπ2h2, N=63이면 0.9992로 거의 줄지 않는다.
그래서 완화 반복은 해법으로는 느리지만 평활화(smoothing)로는 훌륭합니다. 몇 번만 돌리면 고주파 오차가 사라지고 매끄러운 오차가 남습니다. 매끄러운 오차는 격자 간격을 두 배로 한 거친 격자에서도 잘 표현되며, 거기서는 같은 모드가 상대적으로 두 배 높은 주파수라 평활화가 다시 효과적입니다. 이 관찰을 재귀로 엮은 것이 다중 격자법(multigrid)입니다.
그림 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-사이클 한 번의 오차 축소율은 h와 무관한 상수 ρMG<1로 묶인다. 한 사이클의 비용은 O(n)이므로 정해진 정확도까지 총비용이 O(n), 곧 미지수 하나당 상수 번의 연산이다. 핵심은 두 성질의 결합이다. 평활기가 고주파를 줄이고(평활 성질), 거친 격자가 저주파를 정확히 표현한다(근사 성질).
예제 13.6 (V-사이클의 축소율 측정) 2차원 푸아송 −Δu=1, u=0 경계, 가우스–자이델 평활 앞뒤 2번, 완전 가중 제한, 쌍선형 보간, 가장 거친 격자 3 × 3.
상대 잔차 10−8까지 네 경우 모두 8사이클. 같은 문제에서 가우스–자이델 반복 수는 N2에, CG는 N에 비례해 늘어난다.
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을 풀고, 빈 영역 둘레의 알려진 픽셀을 경계값으로 쓰는 것이다. 이산화하면 "빈 픽셀 = 네 이웃의 평균"이고, 이는 정확히 이 장의 5점 행렬이다. 픽셀 하나하나가 미지수이므로 사진 한 장에서도 미지수가 수십만 개가 되고, 행렬을 만들 필요도 없이 가우스–자이델 스윕을 영상 위에서 직접 돌리면 된다. 붙여 넣은 영상의 경계를 매끄럽게 섞는 푸아송 영상 편집도 같은 방정식에 우변(붙일 영상의 라플라시안)만 더한 것이다.