슈어-파레 방법

오류 제보
수치해석 계산물리 마지막 수정: 2026-08-24 04:51:19

○ 공개 검수 대기 표시 기준 보기

1. 개요

슈어-파레 방법
Schur–Parlett algorithm
목적일반 f 에 대한 행렬함수 f(A) 계산
1단계슈어 분해 A = QTQH
2단계상삼각 T 에 파레 점화식 (Parlett, 1974)
급소분모 tii − tjj — 가까운 고유값
현대 처방데이비스-하이엄(2003) 블록화 + 블록 내부 테일러
구현MATLAB funm · 비용 ≈ 28n³ flops (블록이 작을 때)

eAe^{A} 를 구하는 방법은 열아홉 가지쯤 알려져 있다. 그런데 ff 가 아무거나일 때는?

슈어-파레 방법(Schur–Parlett algorithm)은 정사각행렬 AA 와 임의의 스칼라 함수 ff 에 대해 행렬함수 f(A)f(A) 를 계산하는 범용 알고리즘이다. 뼈대는 두 줄로 요약된다.

A=QTQH  ⟹  f(A)=Q f(T) QHA = QTQ^{H} \;\Longrightarrow\; f(A) = Q\,f(T)\,Q^{H}

즉 슈어 분해로 문제를 상삼각행렬의 함수로 환원한 뒤, f(T)f(T) 를 파레 점화식으로 채운다. 이 경로를 고르는 이유는 명확하다 — 유니터리 변환은 조건수가 1이라 오차를 증폭하지 않고, 조르당 표준형과 달리 결함 행렬에서도 안전하게 계산되며, 무엇보다 ff 가 무엇인지 묻지 않는다.

eAe^{A} 에는 스케일링-제곱, log⁡A\log A 에는 역스케일링-제곱, A1/2A^{1/2} 에는 뵈르크-함마를링 같은 전용 알고리즘이 있고 그쪽이 항상 더 낫다. 슈어-파레는 전용 알고리즘이 없는 나머지 전부를 담당하는 최후의 보루다. cos⁡A\cos A, sinc⁡(A)\operatorname{sinc}(A), 지수 적분기의 φk\varphi_{k}, 사용자가 방금 정의한 이상한 ff — 이런 것들을 계산할 수 있는 유일한 일반 절차다.

2. 파레 점화식

F=f(T)F = f(T) 도 상삼각이고, 행렬함수의 기본 성질에 따라 FF 는 TT 와 교환한다.

FT=TFFT = TF

이 한 줄이 알고리즘 전부다. 대각 원소는 fii=f(tii)f_{ii} = f(t_{ii}) 로 즉시 나오고, (i,j)(i,j) 성분 (i<ji<j)에서 위 등식을 풀어 쓰면

fij=tij (fii−fjj)+∑k=i+1j−1(fiktkj−tikfkj)tii−tjjf_{ij} = \frac{t_{ij}\,(f_{ii} - f_{jj}) + \displaystyle\sum_{k=i+1}^{j-1}\big(f_{ik}t_{kj} - t_{ik}f_{kj}\big)}{t_{ii} - t_{jj}}

가 된다(파레, 1974). 우변에 등장하는 fik,fkjf_{ik}, f_{kj} 는 전부 (i,j)(i,j) 보다 더 짧은 대각선 위의 성분이므로, 주대각에서 시작해 첫 번째 초대각선, 두 번째 초대각선, … 순서로 한 겹씩 채워 나가면 된다. 비용은 2n3/32n^{3}/3 flops 정도로 슈어 분해(≈25n3\approx 25n^{3})에 비하면 거저다.

이론적으로는 여기서 끝이다. 실제로는 여기서 시작이다.

3. 급소 — 분모가 죽는다

문제는 분모 tii−tjjt_{ii} - t_{jj} 다. 두 고유값이 가까우면 이 값이 0에 접근하고 점화식이 폭발한다. 고유값이 정확히 중복이면 아예 0으로 나누기다.

여기서 짚어야 할 것은, 분모가 작다는 사실이 문제 자체가 나쁘다는 뜻이 아니라는 점이다. A=[1101+ϵ]A = \begin{bmatrix}1 & 1\\ 0 & 1+\epsilon\end{bmatrix} 의 f(A)f(A) 는 ϵ→0\epsilon \to 0 에서 멀쩡히 수렴한다 — 분자의 f(t11)−f(t22)f(t_{11})-f(t_{22}) 도 함께 0으로 가서 극한이 f′(1)f'(1) 이 되기 때문이다. 즉 참값은 잘 정의되어 있는데 계산 경로가 0/0 을 통과하도록 짜여 있는 상황이고, 이것은 전형적인 자리수 상쇄다. 부동소수점에서는 분자의 유효숫자가 이미 대부분 날아간 뒤 작은 수로 나누므로 상대오차가 그대로 증폭된다.

게다가 이 오염은 국소적이지 않다. 한 성분이 오염되면 그 값이 뒤이은 대각선의 합에 들어가 오른쪽 위로 계속 번진다. 삼각행렬의 왼쪽 아래에서 시작된 작은 실수가 우상단 구석에서 자리수 전체를 잡아먹는 그림이 나온다.

4. 데이비스-하이엄의 블록화

현대 처방은 데이비스와 하이엄(2003)의 것이다. 발상은 단순하다 — 가까운 고유값끼리는 갈라놓지 말고 한 블록에 몰아넣고, 블록 안은 점화식 대신 다른 방법으로 처리한다.

① 고유값 군집화. TT 의 대각 원소를 분리 파라미터 δ\delta(기본값 0.10.1)로 묶는다. ∣tii−tjj∣≤δ|t_{ii} - t_{jj}| \le \delta 이면 같은 군집으로 보내고, 이 관계를 연쇄적으로 확장한다(사슬처럼 이어지면 한 군집). 결과적으로 서로 다른 군집의 고유값은 δ\delta 이상 떨어져 있고, 같은 군집 안은 가까울 수도 있다.

② 순서화 슈어 분해. 같은 군집의 고유값이 대각에서 연속으로 붙어 있도록 TT 를 재정렬한다. 인접 블록을 맞바꾸는 유니터리 상사변환을 버블 정렬하듯 반복하는 표준 연산이고(LAPACK dtrsen), 이 단계 자체는 후진 안정하다.

③ 대각 블록은 테일러로. 블록 TiiT_{ii} 의 고유값은 전부 반경 δ\delta 안에 모여 있으므로, 중심 σ=tr⁡(Tii)/mi\sigma = \operatorname{tr}(T_{ii})/m_{i} 를 빼면 Tii−σIT_{ii} - \sigma I 의 노름이 작다. 그래서

f(Tii)=∑k≥0f(k)(σ)k! (Tii−σI)kf(T_{ii}) = \sum_{k\ge 0} \frac{f^{(k)}(\sigma)}{k!}\,(T_{ii} - \sigma I)^{k}

테일러 급수를 직접 평가한다. 점화식을 아예 쓰지 않으므로 분모 문제가 사라진다.

④ 블록 사이는 실베스터 방정식으로. 블록 단위로 다시 쓴 파레 점화식은

TiiFij−FijTjj=FiiTij−TijFjj+∑k=i+1j−1(FikTkj−TikFkj)T_{ii}F_{ij} - F_{ij}T_{jj} = F_{ii}T_{ij} - T_{ij}F_{jj} + \sum_{k=i+1}^{j-1}\big(F_{ik}T_{kj} - T_{ik}F_{kj}\big)

이라는 실베스터 방정식 이 된다. 이 방정식은 TiiT_{ii} 와 TjjT_{jj} 가 공통 고유값을 갖지 않을 때 유일해를 가지며, 해의 민감도는 두 스펙트럼 사이의 분리도 sep⁡(Tii,Tjj)\operatorname{sep}(T_{ii}, T_{jj}) 가 결정한다. ①에서 군집을 δ\delta 만큼 떼어 놓은 것이 정확히 이 sep⁡\operatorname{sep} 을 확보하기 위한 조치였다. 양변이 이미 삼각이므로 크로네커 곱을 만들 필요 없이 블록 후진대입으로 푼다.

δ\delta 는 두 오차 사이의 저울이다. 키우면 군집이 커져 블록 크기가 늘고 ∥Tii−σI∥\|T_{ii}-\sigma I\| 가 커져 테일러가 나빠진다. 줄이면 블록은 작아지지만 sep⁡\operatorname{sep} 이 작아져 실베스터 풀이가 나빠진다. δ=0.1\delta = 0.1 은 실험적으로 잡은 타협점이지 이론적 최적값이 아니다.1

5. 비용과 한계

블록이 전부 1×11\times1 로 갈라지는 좋은 경우 총 비용은 ≈28n3\approx 28n^{3} flops — 슈어 분해 25n325n^{3} + 점화식 2n3/32n^{3}/3 + 잡비. 대각화 가능하고 고유값이 잘 흩어진 행렬에서는 ff 가 무엇이든 이 값이다.

문제는 군집이 커질 때다. 극단적으로 모든 고유값이 한 점에 몰린 행렬(예: 단일 조르당 블록)이면 군집이 하나, 블록이 n×nn\times n 이 되어 n×nn\times n 행렬의 테일러 급수를 통째로 돌려야 한다. 비용이 n4n^{4} 급으로 뛰고, ∥T−σI∥\|T-\sigma I\| 가 크면 급수 수렴도 느려지고 정확도도 떨어진다. 비정규성이 강한 행렬이 슈어-파레의 진짜 적이라는 뜻이다.

실무적 제약이 하나 더 있다. ff 의 고차 도함수를 사용자가 제공해야 한다. MATLAB funm(A, fun) 은 fun(x,k) 형태로 kk 차 도함수를 요구하며, 이걸 손으로 못 넣으면 알고리즘이 성립하지 않는다.2 이 불편을 없애려는 시도가 근래의 다중정밀도 무도함수(derivative-free) 변형으로, 대각 블록을 고정밀 산술에서 처리해 도함수 요구를 우회한다.

정확도 목표도 겸손하게 잡혀 있다. 일반 ff 에 대해 후진 안정한 알고리즘은 알려져 있지 않고 존재 여부도 불분명하다. 데이비스-하이엄이 내건 목표는 “전진 오차가 문제의 조건수에 비례하는 수준” — 즉 ∥F^−f(A)∥≲cond⁡(f,A) u ∥f(A)∥\|\hat F - f(A)\| \lesssim \operatorname{cond}(f,A)\,u\,\|f(A)\| 이고, 이것이 이 분야에서 현실적으로 요구할 수 있는 최선이다.

6. 조건수와 프레셰 도함수

“이 답을 몇 자리까지 믿어도 되는가”에 답하려면 행렬함수의 프레셰 도함수 Lf(A,E)L_{f}(A,E) 가 필요하다. 상대 조건수는

κf(A)=∥Lf(A)∥ ∥A∥∥f(A)∥,∥Lf(A)∥=max⁡E≠0∥Lf(A,E)∥∥E∥\kappa_{f}(A) = \frac{\|L_{f}(A)\|\,\|A\|}{\|f(A)\|}, \qquad \|L_{f}(A)\| = \max_{E\ne 0}\frac{\|L_{f}(A,E)\|}{\|E\|}

이고, 이 값이 101010^{10} 이면 배정도로는 여섯 자리쯤만 살아남는 것이 정상이다. 알고리즘을 의심하기 전에 이 숫자부터 봐야 한다.

계산에는 크기 2n2n 짜리 블록 삼각 항등식이 유용하다.

f ⁣([AE0A])=[f(A)Lf(A,E)0f(A)]f\!\left(\begin{bmatrix} A & E \\ 0 & A\end{bmatrix}\right) = \begin{bmatrix} f(A) & L_{f}(A,E) \\ 0 & f(A)\end{bmatrix}

즉 ff 를 계산할 수 있으면 프레셰 도함수도 같은 루틴 한 번 더로 얻는다. 여기에 유도 노름 추정을 위한 하이엄-티슬 1-노름 거듭제곱법을 얹어 κf\kappa_{f} 를 추정하는 것이 funm_condest1 이 하는 일이다. 다만 이 2n×2n2n\times2n 행렬은 고유값이 정확히 중복(AA 의 스펙트럼이 두 번)이므로, 슈어-파레로 처리하면 반드시 큰 블록이 생긴다 — 조건수 추정이 원래 계산보다 비싸고 까다로운 이유다.

7. 언제 쓰고 언제 피하는가

  • 쓴다. ff 가 전용 알고리즘이 없는 함수일 때. 삼각함수, φ\varphi 함수, 사용자 정의 해석함수, 분수 거듭제곱의 일반형 등. 행렬이 정규에 가깝고 고유값이 흩어져 있으면 특히 잘 맞는다.
  • 피한다. ff 가 exp⁡\exp, log⁡\log, ⋅\sqrt{\cdot}, sign⁡\operatorname{sign} 중 하나라면 전용 알고리즘이 언제나 낫다. 행렬 지수함수의 스케일링-제곱은 후진 오차 해석까지 갖춰져 있고, 행렬 로그의 슈어-파데 역스케일링-제곱, 행렬 제곱근의 뵈르크-함마를링, 행렬 부호 함수의 뉴턴 반복이 각각 그렇다.
  • 아예 다른 문제로 바꾼다. AA 가 대형 희소행렬이면 슈어 분해 자체가 불가능하다(O(n3)O(n^{3}) 시간, O(n2)O(n^{2}) 저장, 게다가 f(A)f(A) 는 조밀). 이때 필요한 것은 대개 f(A)bf(A)b 하나이므로 크리로프 부분공간법이나 등고선 적분으로 갈아탄다. 슈어-파레는 어디까지나 조밀·중소형 알고리즘이다.

이름이 붙은 두 사람 중 파레(Beresford Parlett)는 대칭 고유값 문제의 교과서로 더 유명하고, 이 점화식은 1974년의 짧은 논문에서 나왔다. 슈어는 1909년에 분해를 증명했을 뿐 행렬함수와는 무관했다 — 65년 시차의 두 결과가 한 알고리즘 이름으로 묶인 셈이다.3

8. 관련 문서

9. Footnotes

  1. 이런 상수는 논문의 표에 딱 한 줄 나오고 마는데, 실제로는 알고리즘의 성패를 좌우한다. δ\delta 를 바꿔 가며 같은 행렬을 돌려 보면 오차가 U자 곡선을 그리는 것이 보인다. “기본값을 건드리지 마세요”라는 조언이 대개 옳지만, 왜 그 값인지는 알고 있는 편이 좋다. ↩

  2. 도함수를 넘겨야 한다는 요구는 생각보다 자주 사람을 막는다. ff 가 스플라인 보간이거나 다른 코드가 뱉어 주는 블랙박스면 kk 차 도함수라는 물건이 애초에 없다. 그럴 때 “수치미분으로 대충 넣자”는 유혹이 오는데, 테일러 급수의 고차 계수를 유한차분으로 만들면 상쇄오차가 그대로 답에 들어가므로 대개 안 하느니만 못하다. ↩

  3. 파레의 점화식은 원래 “행렬함수를 삼각화해서 구하자”는 발상 자체가 새롭던 시절의 것이라, 논문에서 이미 “가까운 고유값이 있으면 곤란하다”고 스스로 경고하고 블록 버전까지 제시해 뒀다. 문제를 아는 것과 실용적으로 해결하는 것 사이에 30년이 걸렸다는 점이, 수치해석에서 “아이디어는 절반도 아니다”라는 말의 좋은 예시다. ↩

이 문서가 문제를 푸는 데 도움이 됐나요? 한 번의 클릭이 다음 검수 순서를 정합니다.

의견을 반영할게요. 감사합니다.

다음으로 읽기 조건수 약 5분 더 탐색 →