Chapter 14

고유값의 수치 계산

선형대수 교과서는 고유값을 det⁡(A−λI)=0\det(A - \lambda I) = 0의 근으로 구합니다. 2 × 2나 3 × 3에서는 좋은 방법이지만, 컴퓨터는 이 길을 거의 가지 않습니다. 5차 이상 다항식에는 근의 공식이 없고, 계수에서 근을 구하는 문제는 조건이 끔찍하게 나쁘기 때문입니다. 그래서 고유값은 언제나 반복으로 구합니다. 이 장은 벡터에 행렬을 계속 곱하는 거듭제곱법에서 출발해, 이동과 역행렬로 원하는 고유값을 골라 잡는 역반복, 맞는 자릿수가 매번 세 배가 되는 레일리 몫 반복, 계산 없이 고유값의 위치를 가두는 게르시고린 원판, 그리고 MATLAB의 eig가 실제로 부르는 이동 QR 알고리즘과 대칭 행렬의 야코비 회전까지 다룹니다.

이 수식이 없었다면검색 순위와 다리의 고유 진동수

웹 페이지의 중요도를 링크 구조만으로 매기는 페이지랭크는 수십억 차원 행렬의 가장 큰 고유값에 대한 고유벡터입니다. 다리·건물·비행기 날개의 위험한 공진 진동수는 질량·강성 행렬의 일반화 고유값 문제에서 나오고, 분자의 에너지 준위는 슈뢰딩거 방정식을 이산화한 행렬의 고유값입니다. 이 행렬들은 크기가 수천에서 수십억이라 특성 다항식은 아예 적을 수도 없습니다.

모든 고유값을 한꺼번에 구하는 표준 방법인 QR 알고리즘은 1961년 무렵 영국의 프랜시스(John G. F. Francis)와 소련의 쿠블라놉스카야(Vera Kublanovskaya)가 각각 독립적으로 발표했고, 20세기의 가장 영향력 있는 알고리즘 가운데 하나로 꼽힙니다. 대칭 행렬의 회전법은 이보다 훨씬 앞선 1846년 야코비의 논문까지 거슬러 올라갑니다.

Av = λv→특성 다항식은 불안정→닮음 변환을 반복해 삼각 행렬로→순위 · 진동수 · 에너지 준위

특성 다항식으로 구하면 안 되는 이유

고유값이 1, 2, …, 20인 행렬

대각 원소가 1부터 20까지인 대각 행렬의 고유값은 보는 그대로입니다. 이 행렬의 특성 다항식 p(λ)=(λ−1)(λ−2)⋯(λ−20)p(\lambda) = (\lambda - 1)(\lambda - 2)\cdots(\lambda - 20)을 전개해 계수를 배정밀도로 저장한 뒤 근을 구하면 어떻게 될까요? 계수는 −210-210부터 20!≈2.4×101820! \approx 2.4\times10^{18}까지입니다.

이것이 2장(조건수와 안정성)에서 본 윌킨슨 다항식입니다. 계수를 배정밀도로 저장만 해도(전개 계산 자체는 정확히 해도) 반올림 오차가 생기고, 그 근을 정확히 구해도 λ=12,13,14\lambda = 12, 13, 14 근처에서 오차가 6×10−46\times10^{-4} 정도가 되고, 근을 배정밀도로 계산하면 오차가 더 커집니다. 윌킨슨이 1959년에 보인 대로 λ19\lambda^{19}의 계수 −210-210을 2−23≈1.2×10−72^{-23} \approx 1.2\times10^{-7}만큼만 바꾸면 근 열 개가 복소수 쌍이 되고, 16.73±2.81i16.73 \pm 2.81i 같은 근이 나타납니다. 다항식의 근은 계수에 대해 조건이 나쁜 문제입니다.

그런데 행렬의 고유값 자체는 그렇지 않을 수 있습니다. 문제를 "다항식의 근"으로 바꾸는 순간 원래 문제보다 훨씬 예민한 문제로 바꾼 것입니다. 행렬 쪽의 민감도는 다음 정리가 말해 줍니다.

정리 14.1 (바우어–파이크) A=VΛV−1A = V\Lambda V^{-1}가 대각화 가능하면, A+EA + E의 모든 고유값 μ\mu에 대해 AA의 어떤 고유값 λ\lambda가 있어
∣μ−λ∣≤κ2(V) ∥E∥2,κ2(V)=∥V∥2∥V−1∥2.|\mu - \lambda| \le \kappa_2(V)\,\|E\|_2,\qquad \kappa_2(V) = \|V\|_2\|V^{-1}\|_2.
특히 AA가 대칭(정규)이면 VV를 직교 행렬로 고를 수 있어 κ2(V)=1\kappa_2(V) = 1이고, 고유값은 ∥E∥2\|E\|_2보다 많이 움직이지 않는다.

증명의 핵심. μ\mu가 AA의 고유값이 아니면 A+E−μI=V(Λ−μI)(I+(Λ−μI)−1V−1EV)V−1A + E - \mu I = V(\Lambda - \mu I)\bigl(I + (\Lambda - \mu I)^{-1}V^{-1}EV\bigr)V^{-1}이 특이하므로 ∥(Λ−μI)−1V−1EV∥2≥1\|(\Lambda - \mu I)^{-1}V^{-1}EV\|_2 \ge 1. 왼쪽은 κ2(V)∥E∥2/min⁡i∣λi−μ∣\kappa_2(V)\|E\|_2/\min_i|\lambda_i - \mu| 이하다. ∎

예제 14.1 (비대칭 행렬의 예민함) A=[1104ε2]A = \begin{bmatrix}1 & 10^4\\ \varepsilon & 2\end{bmatrix}의 고유값은 λ=1.5±0.25+104ε\lambda = 1.5 \pm \sqrt{0.25 + 10^4\varepsilon}이다.
  1. ε=0\varepsilon = 0: 고유값 1, 2. 고유벡터 (1,0)(1, 0)과 (104,1)(10^4, 1)은 거의 평행하다(κ2(V)≈2×104\kappa_2(V) \approx 2\times10^4).
  2. ε=10−6\varepsilon = 10^{-6}: 고유값 0.990098, 2.009902. 원소 하나를 10−610^{-6} 바꿨는데 고유값이 9.9×10−39.9\times10^{-3}, 곧 만 배 가까이 움직였다.
  3. 같은 크기의 교란을 대칭 행렬에 주면 고유값은 10−610^{-6} 이하로만 움직인다. 대칭 고유값 문제는 언제나 조건이 좋다.

이제 결론이 분명합니다. 고유값을 구하는 좋은 알고리즘은 다항식을 거치지 않고, 행렬에 직교 닮음 변환 A↦QTAQA \mapsto Q^{\mathsf T}AQ만 쌓아서 고유값을 읽을 수 있는 꼴(삼각·대각)로 만듭니다. 직교 변환은 노름을 보존하므로 반올림 오차가 커지지 않고, 결과는 "∥E∥≈εmach∥A∥\|E\| \approx \varepsilon_{\text{mach}}\|A\|만큼 교란된 행렬의 정확한 고유값"이 됩니다(후방 안정). 그다음 정확도는 바우어–파이크가 말하는 문제 자체의 조건에만 달려 있습니다.

거꾸로 쓰기: 다항식의 근을 고유값으로 실제로는 반대 방향이 쓰입니다. 다항식 p(x)=xn+cn−1xn−1+⋯+c0p(x) = x^n + c_{n-1}x^{n-1} + \cdots + c_0의 근은 동반 행렬(companion matrix)의 고유값과 같으므로, MATLAB의 roots와 NumPy의 roots는 동반 행렬을 만들어 QR 알고리즘으로 고유값을 구합니다(4장).
SIMULATOR

특성 다항식의 근 vs 직교 닮음 변환: 고유값 1, 2, …, n

복소평면: ○ 참 고유값, ● 다항식의 근
최대 오차 vs n (로그 눈금)
다항식 계수 → 근 (뒤랑–케르너)직교 닮음 행렬 → 야코비 회전
가장 큰 계수—
다항식 근의 최대 오차—
야코비 회전의 최대 오차—
최대 |허수부|—
해볼 것: ① n = 8에서 다항식 쪽 오차는 10⁻¹¹ 정도이지만 n이 하나 늘 때마다 대략 열 배씩 커져 n = 20이면 10⁻²에 이릅니다. 야코비 회전 쪽(보라)은 n에 관계없이 10⁻¹⁴–10⁻¹³ 근처입니다. ② n = 20에서 윌킨슨 교란을 켜면 근 10개가 복소수 쌍으로 떨어져 나갑니다. 행렬 원소를 같은 크기로 바꿔도 대칭 행렬의 고유값은 10⁻⁷ 정도만 움직입니다. 모델: 계수는 (λ − 1)⋯(λ − n)을 배정밀도로 전개, 근은 뒤랑–케르너 동시 반복. 행렬은 Q diag(1, …, n) Qᵀ (Q는 하우스홀더 반사).

거듭제곱법과 수렴 속도

곱하기만 해서 가장 큰 고유값을

행렬을 저장하지 않고 "벡터를 주면 AxA\mathbf x를 돌려주는" 함수만 있다고 합시다. 페이지랭크의 링크 행렬이나 유한 요소 강성 행렬이 그렇습니다. 이것만으로 가장 큰 고유값과 고유벡터를 얻을 수 있을까요?

AA가 고유벡터 v1,…,vn\mathbf v_1, \dots, \mathbf v_n으로 대각화되고 ∣λ1∣>∣λ2∣≥⋯≥∣λn∣|\lambda_1| \gt |\lambda_2| \ge \cdots \ge |\lambda_n|이라 합시다. 시작 벡터 x0=∑civi\mathbf x_0 = \sum c_i\mathbf v_i에 AA를 kk번 곱하면

Akx0=λ1k(c1v1+∑i≥2ci(λiλ1)kvi).A^k\mathbf x_0 = \lambda_1^k\Bigl(c_1\mathbf v_1 + \sum_{i\ge2} c_i\Bigl(\frac{\lambda_i}{\lambda_1}\Bigr)^k\mathbf v_i\Bigr).
괄호 안의 둘째 항부터는 ∣λi/λ1∣k→0|\lambda_i/\lambda_1|^k \to 0. 넘침·사라짐을 막기 위해 매번 정규화하면 방향만 v1\mathbf v_1로 모인다. 이것이 거듭제곱법(power iteration)이다.
function power_iteration(A, x, tol, maxit)
  x = x / norm(x)
  for k = 1 .. maxit
    y = A x                                // 반복당 행렬–벡터 곱 한 번
    lam = dot(x, y)                        // 레일리 몫 xᵀAx (‖x‖ = 1)
    if norm(y - lam * x) <= tol * abs(lam) then return (lam, x)
    x = y / norm(y)
  return (lam, x)
정리 14.2 (거듭제곱법의 수렴) ∣λ1∣>∣λ2∣|\lambda_1| \gt |\lambda_2|이고 c1≠0c_1 \ne 0이면 정규화한 반복 벡터와 ±v1\pm\mathbf v_1 사이의 각은 O(∣λ2/λ1∣k)O(|\lambda_2/\lambda_1|^k)로 줄고, 고유값 추정의 오차도 O(∣λ2/λ1∣k)O(|\lambda_2/\lambda_1|^k)이다. AA가 대칭이면 레일리 몫(Rayleigh quotient) r(x)=xTAx/xTxr(\mathbf x) = \mathbf x^{\mathsf T}A\mathbf x/\mathbf x^{\mathsf T}\mathbf x의 오차는 O(∣λ2/λ1∣2k)O(|\lambda_2/\lambda_1|^{2k})로 두 배 빨리 준다.

대칭일 때 제곱이 되는 이유. x=v1+δ\mathbf x = \mathbf v_1 + \boldsymbol\delta, δ⊥v1\boldsymbol\delta \perp \mathbf v_1이면 r(x)−λ1=δT(A−λ1I)δ1+∥δ∥2=O(∥δ∥2)r(\mathbf x) - \lambda_1 = \dfrac{\boldsymbol\delta^{\mathsf T}(A - \lambda_1I)\boldsymbol\delta}{1 + \|\boldsymbol\delta\|^2} = O(\|\boldsymbol\delta\|^2). 레일리 몫은 고유벡터에서 정류점이라 벡터 오차의 제곱만큼만 틀린다. ∎

예제 14.2 (비대칭 2 × 2) A=[4123]A = \begin{bmatrix}4 & 1\\ 2 & 3\end{bmatrix}의 고유값은 5, 2, 고유벡터는 (1,1)(1, 1), (1,−2)(1, -2)이다. x0=(1,0)\mathbf x_0 = (1, 0)에서 출발해 첫 성분이 1이 되도록 정규화한다.
  1. Ax0=(4,2)A\mathbf x_0 = (4, 2) → x1=(1,0.5)\mathbf x_1 = (1, 0.5). 고유값 추정(첫 성분의 비) 4.
  2. Ax1=(4.5,3.5)A\mathbf x_1 = (4.5, 3.5) → x2=(1,0.7778)\mathbf x_2 = (1, 0.7778). 추정 4.5. 다음은 (1,0.9070)(1, 0.9070)과 4.7778, (1,0.9621)(1, 0.9621)과 4.9070.
  3. 둘째 성분의 오차 1−x21 - x_2는 0.5, 0.2222, 0.0930, 0.0379, 0.0153으로 비가 0.444, 0.419, 0.408, 0.403 → ∣λ2/λ1∣=0.4|\lambda_2/\lambda_1| = 0.4에 다가간다. 비대칭이라 고유값 추정의 오차도 같은 0.4배씩 준다(0.5, 0.222, 0.093, …).
SIMULATOR

거듭제곱법: 벡터가 지배 고유벡터 쪽으로 돈다

시작 벡터(점)를 끌기
log₁₀ 오차 vs k
반복 벡터 xₖ고유벡터 방향각 오차 sin θₖ레일리 몫 오차|λ₂/λ₁|ᵏ, |λ₂/λ₁|²ᵏ
레일리 몫 rₖ—
sin θₖ—
|rₖ − λ₁|—
10⁻¹⁰까지 반복 (벡터)—
해볼 것: ① 각이 90°(대칭 행렬)이면 레일리 몫 오차(보라)의 기울기가 각 오차(빨강)의 두 배입니다. 각을 45°로 줄이면(비대칭) 두 기울기가 같아집니다. ② λ₂/λ₁ = 0.95로 두면 40번으로도 소수 둘째 자리를 겨우 맞춥니다. 수렴 속도는 고유값의 간격이 정합니다. ③ λ₂/λ₁을 음수로 하면 벡터가 지배 방향의 양옆을 번갈아 오가며 수렴합니다. ④ 시작 벡터를 v₂ 방향에 정확히 두면(c₁ = 0) 반올림 오차가 없는 한 v₁을 찾지 못합니다. 모델: A = V diag(2, 2r) V⁻¹, v₁은 20° 방향.

역반복, 이동, 레일리 몫 반복

가장 큰 것 말고 3.2 근처의 고유값

구조물의 진동 해석에서 필요한 것은 가장 큰 고유값이 아니라 가진 주파수 근처의 고유값, 혹은 가장 작은 몇 개입니다. 거듭제곱법은 언제나 크기가 가장 큰 고유값으로 갑니다. 원하는 고유값을 "가장 큰" 것으로 만드는 변환이 있을까요?

Av=λvA\mathbf v = \lambda\mathbf v이면 (A−σI)−1v=1λ−σv(A - \sigma I)^{-1}\mathbf v = \frac{1}{\lambda - \sigma}\mathbf v입니다. 고유벡터는 그대로이고 고유값만 1/(λi−σ)1/(\lambda_i - \sigma)로 바뀝니다. 이동량 σ\sigma에 가장 가까운 고유값이 절댓값이 가장 큰 고유값이 되므로, 이 행렬에 거듭제곱법을 쓰면 그 고유벡터로 갑니다. 역행렬을 만들지 않고 매번 (A−σI)y=x(A - \sigma I)\mathbf y = \mathbf x를 풀며, LU 분해는 처음 한 번만 하면 됩니다.

정리 14.3 (이동 역반복) λJ\lambda_J가 σ\sigma에 가장 가깝고 λK\lambda_K가 그다음으로 가까우면, 이동 역반복(shifted inverse iteration)의 수렴비는
∣λJ−σ∣∣λK−σ∣\frac{|\lambda_J - \sigma|}{|\lambda_K - \sigma|}
이다. σ\sigma가 λJ\lambda_J에 가까울수록 비가 0에 가까워져 한두 번 만에 고유벡터를 얻는다. A−σIA - \sigma I가 거의 특이해 연립방정식의 해가 크게 틀릴 것 같지만, 그 오차는 거의 전부 원하는 고유벡터 방향이라 정규화하면 해가 없다.

한 걸음 더 나가면 매 단계 σ\sigma를 지금의 가장 좋은 추정, 곧 레일리 몫으로 바꿀 수 있습니다. 이것이 레일리 몫 반복(Rayleigh quotient iteration, RQI)입니다.

function rayleigh_quotient_iteration(A, x, tol)
  x = x / norm(x);  rho = dot(x, A x)
  repeat
    y = solve(A - rho I, y = x)            // 매번 새 행렬 분해: 비싸다
    x = y / norm(y)
    rho = dot(x, A x)                      // 이동량을 갱신
  until norm(A x - rho x) <= tol * norm(A)
  return (rho, x)
정리 14.4 (레일리 몫 반복의 수렴 차수) AA가 대칭이고 RQI가 단순 고유값 λ\lambda로 수렴하면, 벡터 오차 ϵk=sin⁡θk\epsilon_k = \sin\theta_k는 ϵk+1=O(ϵk3)\epsilon_{k+1} = O(\epsilon_k^3), 곧 3차 수렴한다. 비대칭이면 2차다.

아이디어. 역반복 한 번은 벡터 오차에 ∣λ−σ∣/∣λK−σ∣|\lambda - \sigma|/|\lambda_K - \sigma|를 곱한다. 대칭이면 정리 14.2의 증명대로 레일리 몫의 오차 ∣λ−σ∣=O(ϵk2)|\lambda - \sigma| = O(\epsilon_k^2)이므로 ϵk+1=O(ϵk2)⋅ϵk=O(ϵk3)\epsilon_{k+1} = O(\epsilon_k^2)\cdot\epsilon_k = O(\epsilon_k^3). 비대칭이면 레일리 몫이 O(ϵk)O(\epsilon_k)만큼만 맞아서 2차가 된다. ∎

예제 14.3 (RQI 대 고정 이동 역반복) A=[210131014]A = \begin{bmatrix}2 & 1 & 0\\ 1 & 3 & 1\\ 0 & 1 & 4\end{bmatrix}(고유값 3−3, 3, 3+3=4.73205083 - \sqrt3,\ 3,\ 3 + \sqrt3 = 4.7320508), x0=(1,1,1)/3\mathbf x_0 = (1, 1, 1)/\sqrt3, ρ0=13/3=4.3333\rho_0 = 13/3 = 4.3333. 고정 이동 역반복은 σ=ρ0\sigma = \rho_0을 끝까지 쓴다.
kRQI ρₖ|ρₖ − λ|고정 σ 역반복 ρₖ|ρₖ − λ|
04.33333333333.99×10⁻¹4.33333333333.99×10⁻¹
14.70741717972.46×10⁻²4.70741717972.46×10⁻²
24.73204627244.54×10⁻⁶4.73012609871.92×10⁻³
34.7320508076< 10⁻¹⁵4.73188368261.67×10⁻⁴
5——4.73204948031.33×10⁻⁶
  1. 고정 이동의 고유값 오차는 매번 약 0.089배로 준다. 벡터의 수렴비 ∣λ−σ∣/∣3−σ∣=0.399/1.333=0.299|\lambda - \sigma|/|3 - \sigma| = 0.399/1.333 = 0.299의 제곱(대칭이라 레일리 몫은 제곱 속도)이다.
  2. RQI의 고유값 오차는 2.46×10−22.46\times10^{-2} → 4.54×10−64.54\times10^{-6} → 기계 정밀도. 4.54×10−6/(2.46×10−2)3=0.304.54\times10^{-6}/(2.46\times10^{-2})^3 = 0.30으로 세제곱 관계가 보인다. 고유값 오차가 벡터 오차의 제곱이므로 고유값으로 보면 자릿수가 매번 약 세 배가 된다.
SIMULATOR

이동량 σ와 수렴 속도: 원하는 고유값 골라 잡기

고유값과 이동량 σ (σ를 끌기)
log₁₀ sin θₖ vs k
이동 역반복거듭제곱법 (λ = 10으로)σ
수렴하는 고유값—
수렴비 |λJ − σ| / |λK − σ|—
10⁻¹⁰까지 반복—
거듭제곱법 (비 0.7)—
해볼 것: ① σ를 고유값 4 바로 옆(3.9)에 두면 수렴비가 0.1/0.9 ≈ 0.11이라 열 번 남짓이면 끝납니다. ② σ를 두 고유값 4와 7의 한가운데 근처(5.4)에 두면 비가 1.4/1.6 = 0.875로 1에 가까워 오래 걸립니다. 5.5를 넘기면 가는 쪽이 4에서 7로 바뀝니다. ③ σ = 0은 순수 역반복으로, 가장 작은 고유값 1로 갑니다. 수렴비 1/3. 모델: 5 × 5 대칭 행렬 Q diag(1, 3, 4, 7, 10) Qᵀ, 매 단계 (A − σI)y = x를 부분 피벗 LU로 풉니다.
SIMULATOR

레일리 몫 반복의 수렴 표: 자릿수가 세 배씩

행렬
시작 벡터 x₀
RQI고정 이동 역반복 (σ = ρ₀)거듭제곱법
kRQI ρₖ|Axₖ − ρₖxₖ|추정 차수고정 σ 잔차
해볼 것: ① 대칭 행렬에서 '추정 차수' 열(log rₖ₊₁ / log rₖ)이 3 근처로 나옵니다. 비대칭으로 바꾸면 2 근처입니다. ② 시작 벡터를 바꾸면 RQI가 다른 고유값으로 갈 수 있습니다. 어느 고유값으로 갈지는 시작점이 정하고, 그래서 실무에서는 역반복 몇 번으로 원하는 고유값 근처에 먼저 간 뒤 RQI로 마무리합니다. 모델: 비대칭 행렬은 [[2, 1, 0], [0.5, 3, 1], [0, 0.4, 4]]. 잔차가 10⁻¹⁴ 아래로 가면 멈춥니다.

게르시고린 원판: 계산 없이 고유값 가두기

반복을 시작하기 전에

이동량 σ\sigma를 고르려면 고유값이 대략 어디 있는지 알아야 합니다. 행렬이 양정치인지, 반복법이 수렴하는지(13장의 ρ(G)<1\rho(G) \lt 1) 판단할 때도 마찬가지입니다. 원소만 보고 고유값의 위치를 가둘 수 있을까요?

정리 14.5 (게르시고린 원판 정리) n×nn \times n 복소 행렬 AA의 각 행에 대해 게르시고린 원판(Gershgorin disc)
Di={z∈C:∣z−aii∣≤Ri},Ri=∑j≠i∣aij∣D_i = \Bigl\{ z \in \mathbb C : |z - a_{ii}| \le R_i \Bigr\},\qquad R_i = \sum_{j\ne i}|a_{ij}|
을 잡으면 모든 고유값은 D1∪⋯∪DnD_1 \cup \cdots \cup D_n 안에 있다. 또 원판 kk개의 합집합이 나머지 원판과 떨어져 있으면, 그 합집합 안에는 고유값이 정확히 kk개(중복도 포함) 있다. ATA^{\mathsf T}도 같은 고유값을 가지므로 열 합으로 만든 원판에도 같은 결론이 성립한다.

증명. Av=λvA\mathbf v = \lambda\mathbf v에서 ∣vi∣|v_i|가 가장 큰 성분 ii를 고르면 (λ−aii)vi=∑j≠iaijvj(\lambda - a_{ii})v_i = \sum_{j\ne i}a_{ij}v_j이므로 ∣λ−aii∣≤∑j≠i∣aij∣∣vj∣/∣vi∣≤Ri|\lambda - a_{ii}| \le \sum_{j\ne i}|a_{ij}||v_j|/|v_i| \le R_i. 개수에 대한 주장은 A(t)=D+t(A−D)A(t) = D + t(A - D)의 고유값이 tt에 연속이라는 사실(원판이 tt와 함께 커진다)에서 나온다. ∎

13장의 엄격한 대각 우세는 모든 원판이 원점을 포함하지 않는다는 뜻이고, 그래서 대각 우세 행렬은 가역입니다. 대각이 양수인 대칭 대각 우세 행렬은 모든 고유값이 양수, 곧 양정치입니다. 원판이 너무 크면 대각 닮음 변환 DAD−1DAD^{-1}(고유값은 같다)으로 ii행의 비대각 원소를 did_i배, ii열을 1/di1/d_i배 해서 원하는 원판을 줄일 수 있습니다.

예제 14.4 (세 원판, 세 고유값) A=[101−10.540.51−2−3]A = \begin{bmatrix}10 & 1 & -1\\ 0.5 & 4 & 0.5\\ 1 & -2 & -3\end{bmatrix}.
  1. 원판: D1D_1은 중심 10, 반지름 2 → 실수축 [8,12][8, 12]. D2D_2는 중심 4, 반지름 1 → [3,5][3, 5]. D3D_3는 중심 −3, 반지름 3 → [−6,0][-6, 0].
  2. 세 원판이 서로 떨어져 있으므로 각 원판에 고유값이 하나씩 있다. 복소 고유값은 켤레 쌍으로 나와야 하는데 원판마다 하나뿐이니 셋 다 실수다.
  3. 실제 고유값은 10.0250, 3.7297, −2.7547로 각 원판 안에 있다. 행렬이 가역이고(0은 D3D_3의 경계에 있지만 고유값 −2.75는 0이 아니다), σ=4\sigma = 4로 역반복하면 3.73으로 간다는 것도 미리 알 수 있다.
SIMULATOR

게르시고린 원판 편집기

행렬 A (원소 편집)
행 원판열 원판실제 고유값
고유값—
원판 (중심, 반지름)—
판정—
해볼 것: ① 예제 14.4에서 d₃를 줄여 보세요. 3행의 비대각 원소가 d₃배가 되어 D₃이 작아지고, 대신 1·2행의 원판이 조금 커집니다. 고유값(빨강)은 전혀 움직이지 않습니다. d₃ ≈ 0.5이면 0이 D₃ 밖으로 나가 A가 가역임이 원판만으로 증명됩니다. ② '회전'은 대각이 0이라 원판 두 개가 원점에서 겹치고, 고유값 ±i가 그 안에 있습니다. ③ 원소를 직접 고쳐 원판을 겹치게 하면 고유값 두 개가 한 합집합 안에서 복소 쌍이 될 수도 있습니다. 모델: 3 × 3 고유값은 특성 다항식의 뒤랑–케르너 반복(3차라 안전).

수축: 찾은 고유값을 치우기

거듭제곱법으로 λ1,v1\lambda_1, \mathbf v_1을 찾았다면 다음 고유값은 어떻게 찾을까요? 찾은 것을 행렬에서 "치워" 두 번째 것이 가장 크게 만드는 과정을 수축(deflation)이라 합니다.

정의 14.6 (호텔링 수축과 비란트 수축)
  • 호텔링(대칭 AA, ∥v1∥=1\|\mathbf v_1\| = 1): A1=A−λ1v1v1TA_1 = A - \lambda_1\mathbf v_1\mathbf v_1^{\mathsf T}. 고유벡터는 그대로이고 λ1\lambda_1만 0으로 바뀐다(나머지 고유벡터가 v1\mathbf v_1과 직교하므로).
  • 비란트(일반 AA): uTv1=1\mathbf u^{\mathsf T}\mathbf v_1 = 1인 u\mathbf u로 A1=A−λ1v1uTA_1 = A - \lambda_1\mathbf v_1\mathbf u^{\mathsf T}. 고유값 λ1\lambda_1만 0이 되고 나머지 고유값은 유지된다.
  • 직교 닮음 수축: v1\mathbf v_1을 첫 열로 하는 직교 행렬 QQ(하우스홀더 반사)로 QTAQ=[λ1wT0A2]Q^{\mathsf T}AQ = \begin{bmatrix}\lambda_1 & \mathbf w^{\mathsf T}\\ \mathbf 0 & A_2\end{bmatrix}. 나머지 고유값은 (n−1)(n-1)차 행렬 A2A_2의 고유값이다.

예를 들어 A=[2112]A = \begin{bmatrix}2 & 1\\ 1 & 2\end{bmatrix}에서 λ1=3\lambda_1 = 3, v1=(1,1)/2\mathbf v_1 = (1, 1)/\sqrt2이면 A1=A−3v1v1T=[0.5−0.5−0.50.5]A_1 = A - 3\mathbf v_1\mathbf v_1^{\mathsf T} = \begin{bmatrix}0.5 & -0.5\\ -0.5 & 0.5\end{bmatrix}이고, 고유값은 0과 1입니다. 남은 고유값 1을 거듭제곱법으로 바로 얻습니다.

주의: 오차가 쌓인다 v1\mathbf v_1이 10−610^{-6}만큼 틀리면 A1A_1에 크기 λ1⋅10−6\lambda_1\cdot10^{-6} 정도의 오차가 섞이고, 이 오차는 다음 고유값들에 그대로 넘어갑니다. 고유값을 여러 개 수축으로 구하면 뒤로 갈수록 정확도가 떨어지므로, 명시적 수축은 고유값 몇 개만 필요할 때 씁니다. QR 알고리즘의 수축은 이와 달리 대각 아래 원소가 반올림 수준이 되었을 때 행렬을 블록으로 자르는 것이라 정확도를 잃지 않습니다.

QR 알고리즘: 모든 고유값을 한꺼번에

eig(A)는 실제로 무엇을 하는가

LinearBook(수치 선형대수)에서 이동 없는 QR 알고리즘 Ak=QkRkA_k = Q_kR_k, Ak+1=RkQkA_{k+1} = R_kQ_k가 대각 아래를 ∣λi+1/λi∣k|\lambda_{i+1}/\lambda_i|^k로 지운다는 것을 보았습니다. 그런데 가까운 고유값이 있으면 수백 번이 걸리고, 한 번에 O(n3)O(n^3)이 듭니다. 라이브러리는 어떻게 n=1000n = 1000짜리를 1초 안에 푸는 걸까요?

먼저 기본 성질입니다. Rk=QkTAkR_k = Q_k^{\mathsf T}A_k이므로 Ak+1=QkTAkQkA_{k+1} = Q_k^{\mathsf T}A_kQ_k, 직교 닮음이라 고유값이 보존됩니다. 그리고 Qˉk=Q0Q1⋯Qk−1\bar Q_k = Q_0Q_1\cdots Q_{k-1}의 열들은 AkA^k의 열에 그람–슈미트를 한 결과와 같습니다. 곧 QR 알고리즘(QR algorithm)은 nn개 벡터에 거듭제곱법을 동시에 하며 서로 직교하게 유지하는 동시 반복입니다. 실용 알고리즘은 여기에 세 가지를 더합니다.

정리 14.7 (헤센베르크 축소) 모든 정사각 행렬은 하우스홀더 반사 n−2n - 2개의 직교 닮음으로 헤센베르크 행렬(Hessenberg matrix), 곧 i>j+1i \gt j + 1이면 hij=0h_{ij} = 0인 꼴로 바뀐다(약 103n3\tfrac{10}{3}n^3 flop). 대칭이면 결과는 삼중대각이다. QR 단계는 헤센베르크 꼴을 보존하고, 헤센베르크 행렬의 QR 단계는 기븐스 회전 n−1n - 1개로 O(n2)O(n^2)(삼중대각이면 O(n)O(n))에 끝난다.

왜 삼각이 아니라 헤센베르크인가. 반사 H1H_1로 첫 열의 둘째 원소 아래를 지우면 H1AH_1A의 첫 열은 좋지만, 닮음을 위해 오른쪽에서 H1H_1을 곱하면 첫 열이 다시 채워진다. 반사가 둘째 행부터만 건드리게 하면(H1=diag(1,H~1)H_1 = \mathrm{diag}(1, \tilde H_1)) 오른쪽 곱이 첫 열을 건드리지 않는다. 대각 바로 아래 한 줄이 그 대가다. 유한 단계로 삼각 꼴까지 가는 것은 5차 이상 근의 공식이 없다는 사실과 모순이므로 불가능하다. ∎

function shifted_qr_eigenvalues(A)
  H = hessenberg(A)                        // 하우스홀더, 한 번만: 10n³/3
  m = n
  while m > 1
    mu = wilkinson_shift(H[m-1..m, m-1..m])  // 오른쪽 아래 2×2의 고유값 중 h_mm에 가까운 것
    Q R = qr(H[1..m,1..m] - mu I)            // 기븐스 m-1개: O(m²)
    H[1..m,1..m] = R Q + mu I
    if |H[m][m-1]| <= eps * (|H[m][m]| + |H[m-1][m-1]|)
      H[m][m-1] = 0;  m = m - 1                // 수축: 고유값 H[m][m] 확정
  return diag(H)

이동이 두 번째 열쇠입니다. Ak−μkI=QkRkA_k - \mu_kI = Q_kR_k, Ak+1=RkQk+μkIA_{k+1} = R_kQ_k + \mu_kI는 여전히 닮음 변환이고, 마지막 대각 아래 원소는 대략 ∣λn−μ∣/∣λn−1−μ∣|\lambda_n - \mu|/|\lambda_{n-1} - \mu|의 비율로 줄어듭니다. 역반복과 똑같은 구조입니다. 실제로 이동 QR의 마지막 행은 en\mathbf e_n에 이동 역반복을 하는 것과 같습니다. μ=hnn\mu = h_{nn}(레일리 이동)을 쓰면 RQI처럼 2차(대칭이면 3차) 수렴합니다. 레일리 이동은 대칭적인 경우에 막힐 수 있어서, 오른쪽 아래 2 × 2 블록의 고유값 중 hnnh_{nn}에 가까운 것을 쓰는 윌킨슨 이동(Wilkinson shift)이 표준이며, 대칭 삼중대각 행렬에서는 항상 수렴함이 증명되어 있습니다. 세 번째 열쇠는 수축입니다. hm,m−1h_{m,m-1}이 반올림 수준이 되면 잘라 내고 (m−1)(m-1)차로 계속합니다.

QR 단계 수 (수축 허용 10⁻¹⁴)이동 없음레일리 이동윌킨슨 이동
대칭 6 × 6, 고유값 1 … 61601811
대칭, 가까운 고유값 3, 2.9, …8311811
비대칭 6 × 6, 실수 고유값1291915
반대각 4 × 4 (고유값 ±1)멈춤멈춤3

표의 마지막 줄이 윌킨슨 이동이 필요한 이유입니다. 반대각 행렬은 hnn=0h_{nn} = 0이고 고유값 ±1\pm1이 0에서 같은 거리에 있어, 이동이 없거나 레일리 이동이면 QR 단계가 행렬을 전혀 바꾸지 못합니다. 고유값이 고유값 하나당 평균 두세 단계 만에 확정되므로 전체 비용은 축소 비용이 지배하고, 비대칭 행렬의 고유값 전부가 약 10n310n^3 flop, 대칭이면 약 43n3\tfrac43n^3 flop에 나옵니다. 실수 비대칭 행렬의 복소 고유값 쌍은 켤레 이동 두 개를 실수 연산으로 한 번에 적용하는 프랜시스의 이중 이동으로 처리하며, 결과는 대각에 2 × 2 블록이 남는 실수 슈르 꼴입니다.

SIMULATOR

QR 반복 히트맵: 대각 아래가 사라지는 속도

log₁₀|aᵢⱼ| (밝을수록 큼)
log₁₀|aᵢ₊₁,ᵢ| vs 단계
이동
단계 k0
활성 블록 크기 m—
확정된 고유값—
이동 μ—
해볼 것: ① '이동 없음'에서 10단계씩 누르면 대각 아래가 위에서부터 천천히 어두워집니다. 비율 |λᵢ₊₁/λᵢ|가 1에 가까운 칸이 가장 늦습니다. ② '윌킨슨'으로 바꾸면 오른쪽 아래 원소가 두세 단계 만에 10⁻¹⁵ 아래로 떨어지고, 수축이 일어나 활성 블록(노란 테두리)이 한 칸씩 줄어듭니다. ③ '반대각'에서 이동 없음·레일리는 아무리 눌러도 변화가 없습니다. ④ 헤센베르크 축소를 끄면 처음 행렬이 꽉 차 있지만, QR 단계는 결국 같은 고유값을 냅니다(단지 단계마다 O(n³)). 모델: 활성 블록에 그람–슈미트 QR, 수축 기준 |aₘ,ₘ₋₁| ≤ 10⁻¹⁴(|aₘₘ| + |aₘ₋₁,ₘ₋₁|).

대칭 행렬과 야코비 회전

대칭 행렬에는 훨씬 오래된, 그리고 지금도 쓰이는 방법이 있습니다. 비대각 원소 하나 apqa_{pq}를 골라, p,qp, q 좌표 평면의 회전 JJ로 JTAJJ^{\mathsf T}AJ의 (p,q)(p, q) 원소를 0으로 만듭니다. 2 × 2 대칭 행렬을 대각화하는 회전각은 언제나 있습니다.

정리 14.8 (야코비 회전) θ=(aqq−app)/(2apq)\theta = (a_{qq} - a_{pp})/(2a_{pq}), t=sign(θ)/(∣θ∣+θ2+1)t = \mathrm{sign}(\theta)/(|\theta| + \sqrt{\theta^2 + 1}), c=1/1+t2c = 1/\sqrt{1 + t^2}, s=tcs = tc로 p,qp, q 평면의 회전을 잡으면 A′=JTAJA' = J^{\mathsf T}AJ의 apq′=0a'_{pq} = 0이고, 비대각 원소의 제곱합 off(A)2=∑i≠jaij2\mathrm{off}(A)^2 = \sum_{i\ne j}a_{ij}^2은
off(A′)2=off(A)2−2apq2\mathrm{off}(A')^2 = \mathrm{off}(A)^2 - 2a_{pq}^2
만큼 정확히 준다. 가장 큰 ∣apq∣|a_{pq}|를 고르는 고전 야코비에서는 off(A′)2≤(1−2n(n−1))off(A)2\mathrm{off}(A')^2 \le (1 - \tfrac{2}{n(n-1)})\mathrm{off}(A)^2이라 선형 수렴이 보장되고, 모든 (p,q)(p, q)를 차례로 도는 순환 야코비는 몇 번의 스윕 뒤 2차 수렴한다.

아이디어. 직교 닮음은 프로베니우스 노름을 보존하고, p,qp, q 행·열 밖의 원소의 제곱합은 회전 전후가 같다. 그런데 2×22\times2 블록에서 비대각 apq2a_{pq}^2의 두 배만큼이 대각 app2+aqq2a_{pp}^2 + a_{qq}^2으로 옮겨 간다. 다른 0이었던 원소는 회전으로 다시 0이 아닐 수 있지만 전체 off는 줄기만 한다. tt를 절댓값이 작은 근으로 고르면 회전각이 ∣ϕ∣≤π/4|\phi| \le \pi/4라 수치적으로 안정하다. ∎

예제 14.5 (회전 한 번) A=[412130201]A = \begin{bmatrix}4 & 1 & 2\\ 1 & 3 & 0\\ 2 & 0 & 1\end{bmatrix}, off(A)2=2(1+4+0)=10\mathrm{off}(A)^2 = 2(1 + 4 + 0) = 10. 가장 큰 비대각 a13=2a_{13} = 2를 지운다.
  1. θ=(1−4)/(2⋅2)=−0.75\theta = (1 - 4)/(2\cdot 2) = -0.75, t=−1/(0.75+1.25)=−0.5t = -1/(0.75 + 1.25) = -0.5, c=0.8944c = 0.8944, s=−0.4472s = -0.4472.
  2. A′=[50.894400.89443−0.44720−0.44720]A' = \begin{bmatrix}5 & 0.8944 & 0\\ 0.8944 & 3 & -0.4472\\ 0 & -0.4472 & 0\end{bmatrix}. off(A′)2=2(0.8+0.2)=2=10−2⋅22\mathrm{off}(A')^2 = 2(0.8 + 0.2) = 2 = 10 - 2\cdot2^2. 0이었던 a23a_{23}이 −0.4472-0.4472로 채워졌다.
  3. 계속하면 고유값 5.3465, 2.7222, −0.0687로 간다. 고유값 6 … 1인 6 × 6 행렬의 순환 스윕에서는 off가 3.45 → 1.69 → 0.558 → 3.5×10⁻² → 1.8×10⁻⁵ → 7.7×10⁻¹⁶으로, 마지막 스윕들에서 지수가 두 배씩 되는 2차 수렴이 보인다.

야코비는 QR보다 몇 배 느리지만, 작은 고유값까지 상대 정확도가 높고(양정치 행렬에서 특히), 회전 하나하나가 독립적이라 병렬화하기 쉽습니다. 고유벡터는 회전들의 곱 V=J1J2⋯V = J_1J_2\cdots으로 저절로 나옵니다. 엔진의 MB.mat.eigSym도 이 방법입니다.

SIMULATOR

야코비 회전: 비대각이 한 칸씩 사라진다

A (색 = 원소 값, 테두리 = 다음에 지울 칸)
log₁₀ off(A) vs 회전 수
고르는 법
회전 수0
off(A)—
방금 지운 칸 · 감소량 2a²—
대각—
해볼 것: ① 회전 한 번마다 테두리 칸이 0이 되지만 같은 행·열의 다른 칸이 다시 채워지는 것을 보세요. off²는 그래도 정확히 2a²pq만큼 줍니다. ② 스윕(5 × 5에서 회전 10번)을 몇 번 누르면 그래프의 기울기가 점점 가팔라집니다(2차 수렴). ③ 끝나면 대각이 고유값 9, 6, 4, 2, 1(순서는 섞일 수 있음)입니다. 모델: Q diag(9, 6, 4, 2, 1) Qᵀ.

특이값 계산과 저계수 근사

m×nm \times n 행렬 AA의 특이값 σi\sigma_i는 ATAA^{\mathsf T}A의 고유값의 제곱근입니다(LinearBook: SVD). 그렇다고 ATAA^{\mathsf T}A를 만들어 고유값을 구하면 안 됩니다. 조건수가 제곱되기 때문입니다.

예제 14.6 (AᵀA를 만들면 사라지는 특이값) A=[11δ00δ]A = \begin{bmatrix}1 & 1\\ \delta & 0\\ 0 & \delta\end{bmatrix}, δ=10−8\delta = 10^{-8}. 참 특이값은 2+δ2≈1.414\sqrt{2 + \delta^2} \approx 1.414와 δ=10−8\delta = 10^{-8}이다.
  1. ATA=[1+δ2111+δ2]A^{\mathsf T}A = \begin{bmatrix}1 + \delta^2 & 1\\ 1 & 1 + \delta^2\end{bmatrix}인데 δ2=10−16\delta^2 = 10^{-16}은 반올림 단위 1.1×10−161.1\times10^{-16}보다 작아 배정밀도에서 1+δ2=11 + \delta^2 = 1이 된다(JavaScript로 확인: 1 + 1e-16 === 1).
  2. 저장된 ATA=[1111]A^{\mathsf T}A = \begin{bmatrix}1 & 1\\ 1 & 1\end{bmatrix}의 고유값은 2와 0, 따라서 작은 특이값이 정확히 0으로 나온다. 정보가 완전히 사라졌다.
  3. AA에 직접 직교 변환을 쓰는 방법은 σ2\sigma_2를 상대 정확도 10−810^{-8} 수준 이상으로 얻는다.

표준 알고리즘(골럽–카한)은 AA의 왼쪽과 오른쪽에 서로 다른 하우스홀더 반사를 번갈아 곱해 이중대각 행렬 B=U1TAV1B = U_1^{\mathsf T}AV_1을 만들고(O(mn2)O(mn^2)), BB에 BTBB^{\mathsf T}B를 만들지 않은 채 암묵적 이동 QR을 적용합니다. ATAA^{\mathsf T}A에 대한 대칭 QR 알고리즘을 AA 자체에서 흉내 내는 것입니다. 한쪽 야코비 회전으로 AA의 열을 서로 직교하게 만드는 방법도 쓰입니다.

정리 14.9 (에카르트–영, 최적 저계수 근사) A=∑iσiuiviTA = \sum_i\sigma_i\mathbf u_i\mathbf v_i^{\mathsf T}일 때 Ak=∑i≤kσiuiviTA_k = \sum_{i\le k}\sigma_i\mathbf u_i\mathbf v_i^{\mathsf T}은 계수 kk 이하 행렬 중 AA에 가장 가깝고, ∥A−Ak∥2=σk+1\|A - A_k\|_2 = \sigma_{k+1}, ∥A−Ak∥F=σk+12+⋯\|A - A_k\|_F = \sqrt{\sigma_{k+1}^2 + \cdots}이다.

예를 들어 5 × 5 힐베르트 행렬 hij=1/(i+j−1)h_{ij} = 1/(i + j - 1)의 특이값은 1.567, 0.2085, 0.01141, 3.06×10⁻⁴, 3.29×10⁻⁶입니다. 계수 2의 근사도 2-노름 오차 0.0114, 곧 ∥A∥2\|A\|_2의 0.7%로 맞습니다. 특이값이 빨리 줄어드는 행렬은 적은 수의 벡터로 압축되며, 이것이 영상 압축, 추천 시스템, 주성분 분석의 수학입니다. 아주 큰 행렬에서는 무작위 벡터 k+10k + 10개 정도에 AA를 곱해 치역을 근사한 뒤 작은 SVD를 하는 무작위 SVD가 쓰입니다.

응용: 페이지랭크, 진동 모드, 에너지 준위

링크만 보고 중요한 페이지 고르기

웹 페이지 nn개와 그 사이의 링크가 있습니다. "중요한 페이지가 많이 가리키는 페이지가 중요하다"는 순환 정의를 어떻게 숫자로 만들까요? 무작위로 링크를 따라 떠도는 사람이 오래 머문 뒤 각 페이지에 있을 확률로 정의하면, 그 확률 벡터는 전이 행렬의 고유값 1에 대한 고유벡터입니다.

페이지 jj에서 나가는 링크가 djd_j개면 Pij=1/djP_{ij} = 1/d_j(j→ij \to i 링크가 있을 때). 나가는 링크가 없는 페이지는 모든 페이지로 균등하게 간다고 둡니다. 서퍼는 확률 α\alpha(감쇠 인자, 보통 0.85)로 링크를 따르고 1−α1 - \alpha로 아무 페이지로나 순간 이동합니다.

G=αP+1−αn11T,Gr=r,∑iri=1.G = \alpha P + \frac{1 - \alpha}{n}\mathbf 1\mathbf 1^{\mathsf T},\qquad G\mathbf r = \mathbf r,\quad \sum_i r_i = 1.
GG는 열 합이 1인 양의 행렬이라 페론–프로베니우스 정리에 의해 가장 큰 고유값 1이 단순하고 고유벡터가 양수다. 둘째 고유값은 ∣λ2∣≤α|\lambda_2| \le \alpha이므로 거듭제곱법의 오차는 매번 α\alpha배 이하로 준다.

GG는 꽉 찬 행렬이지만 만들 필요가 없습니다. Gr=αPr+1−αn1G\mathbf r = \alpha P\mathbf r + \frac{1 - \alpha}{n}\mathbf 1(∑ri=1\sum r_i = 1일 때)이므로 희소 행렬 PP와의 곱 한 번이면 됩니다. α=0.85\alpha = 0.85이면 0.85k=10−80.85^k = 10^{-8}에서 k≈113k \approx 113번, 웹 전체 규모에서도 같은 횟수입니다.

예제 14.7 (페이지 네 개) 링크 1 → 2, 3; 2 → 3; 3 → 1; 4 → 1, 3. α=0.85\alpha = 0.85, r0=(0.25,0.25,0.25,0.25)\mathbf r_0 = (0.25, 0.25, 0.25, 0.25).
  1. 한 번: r1=0.0375+0.85(0.25+0.125)=0.3563r_1 = 0.0375 + 0.85(0.25 + 0.125) = 0.3563, r2=0.0375+0.85⋅0.125=0.1437r_2 = 0.0375 + 0.85\cdot0.125 = 0.1437, r3=0.0375+0.85(0.125+0.25+0.125)=0.4625r_3 = 0.0375 + 0.85(0.125 + 0.25 + 0.125) = 0.4625, r4=0.0375r_4 = 0.0375.
  2. 수렴값은 r=(0.3797, 0.1989, 0.3839, 0.0375)\mathbf r = (0.3797,\ 0.1989,\ 0.3839,\ 0.0375). 아무도 가리키지 않는 페이지 4는 순간 이동 몫 0.15/40.15/4만 받는다. 링크를 가장 많이 받는 3이 1위지만, 3이 자기 몫을 전부 넘겨 주는 1도 거의 같다.
SIMULATOR

작은 웹 그래프의 페이지랭크: 거듭제곱법

페이지를 눌러 고르고, 다른 페이지를 눌러 링크 켜기/끄기
log₁₀ ‖rₖ − rₖ₋₁‖₁ vs k
원 크기 ∝ 순위 rᵢ선택한 페이지αᵏ 기준선
반복 k0
1위 페이지 (rᵢ)—
변화 ‖rₖ − rₖ₋₁‖₁—
10⁻¹⁰까지 반복—
해볼 것: ① '수렴까지'를 누르면 변화량이 αᵏ 기준선과 평행하거나 더 빨리 내려갑니다. α를 0.99로 올리면 수렴이 크게 느려집니다(|λ₂| ≤ α). ② 링크 하나를 추가해 순위가 어떻게 바뀌는지 보세요. 1위 페이지가 가리키는 페이지는 함께 올라갑니다. ③ 나가는 링크를 모두 끈 페이지(막다른 페이지)는 모든 페이지로 균등하게 나눠 줍니다. 모델: 열 확률 행렬 P, 막다른 열은 1/n로 채움, r₀ = 균등.

진동 모드. 질량 mm인 물체 nn개를 강성 kk인 용수철로 일렬로 잇고 양 끝을 고정하면 운동 방정식은 Mx¨=−KxM\ddot{\mathbf x} = -K\mathbf x, K=k tridiag(−1,2,−1)K = k\,\mathrm{tridiag}(-1, 2, -1)이고, x=vcos⁡ωt\mathbf x = \mathbf v\cos\omega t를 넣으면 Kv=ω2MvK\mathbf v = \omega^2M\mathbf v, 곧 일반화 고유값 문제입니다. 이 사슬에서는 ωj2=km(2−2cos⁡jπn+1)\omega_j^2 = \frac{k}{m}\bigl(2 - 2\cos\frac{j\pi}{n+1}\bigr)를 정확히 알지만, 실제 구조물의 유한 요소 모델은 크기가 수십만이고 필요한 것은 가장 낮은 진동수 몇십 개입니다. 그래서 σ=0\sigma = 0 근처의 이동 역반복을 크릴로프 공간과 결합한 이동–역 란초시 방법(ARPACK, MATLAB eigs)이 쓰입니다(LinearBook: 고유값).

주성분 분석. 데이터 행렬의 공분산 C=XTX/(N−1)C = X^{\mathsf T}X/(N - 1)의 가장 큰 고유벡터들이 데이터가 가장 많이 퍼진 방향입니다(LinearBook: PCA). 수치적으로는 예제 14.6의 교훈대로 CC를 만들지 않고 중심화한 XX의 SVD를 구합니다.

양자 에너지 준위. 1차원 조화 진동자 −12ψ′′+12x2ψ=Eψ-\tfrac12\psi'' + \tfrac12x^2\psi = E\psi(단위를 골라 정확한 준위는 Ej=j+12E_j = j + \tfrac12)를 2배 하여 −ψ′′+x2ψ=2Eψ-\psi'' + x^2\psi = 2E\psi로 쓰고, [−6,6][-6, 6]을 nn개 내부점으로 나눠 2차 중앙 차분을 쓰면 대칭 삼중대각 행렬의 고유값 문제가 됩니다. 2E의 정확한 값 1, 3, 5, 7, …과 비교하면

n (격자 간격 h)2E₀ (참 1)2E₁ (3)2E₂ (5)2E₃ (7)2E₉ (19)
50 (0.235)0.996532.982594.954596.9123718.35113
100 (0.119)0.999122.995584.988506.9778718.83902
200 (0.060)0.999782.998894.997106.9944318.95969
400 (0.030)0.999942.999724.999276.9986018.98996

바닥 상태의 오차는 0.00347, 0.00088, 0.00022, 0.00006으로 hh가 반이 될 때마다 1/4, 곧 차분의 O(h2)O(h^2)를 그대로 따릅니다. 높은 준위일수록 파동 함수가 빨리 진동해 같은 격자에서 오차가 큽니다. 고유값 계산은 스투름 수열을 쓴 이분법(삼중대각 대칭 행렬에서 λ\lambda보다 작은 고유값의 수를 O(n)O(n)에 센다)으로 했습니다.

이 도구가 쓰이는 곳

상황알맞은 방법대표 도구
밀집 행렬, 고유값 전부헤센베르크(삼중대각) + 이동 QRLAPACK dgeev/dsyev, numpy.linalg.eig, MATLAB eig
큰 희소 행렬, 몇 개만란초시·아놀디(크릴로프), 이동–역 변환ARPACK, scipy.sparse.linalg.eigsh, MATLAB eigs
지배 고유벡터 하나, 곱만 가능거듭제곱법페이지랭크, 마르코프 연쇄의 정상 분포
근사값을 이미 알 때 다듬기역반복, 레일리 몫 반복구조 해석의 모드 갱신, 고유벡터 재계산
특이값, 저계수 근사골럽–카한 이중대각화, 무작위 SVDPCA, 영상 압축, 추천 시스템

핵심 정리

  1. 특성 다항식의 근은 계수에 대해 조건이 아주 나쁘다(윌킨슨). 좋은 알고리즘은 직교 닮음 변환만 쌓아 후방 안정하게 고유값을 구한다. 바우어–파이크: 오차 ≤ κ(V)‖E‖, 대칭이면 κ(V) = 1.
  2. 거듭제곱법은 ∣λ2/λ1∣k|\lambda_2/\lambda_1|^k로 지배 고유벡터에 수렴한다. 대칭이면 레일리 몫의 고유값 오차는 그 제곱으로 준다.
  3. 이동 역반복 (A−σI)−1(A - \sigma I)^{-1}은 σ\sigma에 가장 가까운 고유값을 골라 잡고, 수렴비는 가장 가까운 것과 두 번째로 가까운 것의 거리 비다.
  4. 레일리 몫 반복은 매번 이동을 레일리 몫으로 갱신해 대칭 행렬에서 3차, 비대칭에서 2차로 수렴한다. 대신 어느 고유값으로 갈지는 시작점이 정한다.
  5. 게르시고린 원판 ∣z−aii∣≤∑j≠i∣aij∣|z - a_{ii}| \le \sum_{j\ne i}|a_{ij}|의 합집합에 모든 고유값이 있고, 떨어진 원판 묶음에는 원판 수만큼의 고유값이 있다. DAD−1DAD^{-1}로 원판을 줄일 수 있다.
  6. 수축은 찾은 고유값을 치운다. 명시적 수축은 오차가 쌓이고, QR의 수축은 작아진 대각 아래 원소에서 행렬을 자르는 것이라 안전하다.
  7. 실용 QR = 헤센베르크 축소(103n3\tfrac{10}{3}n^3) + 윌킨슨 이동(고유값당 두세 단계) + 수축. 비대칭 전체 약 10n310n^3, 대칭 약 43n3\tfrac43n^3 flop.
  8. 야코비 회전은 off2\mathrm{off}^2를 정확히 2apq22a_{pq}^2씩 줄이고 순환 스윕에서 2차 수렴한다. 특이값은 ATAA^{\mathsf T}A를 만들지 않고 이중대각화로 구하며, 페이지랭크는 α\alpha배씩 수렴하는 거듭제곱법이다.

확인 퀴즈

Q1. 대칭 행렬의 고유값이 10, 9, 1이다. 거듭제곱법으로 고유값 10을 구할 때 레일리 몫의 오차는 반복마다 대략 몇 배로 주는가?

벡터의 각 오차는 ∣λ2/λ1∣=0.9|\lambda_2/\lambda_1| = 0.9배, 대칭 행렬의 레일리 몫은 그 제곱 0.810.81배로 준다. 간격이 좁아 느리다. 이동 역반복을 쓰면 크게 빨라진다.

Q2. 고유값이 1, 3, 4, 7, 10인 행렬에 이동 σ = 3.8의 역반복을 쓰면 어느 고유값으로, 어떤 비율로 수렴하는가?

σ = 3.8에 가장 가까운 고유값은 4(거리 0.2), 두 번째는 3(거리 0.8). 수렴비는 0.2/0.8 = 0.25.

Q3. 레일리 몫 반복에서 대칭 행렬의 벡터 오차가 10−210^{-2}이었다. 다음 단계의 벡터 오차는 대략?

대칭이면 3차 수렴이라 ϵk+1≈Cϵk3=10−6\epsilon_{k+1} \approx C\epsilon_k^3 = 10^{-6} (상수 C가 1 정도일 때). 비대칭이면 2차라 10−410^{-4}쯤이다.

Q4. A=[5101−20.500.58]A = \begin{bmatrix}5 & 1 & 0\\ 1 & -2 & 0.5\\ 0 & 0.5 & 8\end{bmatrix}의 게르시고린 원판으로 알 수 있는 것은?

원판은 중심 5 반지름 1 → [4, 6], 중심 −2 반지름 1.5 → [−3.5, −0.5], 중심 8 반지름 0.5 → [7.5, 8.5]. 셋 다 떨어져 있어 각각 고유값 하나씩(대칭이라 실수). 0은 어느 원판에도 없으니 가역이고, [−3.5, −0.5]의 고유값 하나만 음수다.

Q5. 실용 QR 알고리즘이 먼저 헤센베르크 꼴로 축소하는 주된 이유는?

헤센베르크 꼴은 QR 반복에서 유지되고, 기븐스 회전 n − 1개로 한 단계를 O(n²)에 할 수 있다. 축소는 한 번만 103n3\tfrac{10}{3}n^3이 든다. 유한 단계의 삼각화는 근의 공식이 없으므로 불가능하다.

Q6. 대칭 행렬에서 apq=3a_{pq} = 3을 야코비 회전으로 지웠다. off(A)2\mathrm{off}(A)^2은 얼마나 주는가?

off(A′)2=off(A)2−2apq2=off(A)2−18\mathrm{off}(A')^2 = \mathrm{off}(A)^2 - 2a_{pq}^2 = \mathrm{off}(A)^2 - 18. apqa_{pq}와 aqpa_{qp} 두 칸의 제곱이 대각으로 옮겨 간다. 다른 칸이 다시 채워져도 전체는 정확히 이만큼 준다.

Q7. 행렬 AA의 특이값을 구하려고 ATAA^{\mathsf T}A의 고유값을 계산하는 것의 문제는?

κ(ATA)=κ(A)2\kappa(A^{\mathsf T}A) = \kappa(A)^2. σ=10−8\sigma = 10^{-8}이면 σ2=10−16\sigma^2 = 10^{-16}이 1과 더해지는 순간 사라진다(예제 14.6). 표준 방법은 A 자체를 이중대각화한다.

Q8. 감쇠 인자 α = 0.9인 페이지랭크를 거듭제곱법으로 오차 10−610^{-6}까지 구하려면 대략 몇 번 곱해야 하는가?

∣λ2∣≤α|\lambda_2| \le \alpha이므로 0.9k=10−60.9^k = 10^{-6}, k=6/0.0458≈131k = 6/0.0458 \approx 131. 횟수는 그래프 크기와 무관하고, 한 번의 비용만 링크 수에 비례한다.