선형대수 교과서는 고유값을 det(A−λI)=0의 근으로 구합니다. 2 × 2나 3 × 3에서는 좋은 방법이지만, 컴퓨터는 이 길을 거의 가지 않습니다. 5차 이상 다항식에는 근의 공식이 없고, 계수에서 근을 구하는 문제는 조건이 끔찍하게 나쁘기 때문입니다. 그래서 고유값은 언제나 반복으로 구합니다. 이 장은 벡터에 행렬을 계속 곱하는 거듭제곱법에서 출발해, 이동과 역행렬로 원하는 고유값을 골라 잡는 역반복, 맞는 자릿수가 매번 세 배가 되는 레일리 몫 반복, 계산 없이 고유값의 위치를 가두는 게르시고린 원판, 그리고 MATLAB의 eig가 실제로 부르는 이동 QR 알고리즘과 대칭 행렬의 야코비 회전까지 다룹니다.
특성 다항식으로 고유값을 구하면 왜 정확도를 잃는지 설명하고, 바우어–파이크 정리로 고유값의 민감도를 판단한다.
거듭제곱법의 수렴 속도 ∣λ2/λ1∣를 유도하고, 이동 역반복으로 원하는 고유값을 골라 수렴 속도를 바꾼다.
레일리 몫 반복이 대칭 행렬에서 3차 수렴함을 반복 표로 확인한다.
게르시고린 원판으로 고유값의 위치를 가두고, 대각 닮음 변환으로 원판을 줄인다.
헤센베르크 축소, 이동(레일리·윌킨슨), 수축을 결합한 실용 QR 알고리즘의 구조를 이해한다.
야코비 회전, 특이값 계산의 원리, 그리고 페이지랭크·진동 모드·양자 에너지 준위에서 고유값 계산이 쓰이는 방식을 안다.
이 수식이 없었다면검색 순위와 다리의 고유 진동수
웹 페이지의 중요도를 링크 구조만으로 매기는 페이지랭크는 수십억 차원 행렬의 가장 큰 고유값에 대한 고유벡터입니다. 다리·건물·비행기 날개의 위험한 공진 진동수는 질량·강성 행렬의 일반화 고유값 문제에서 나오고, 분자의 에너지 준위는 슈뢰딩거 방정식을 이산화한 행렬의 고유값입니다. 이 행렬들은 크기가 수천에서 수십억이라 특성 다항식은 아예 적을 수도 없습니다.
모든 고유값을 한꺼번에 구하는 표준 방법인 QR 알고리즘은 1961년 무렵 영국의 프랜시스(John G. F. Francis)와 소련의 쿠블라놉스카야(Vera Kublanovskaya)가 각각 독립적으로 발표했고, 20세기의 가장 영향력 있는 알고리즘 가운데 하나로 꼽힙니다. 대칭 행렬의 회전법은 이보다 훨씬 앞선 1846년 야코비의 논문까지 거슬러 올라갑니다.
Av = λv→특성 다항식은 불안정→닮음 변환을 반복해 삼각 행렬로→순위 · 진동수 · 에너지 준위
특성 다항식으로 구하면 안 되는 이유
고유값이 1, 2, …, 20인 행렬
대각 원소가 1부터 20까지인 대각 행렬의 고유값은 보는 그대로입니다. 이 행렬의 특성 다항식 p(λ)=(λ−1)(λ−2)⋯(λ−20)을 전개해 계수를 배정밀도로 저장한 뒤 근을 구하면 어떻게 될까요? 계수는 −210부터 20!≈2.4×1018까지입니다.
이것이 2장(조건수와 안정성)에서 본 윌킨슨 다항식입니다. 계수를 배정밀도로 저장만 해도(전개 계산 자체는 정확히 해도) 반올림 오차가 생기고, 그 근을 정확히 구해도 λ=12,13,14 근처에서 오차가 6×10−4 정도가 되고, 근을 배정밀도로 계산하면 오차가 더 커집니다. 윌킨슨이 1959년에 보인 대로 λ19의 계수 −210을 2−23≈1.2×10−7만큼만 바꾸면 근 열 개가 복소수 쌍이 되고, 16.73±2.81i 같은 근이 나타납니다. 다항식의 근은 계수에 대해 조건이 나쁜 문제입니다.
그런데 행렬의 고유값 자체는 그렇지 않을 수 있습니다. 문제를 "다항식의 근"으로 바꾸는 순간 원래 문제보다 훨씬 예민한 문제로 바꾼 것입니다. 행렬 쪽의 민감도는 다음 정리가 말해 줍니다.
정리 14.1 (바우어–파이크)A=VΛV−1가 대각화 가능하면, A+E의 모든 고유값 μ에 대해 A의 어떤 고유값 λ가 있어
∣μ−λ∣≤κ2(V)∥E∥2,κ2(V)=∥V∥2∥V−1∥2.
특히 A가 대칭(정규)이면 V를 직교 행렬로 고를 수 있어 κ2(V)=1이고, 고유값은 ∥E∥2보다 많이 움직이지 않는다.
증명의 핵심.μ가 A의 고유값이 아니면 A+E−μI=V(Λ−μI)(I+(Λ−μI)−1V−1EV)V−1이 특이하므로 ∥(Λ−μI)−1V−1EV∥2≥1. 왼쪽은 κ2(V)∥E∥2/mini∣λi−μ∣ 이하다. ∎
ε=0: 고유값 1, 2. 고유벡터 (1,0)과 (104,1)은 거의 평행하다(κ2(V)≈2×104).
ε=10−6: 고유값 0.990098, 2.009902. 원소 하나를 10−6 바꿨는데 고유값이 9.9×10−3, 곧 만 배 가까이 움직였다.
같은 크기의 교란을 대칭 행렬에 주면 고유값은 10−6 이하로만 움직인다. 대칭 고유값 문제는 언제나 조건이 좋다.
이제 결론이 분명합니다. 고유값을 구하는 좋은 알고리즘은 다항식을 거치지 않고, 행렬에 직교 닮음 변환A↦QTAQ만 쌓아서 고유값을 읽을 수 있는 꼴(삼각·대각)로 만듭니다. 직교 변환은 노름을 보존하므로 반올림 오차가 커지지 않고, 결과는 "∥E∥≈εmach∥A∥만큼 교란된 행렬의 정확한 고유값"이 됩니다(후방 안정). 그다음 정확도는 바우어–파이크가 말하는 문제 자체의 조건에만 달려 있습니다.
거꾸로 쓰기: 다항식의 근을 고유값으로 실제로는 반대 방향이 쓰입니다. 다항식 p(x)=xn+cn−1xn−1+⋯+c0의 근은 동반 행렬(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는 하우스홀더 반사).
거듭제곱법과 수렴 속도
곱하기만 해서 가장 큰 고유값을
행렬을 저장하지 않고 "벡터를 주면 Ax를 돌려주는" 함수만 있다고 합시다. 페이지랭크의 링크 행렬이나 유한 요소 강성 행렬이 그렇습니다. 이것만으로 가장 큰 고유값과 고유벡터를 얻을 수 있을까요?
A가 고유벡터 v1,…,vn으로 대각화되고 ∣λ1∣>∣λ2∣≥⋯≥∣λn∣이라 합시다. 시작 벡터 x0=∑civi에 A를 k번 곱하면
Akx0=λ1k(c1v1+i≥2∑ci(λ1λi)kvi).
괄호 안의 둘째 항부터는 ∣λi/λ1∣k→0. 넘침·사라짐을 막기 위해 매번 정규화하면 방향만 v1로 모인다. 이것이 거듭제곱법(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∣이고 c1=0이면 정규화한 반복 벡터와 ±v1 사이의 각은 O(∣λ2/λ1∣k)로 줄고, 고유값 추정의 오차도 O(∣λ2/λ1∣k)이다. A가 대칭이면 레일리 몫(Rayleigh quotient)r(x)=xTAx/xTx의 오차는 O(∣λ2/λ1∣2k)로 두 배 빨리 준다.
대칭일 때 제곱이 되는 이유.x=v1+δ, δ⊥v1이면 r(x)−λ1=1+∥δ∥2δT(A−λ1I)δ=O(∥δ∥2). 레일리 몫은 고유벡터에서 정류점이라 벡터 오차의 제곱만큼만 틀린다. ∎
예제 14.2 (비대칭 2 × 2)A=[4213]의 고유값은 5, 2, 고유벡터는 (1,1), (1,−2)이다. x0=(1,0)에서 출발해 첫 성분이 1이 되도록 정규화한다.
Ax0=(4,2) → x1=(1,0.5). 고유값 추정(첫 성분의 비) 4.
Ax1=(4.5,3.5) → x2=(1,0.7778). 추정 4.5. 다음은 (1,0.9070)과 4.7778, (1,0.9621)과 4.9070.
둘째 성분의 오차 1−x2는 0.5, 0.2222, 0.0930, 0.0379, 0.0153으로 비가 0.444, 0.419, 0.408, 0.403 → ∣λ2/λ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=λv이면 (A−σI)−1v=λ−σ1v입니다. 고유벡터는 그대로이고 고유값만 1/(λi−σ)로 바뀝니다. 이동량 σ에 가장 가까운 고유값이 절댓값이 가장 큰 고유값이 되므로, 이 행렬에 거듭제곱법을 쓰면 그 고유벡터로 갑니다. 역행렬을 만들지 않고 매번 (A−σI)y=x를 풀며, LU 분해는 처음 한 번만 하면 됩니다.
정리 14.3 (이동 역반복)λJ가 σ에 가장 가깝고 λK가 그다음으로 가까우면, 이동 역반복(shifted inverse iteration)의 수렴비는
∣λK−σ∣∣λJ−σ∣
이다. σ가 λJ에 가까울수록 비가 0에 가까워져 한두 번 만에 고유벡터를 얻는다. A−σI가 거의 특이해 연립방정식의 해가 크게 틀릴 것 같지만, 그 오차는 거의 전부 원하는 고유벡터 방향이라 정규화하면 해가 없다.
한 걸음 더 나가면 매 단계 σ를 지금의 가장 좋은 추정, 곧 레일리 몫으로 바꿀 수 있습니다. 이것이 레일리 몫 반복(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 (레일리 몫 반복의 수렴 차수)A가 대칭이고 RQI가 단순 고유값 λ로 수렴하면, 벡터 오차 ϵk=sinθk는 ϵk+1=O(ϵk3), 곧 3차 수렴한다. 비대칭이면 2차다.
아이디어. 역반복 한 번은 벡터 오차에 ∣λ−σ∣/∣λK−σ∣를 곱한다. 대칭이면 정리 14.2의 증명대로 레일리 몫의 오차 ∣λ−σ∣=O(ϵk2)이므로 ϵk+1=O(ϵk2)⋅ϵk=O(ϵk3). 비대칭이면 레일리 몫이 O(ϵk)만큼만 맞아서 2차가 된다. ∎
예제 14.3 (RQI 대 고정 이동 역반복)A=210131014(고유값 3−3,3,3+3=4.7320508), x0=(1,1,1)/3, ρ0=13/3=4.3333. 고정 이동 역반복은 σ=ρ0을 끝까지 쓴다.
k
RQI ρₖ
|ρₖ − λ|
고정 σ 역반복 ρₖ
|ρₖ − λ|
0
4.3333333333
3.99×10⁻¹
4.3333333333
3.99×10⁻¹
1
4.7074171797
2.46×10⁻²
4.7074171797
2.46×10⁻²
2
4.7320462724
4.54×10⁻⁶
4.7301260987
1.92×10⁻³
3
4.7320508076
< 10⁻¹⁵
4.7318836826
1.67×10⁻⁴
5
—
—
4.7320494803
1.33×10⁻⁶
고정 이동의 고유값 오차는 매번 약 0.089배로 준다. 벡터의 수렴비 ∣λ−σ∣/∣3−σ∣=0.399/1.333=0.299의 제곱(대칭이라 레일리 몫은 제곱 속도)이다.
RQI의 고유값 오차는 2.46×10−2 → 4.54×10−6 → 기계 정밀도. 4.54×10−6/(2.46×10−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고정 이동 역반복 (σ = ρ₀)거듭제곱법
k
RQI ρₖ
|Axₖ − ρₖxₖ|
추정 차수
고정 σ 잔차
해볼 것: ① 대칭 행렬에서 '추정 차수' 열(log rₖ₊₁ / log rₖ)이 3 근처로 나옵니다. 비대칭으로 바꾸면 2 근처입니다. ② 시작 벡터를 바꾸면 RQI가 다른 고유값으로 갈 수 있습니다. 어느 고유값으로 갈지는 시작점이 정하고, 그래서 실무에서는 역반복 몇 번으로 원하는 고유값 근처에 먼저 간 뒤 RQI로 마무리합니다. 모델: 비대칭 행렬은 [[2, 1, 0], [0.5, 3, 1], [0, 0.4, 4]]. 잔차가 10⁻¹⁴ 아래로 가면 멈춥니다.
게르시고린 원판: 계산 없이 고유값 가두기
반복을 시작하기 전에
이동량 σ를 고르려면 고유값이 대략 어디 있는지 알아야 합니다. 행렬이 양정치인지, 반복법이 수렴하는지(13장의 ρ(G)<1) 판단할 때도 마찬가지입니다. 원소만 보고 고유값의 위치를 가둘 수 있을까요?
정리 14.5 (게르시고린 원판 정리)n×n 복소 행렬 A의 각 행에 대해 게르시고린 원판(Gershgorin disc)
Di={z∈C:∣z−aii∣≤Ri},Ri=j=i∑∣aij∣
을 잡으면 모든 고유값은 D1∪⋯∪Dn 안에 있다. 또 원판 k개의 합집합이 나머지 원판과 떨어져 있으면, 그 합집합 안에는 고유값이 정확히 k개(중복도 포함) 있다. AT도 같은 고유값을 가지므로 열 합으로 만든 원판에도 같은 결론이 성립한다.
증명.Av=λv에서 ∣vi∣가 가장 큰 성분 i를 고르면 (λ−aii)vi=∑j=iaijvj이므로 ∣λ−aii∣≤∑j=i∣aij∣∣vj∣/∣vi∣≤Ri. 개수에 대한 주장은 A(t)=D+t(A−D)의 고유값이 t에 연속이라는 사실(원판이 t와 함께 커진다)에서 나온다. ∎
13장의 엄격한 대각 우세는 모든 원판이 원점을 포함하지 않는다는 뜻이고, 그래서 대각 우세 행렬은 가역입니다. 대각이 양수인 대칭 대각 우세 행렬은 모든 고유값이 양수, 곧 양정치입니다. 원판이 너무 크면 대각 닮음 변환 DAD−1(고유값은 같다)으로 i행의 비대각 원소를 di배, i열을 1/di배 해서 원하는 원판을 줄일 수 있습니다.
예제 14.4 (세 원판, 세 고유값)A=100.5114−2−10.5−3.
원판: D1은 중심 10, 반지름 2 → 실수축 [8,12]. D2는 중심 4, 반지름 1 → [3,5]. D3는 중심 −3, 반지름 3 → [−6,0].
세 원판이 서로 떨어져 있으므로 각 원판에 고유값이 하나씩 있다. 복소 고유값은 켤레 쌍으로 나와야 하는데 원판마다 하나뿐이니 셋 다 실수다.
실제 고유값은 10.0250, 3.7297, −2.7547로 각 원판 안에 있다. 행렬이 가역이고(0은 D3의 경계에 있지만 고유값 −2.75는 0이 아니다), σ=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을 찾았다면 다음 고유값은 어떻게 찾을까요? 찾은 것을 행렬에서 "치워" 두 번째 것이 가장 크게 만드는 과정을 수축(deflation)이라 합니다.
정의 14.6 (호텔링 수축과 비란트 수축)
호텔링(대칭 A, ∥v1∥=1): A1=A−λ1v1v1T. 고유벡터는 그대로이고 λ1만 0으로 바뀐다(나머지 고유벡터가 v1과 직교하므로).
비란트(일반 A): uTv1=1인 u로 A1=A−λ1v1uT. 고유값 λ1만 0이 되고 나머지 고유값은 유지된다.
직교 닮음 수축: v1을 첫 열로 하는 직교 행렬 Q(하우스홀더 반사)로 QTAQ=[λ10wTA2]. 나머지 고유값은 (n−1)차 행렬 A2의 고유값이다.
예를 들어 A=[2112]에서 λ1=3, v1=(1,1)/2이면 A1=A−3v1v1T=[0.5−0.5−0.50.5]이고, 고유값은 0과 1입니다. 남은 고유값 1을 거듭제곱법으로 바로 얻습니다.
주의: 오차가 쌓인다v1이 10−6만큼 틀리면 A1에 크기 λ1⋅10−6 정도의 오차가 섞이고, 이 오차는 다음 고유값들에 그대로 넘어갑니다. 고유값을 여러 개 수축으로 구하면 뒤로 갈수록 정확도가 떨어지므로, 명시적 수축은 고유값 몇 개만 필요할 때 씁니다. QR 알고리즘의 수축은 이와 달리 대각 아래 원소가 반올림 수준이 되었을 때 행렬을 블록으로 자르는 것이라 정확도를 잃지 않습니다.
QR 알고리즘: 모든 고유값을 한꺼번에
eig(A)는 실제로 무엇을 하는가
LinearBook(수치 선형대수)에서 이동 없는 QR 알고리즘 Ak=QkRk, Ak+1=RkQk가 대각 아래를 ∣λi+1/λi∣k로 지운다는 것을 보았습니다. 그런데 가까운 고유값이 있으면 수백 번이 걸리고, 한 번에 O(n3)이 듭니다. 라이브러리는 어떻게 n=1000짜리를 1초 안에 푸는 걸까요?
먼저 기본 성질입니다. Rk=QkTAk이므로 Ak+1=QkTAkQk, 직교 닮음이라 고유값이 보존됩니다. 그리고 Qˉk=Q0Q1⋯Qk−1의 열들은 Ak의 열에 그람–슈미트를 한 결과와 같습니다. 곧 QR 알고리즘(QR algorithm)은 n개 벡터에 거듭제곱법을 동시에 하며 서로 직교하게 유지하는 동시 반복입니다. 실용 알고리즘은 여기에 세 가지를 더합니다.
정리 14.7 (헤센베르크 축소) 모든 정사각 행렬은 하우스홀더 반사 n−2개의 직교 닮음으로 헤센베르크 행렬(Hessenberg matrix), 곧 i>j+1이면 hij=0인 꼴로 바뀐다(약 310n3 flop). 대칭이면 결과는 삼중대각이다. QR 단계는 헤센베르크 꼴을 보존하고, 헤센베르크 행렬의 QR 단계는 기븐스 회전 n−1개로 O(n2)(삼중대각이면 O(n))에 끝난다.
왜 삼각이 아니라 헤센베르크인가. 반사 H1로 첫 열의 둘째 원소 아래를 지우면 H1A의 첫 열은 좋지만, 닮음을 위해 오른쪽에서 H1을 곱하면 첫 열이 다시 채워진다. 반사가 둘째 행부터만 건드리게 하면(H1=diag(1,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=QkRk, Ak+1=RkQk+μkI는 여전히 닮음 변환이고, 마지막 대각 아래 원소는 대략 ∣λn−μ∣/∣λn−1−μ∣의 비율로 줄어듭니다. 역반복과 똑같은 구조입니다. 실제로 이동 QR의 마지막 행은 en에 이동 역반복을 하는 것과 같습니다. μ=hnn(레일리 이동)을 쓰면 RQI처럼 2차(대칭이면 3차) 수렴합니다. 레일리 이동은 대칭적인 경우에 막힐 수 있어서, 오른쪽 아래 2 × 2 블록의 고유값 중 hnn에 가까운 것을 쓰는 윌킨슨 이동(Wilkinson shift)이 표준이며, 대칭 삼중대각 행렬에서는 항상 수렴함이 증명되어 있습니다. 세 번째 열쇠는 수축입니다. hm,m−1이 반올림 수준이 되면 잘라 내고 (m−1)차로 계속합니다.
QR 단계 수 (수축 허용 10⁻¹⁴)
이동 없음
레일리 이동
윌킨슨 이동
대칭 6 × 6, 고유값 1 … 6
160
18
11
대칭, 가까운 고유값 3, 2.9, …
831
18
11
비대칭 6 × 6, 실수 고유값
129
19
15
반대각 4 × 4 (고유값 ±1)
멈춤
멈춤
3
표의 마지막 줄이 윌킨슨 이동이 필요한 이유입니다. 반대각 행렬은 hnn=0이고 고유값 ±1이 0에서 같은 거리에 있어, 이동이 없거나 레일리 이동이면 QR 단계가 행렬을 전혀 바꾸지 못합니다. 고유값이 고유값 하나당 평균 두세 단계 만에 확정되므로 전체 비용은 축소 비용이 지배하고, 비대칭 행렬의 고유값 전부가 약 10n3 flop, 대칭이면 약 34n3 flop에 나옵니다. 실수 비대칭 행렬의 복소 고유값 쌍은 켤레 이동 두 개를 실수 연산으로 한 번에 적용하는 프랜시스의 이중 이동으로 처리하며, 결과는 대각에 2 × 2 블록이 남는 실수 슈르 꼴입니다.
SIMULATOR
QR 반복 히트맵: 대각 아래가 사라지는 속도
log₁₀|aᵢⱼ| (밝을수록 큼)
log₁₀|aᵢ₊₁,ᵢ| vs 단계
이동
단계 k0
활성 블록 크기 m—
확정된 고유값—
이동 μ—
해볼 것: ① '이동 없음'에서 10단계씩 누르면 대각 아래가 위에서부터 천천히 어두워집니다. 비율 |λᵢ₊₁/λᵢ|가 1에 가까운 칸이 가장 늦습니다. ② '윌킨슨'으로 바꾸면 오른쪽 아래 원소가 두세 단계 만에 10⁻¹⁵ 아래로 떨어지고, 수축이 일어나 활성 블록(노란 테두리)이 한 칸씩 줄어듭니다. ③ '반대각'에서 이동 없음·레일리는 아무리 눌러도 변화가 없습니다. ④ 헤센베르크 축소를 끄면 처음 행렬이 꽉 차 있지만, QR 단계는 결국 같은 고유값을 냅니다(단지 단계마다 O(n³)). 모델: 활성 블록에 그람–슈미트 QR, 수축 기준 |aₘ,ₘ₋₁| ≤ 10⁻¹⁴(|aₘₘ| + |aₘ₋₁,ₘ₋₁|).
대칭 행렬과 야코비 회전
대칭 행렬에는 훨씬 오래된, 그리고 지금도 쓰이는 방법이 있습니다. 비대각 원소 하나 apq를 골라, p,q 좌표 평면의 회전 J로 JTAJ의 (p,q) 원소를 0으로 만듭니다. 2 × 2 대칭 행렬을 대각화하는 회전각은 언제나 있습니다.
만큼 정확히 준다. 가장 큰 ∣apq∣를 고르는 고전 야코비에서는 off(A′)2≤(1−n(n−1)2)off(A)2이라 선형 수렴이 보장되고, 모든 (p,q)를 차례로 도는 순환 야코비는 몇 번의 스윕 뒤 2차 수렴한다.
아이디어. 직교 닮음은 프로베니우스 노름을 보존하고, p,q 행·열 밖의 원소의 제곱합은 회전 전후가 같다. 그런데 2×2 블록에서 비대각 apq2의 두 배만큼이 대각 app2+aqq2으로 옮겨 간다. 다른 0이었던 원소는 회전으로 다시 0이 아닐 수 있지만 전체 off는 줄기만 한다. t를 절댓값이 작은 근으로 고르면 회전각이 ∣ϕ∣≤π/4라 수치적으로 안정하다. ∎
예제 14.5 (회전 한 번)A=412130201, off(A)2=2(1+4+0)=10. 가장 큰 비대각 a13=2를 지운다.
계속하면 고유값 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⋯으로 저절로 나옵니다. 엔진의 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×n 행렬 A의 특이값 σi는 ATA의 고유값의 제곱근입니다(LinearBook: SVD). 그렇다고 ATA를 만들어 고유값을 구하면 안 됩니다. 조건수가 제곱되기 때문입니다.
저장된 ATA=[1111]의 고유값은 2와 0, 따라서 작은 특이값이 정확히 0으로 나온다. 정보가 완전히 사라졌다.
A에 직접 직교 변환을 쓰는 방법은 σ2를 상대 정확도 10−8 수준 이상으로 얻는다.
표준 알고리즘(골럽–카한)은 A의 왼쪽과 오른쪽에 서로 다른 하우스홀더 반사를 번갈아 곱해 이중대각 행렬 B=U1TAV1을 만들고(O(mn2)), B에 BTB를 만들지 않은 채 암묵적 이동 QR을 적용합니다. ATA에 대한 대칭 QR 알고리즘을 A 자체에서 흉내 내는 것입니다. 한쪽 야코비 회전으로 A의 열을 서로 직교하게 만드는 방법도 쓰입니다.
정리 14.9 (에카르트–영, 최적 저계수 근사)A=∑iσiuiviT일 때 Ak=∑i≤kσiuiviT은 계수 k 이하 행렬 중 A에 가장 가깝고, ∥A−Ak∥2=σk+1, ∥A−Ak∥F=σk+12+⋯이다.
예를 들어 5 × 5 힐베르트 행렬 hij=1/(i+j−1)의 특이값은 1.567, 0.2085, 0.01141, 3.06×10⁻⁴, 3.29×10⁻⁶입니다. 계수 2의 근사도 2-노름 오차 0.0114, 곧 ∥A∥2의 0.7%로 맞습니다. 특이값이 빨리 줄어드는 행렬은 적은 수의 벡터로 압축되며, 이것이 영상 압축, 추천 시스템, 주성분 분석의 수학입니다. 아주 큰 행렬에서는 무작위 벡터 k+10개 정도에 A를 곱해 치역을 근사한 뒤 작은 SVD를 하는 무작위 SVD가 쓰입니다.
응용: 페이지랭크, 진동 모드, 에너지 준위
링크만 보고 중요한 페이지 고르기
웹 페이지 n개와 그 사이의 링크가 있습니다. "중요한 페이지가 많이 가리키는 페이지가 중요하다"는 순환 정의를 어떻게 숫자로 만들까요? 무작위로 링크를 따라 떠도는 사람이 오래 머문 뒤 각 페이지에 있을 확률로 정의하면, 그 확률 벡터는 전이 행렬의 고유값 1에 대한 고유벡터입니다.
페이지 j에서 나가는 링크가 dj개면 Pij=1/dj(j→i 링크가 있을 때). 나가는 링크가 없는 페이지는 모든 페이지로 균등하게 간다고 둡니다. 서퍼는 확률 α(감쇠 인자, 보통 0.85)로 링크를 따르고 1−α로 아무 페이지로나 순간 이동합니다.
G=αP+n1−α11T,Gr=r,i∑ri=1.
G는 열 합이 1인 양의 행렬이라 페론–프로베니우스 정리에 의해 가장 큰 고유값 1이 단순하고 고유벡터가 양수다. 둘째 고유값은 ∣λ2∣≤α이므로 거듭제곱법의 오차는 매번 α배 이하로 준다.
G는 꽉 찬 행렬이지만 만들 필요가 없습니다. Gr=αPr+n1−α1(∑ri=1일 때)이므로 희소 행렬 P와의 곱 한 번이면 됩니다. α=0.85이면 0.85k=10−8에서 k≈113번, 웹 전체 규모에서도 같은 횟수입니다.
한 번: r1=0.0375+0.85(0.25+0.125)=0.3563, r2=0.0375+0.85⋅0.125=0.1437, r3=0.0375+0.85(0.125+0.25+0.125)=0.4625, r4=0.0375.
수렴값은 r=(0.3797,0.1989,0.3839,0.0375). 아무도 가리키지 않는 페이지 4는 순간 이동 몫 0.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₀ = 균등.
진동 모드. 질량 m인 물체 n개를 강성 k인 용수철로 일렬로 잇고 양 끝을 고정하면 운동 방정식은 Mx¨=−Kx, K=ktridiag(−1,2,−1)이고, x=vcosωt를 넣으면 Kv=ω2Mv, 곧 일반화 고유값 문제입니다. 이 사슬에서는 ωj2=mk(2−2cosn+1jπ)를 정확히 알지만, 실제 구조물의 유한 요소 모델은 크기가 수십만이고 필요한 것은 가장 낮은 진동수 몇십 개입니다. 그래서 σ=0 근처의 이동 역반복을 크릴로프 공간과 결합한 이동–역 란초시 방법(ARPACK, MATLAB eigs)이 쓰입니다(LinearBook: 고유값).
주성분 분석. 데이터 행렬의 공분산 C=XTX/(N−1)의 가장 큰 고유벡터들이 데이터가 가장 많이 퍼진 방향입니다(LinearBook: PCA). 수치적으로는 예제 14.6의 교훈대로 C를 만들지 않고 중심화한 X의 SVD를 구합니다.
양자 에너지 준위. 1차원 조화 진동자 −21ψ′′+21x2ψ=Eψ(단위를 골라 정확한 준위는 Ej=j+21)를 2배 하여 −ψ′′+x2ψ=2Eψ로 쓰고, [−6,6]을 n개 내부점으로 나눠 2차 중앙 차분을 쓰면 대칭 삼중대각 행렬의 고유값 문제가 됩니다. 2E의 정확한 값 1, 3, 5, 7, …과 비교하면
n (격자 간격 h)
2E₀ (참 1)
2E₁ (3)
2E₂ (5)
2E₃ (7)
2E₉ (19)
50 (0.235)
0.99653
2.98259
4.95459
6.91237
18.35113
100 (0.119)
0.99912
2.99558
4.98850
6.97787
18.83902
200 (0.060)
0.99978
2.99889
4.99710
6.99443
18.95969
400 (0.030)
0.99994
2.99972
4.99927
6.99860
18.98996
바닥 상태의 오차는 0.00347, 0.00088, 0.00022, 0.00006으로 h가 반이 될 때마다 1/4, 곧 차분의 O(h2)를 그대로 따릅니다. 높은 준위일수록 파동 함수가 빨리 진동해 같은 격자에서 오차가 큽니다. 고유값 계산은 스투름 수열을 쓴 이분법(삼중대각 대칭 행렬에서 λ보다 작은 고유값의 수를 O(n)에 센다)으로 했습니다.
원판은 중심 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²)에 할 수 있다. 축소는 한 번만 310n3이 든다. 유한 단계의 삼각화는 근의 공식이 없으므로 불가능하다.
Q6. 대칭 행렬에서 apq=3을 야코비 회전으로 지웠다. off(A)2은 얼마나 주는가?
off(A′)2=off(A)2−2apq2=off(A)2−18. apq와 aqp 두 칸의 제곱이 대각으로 옮겨 간다. 다른 칸이 다시 채워져도 전체는 정확히 이만큼 준다.
Q7. 행렬 A의 특이값을 구하려고 ATA의 고유값을 계산하는 것의 문제는?
κ(ATA)=κ(A)2. σ=10−8이면 σ2=10−16이 1과 더해지는 순간 사라진다(예제 14.6). 표준 방법은 A 자체를 이중대각화한다.
Q8. 감쇠 인자 α = 0.9인 페이지랭크를 거듭제곱법으로 오차 10−6까지 구하려면 대략 몇 번 곱해야 하는가?
∣λ2∣≤α이므로 0.9k=10−6, k=6/0.0458≈131. 횟수는 그래프 크기와 무관하고, 한 번의 비용만 링크 수에 비례한다.