コンテンツにスキップ

固有値の計算 II:QR 法の収束・Hessenberg 化・陰的 Q の定理とシフト

対象読者: 本テーマの冪乗法・同時反復の章、QR 分解、LU 分解の章を学んだ人。Hessenberg 行列と Schur 形はこの章の中で導入するので仮定しません。

前提となる記事:固有値の計算 I:冪乗法・逆反復・Rayleigh 商反復と同時反復、QR 分解:Householder 変換・Givens 回転・Gram–Schmidt の安定性、Gauss 消去と LU 分解:ピボット選択・成長因子・後退誤差解析

生 Markdown

行列の固有値(行列を掛けても向きが変わらないベクトルに対する倍率)を、計算機でまとめて求めるにはどうすればよいか、という話です。ここで扱う QR 法は、「行列を 2 つの行列の積に分け、順序を入れ替えて掛け直す」という操作を繰り返すだけの方法で、続けるうちに対角に固有値が並びます。なぜこの単純な操作で固有値が出るのか、どうすれば速く正確にできるのかを、この記事で順に確かめます。読み終えると、numpy などの固有値計算の中身で何が起きているかが説明できるようになります。

  • QR 法は、Ak−1=QkRkA_{k-1} = Q_kR_k と分解して Ak=RkQkA_k = R_kQ_k と掛け直すだけの反復です。Ak=QkTAk−1QkA_k = Q_k^{\mathsf{T}}A_{k-1}Q_k なので固有値は変わらず、AkA_k は上三角行列(Schur 形。対角より下がすべて 00 で、対角に固有値が並ぶ形)に近づいていきます。
  • 掛け合わせた直交行列 Qk=Q1⋯Qk\mathbf{Q}_k = Q_1\cdots Q_k は AkA^k の QR 分解の QQ で、単位行列から始めた**同時反復**そのものです。このため冪乗法の章の同時反復の収束がそのまま QR 法の収束になります。
  • ∣λ1∣>⋯>∣λn∣>0|\lambda_1| > \cdots > |\lambda_n| > 0 で固有ベクトル行列の逆が LU 分解をもてば、AkA_k の対角より下は O(rk)O(r^k)(r=max⁡j∣λj+1/λj∣r = \max_j|\lambda_{j+1}/\lambda_j|)で 00 に、対角は固有値に収束します。
  • 実用の QR 法は、最初に Householder 変換で Hessenberg 形(対角のすぐ下の斜めの列までにしか成分がない形)に直し(10n3/310n^3/3 回の演算)、Hessenberg 形を保ったまま 1 回 O(n2)O(n^2) で反復します。陰的 Q の定理により、Hessenberg 形への直交相似は第 1 列だけで決まります。
  • シフト μk=(Ak−1)nn\mu_k = (A_{k-1})_{nn} をとると、Qk\mathbf{Q}_k の最後の列は Rayleigh 商反復そのものになり、対称行列では最下行の非対角成分が 1 回ごとにほぼ 3 乗で 00 に近づきます。∣hk+1,k∣|h_{k+1,k}| を単位丸め(計算機の丸め誤差の相対的な大きさ)程度で 00 とみなすデフレーション(そこで行列を小さい 2 つに切り分けること)は、∥A∥\|A\| に対して単位丸め程度の後退誤差(答えを、元の問題をほんの少し変えた問題の厳密な答えとみなしたときの、その変化の大きさ)です。

冪乗法・逆反復の章 の方法は、固有値を 1 つずつ、あるいは上位の数個を求めるものでした。密行列のすべての固有値を求める標準的な算法は QR 法で、numpy.linalg.eig・scipy.linalg.eigvals(LAPACK の geev)も、対称行列の eigh(syev 系)も、Hessenberg 化(対称なら三重対角化)のあとに QR 法か、同じ三重対角形の上に立つ後継の算法(分割統治法など)を使っています。

QR 法は 1961 年に Francis と Kublanovskaya が独立に発表しました。算法の記述は 1 行ですが、なぜ収束するのかは一見わかりません。本章の主題は、QR 法が「すべての固有ベクトルについて同時に冪乗法を行い、互いに直交させ続ける」算法であることを示し、そこから収束・計算の工夫(Hessenberg 化)・加速(シフト)を順に導くことです。

この章では行列はすべて実行列とし、直交行列・転置で書きます。QR 分解の章 の一意性(定理 4.1[QR 分解] の 2。列が一次独立なら、RR の対角を正にした QR 分解はただ 1 つ)を何度も使います。複素行列でもユニタリ行列に置き換えれば同じ議論が成り立ちます。ノルムは 2 ノルム ∥⋅∥2\|\cdot\|_2 と Frobenius ノルム ∥⋅∥F\|\cdot\|_F を使い、∥BC∥F≤∥B∥2∥C∥F\|BC\|_F \le \|B\|_2\|C\|_F(CC の各列に BB を掛けて評価すればよい)、それを転置した ∥CB∥F≤∥C∥F∥B∥2\|CB\|_F \le \|C\|_F\|B\|_2(∥BT∥2=∥B∥2\|B^{\mathsf{T}}\|_2 = \|B\|_2、命題 4.2[行列のノルムと線形方程式の条件数] の 3)と、直交行列 QQ について ∥QC∥F=∥C∥F\|QC\|_F = \|C\|_F、∥QC∥2=∥C∥2\|QC\|_2 = \|C\|_2 を断りなく使います。

定義 2.1(QR 法(シフトなし))↗

A∈Rn×nA \in \mathbb{R}^{n\times n} を正則とする。A0=AA_0 = A とし、k=1,2,…k = 1, 2, \ldots について、Ak−1A_{k-1} の QR 分解 Ak−1=QkRkA_{k-1} = Q_kR_k(QkQ_k は直交行列、RkR_k は対角成分が正の上三角行列)をとり、

Ak=RkQkA_k = R_kQ_k

とする。Qk=Q1Q2⋯Qk\mathbf{Q}_k = Q_1Q_2\cdots Q_k、Rk=RkRk−1⋯R1\mathbf{R}_k = R_kR_{k-1}\cdots R_1 とおく(Q0=R0=I\mathbf{Q}_0 = \mathbf{R}_0 = I)。

命題 2.2(QR 反復は直交相似変換である)✓

Ak=QkTAk−1Qk=QkTAQkA_k = Q_k^{\mathsf{T}}A_{k-1}Q_k = \mathbf{Q}_k^{\mathsf{T}}A\mathbf{Q}_k である。とくに AkA_k はすべて正則で、AA と同じ固有値(重複度を込めて)をもつ。

証明(命題 2.2)

Rk=QkTAk−1R_k = Q_k^{\mathsf{T}}A_{k-1} なので Ak=RkQk=QkTAk−1QkA_k = R_kQ_k = Q_k^{\mathsf{T}}A_{k-1}Q_k です。これを繰り返せば Ak=QkTAQkA_k = \mathbf{Q}_k^{\mathsf{T}}A\mathbf{Q}_k で、Qk\mathbf{Q}_k は直交行列の積なので直交行列、とくに QkT=Qk−1\mathbf{Q}_k^{\mathsf{T}} = \mathbf{Q}_k^{-1} です。相似な行列の特性多項式は等しい(積の定理 定理 6.1[行列式とその性質])ので固有値も等しく、det⁡Ak=det⁡A≠0\det A_k = \det A \ne 0 です。AkA_k が正則なので、次の QR 分解も一意に定まります(定理 4.1[QR 分解] の 2)。

定理 2.3(QR 法と同時反復の同値性)✓

定義 2.1 の記号で、すべての kk について次が成り立つ。

  1. Ak=QkRkA^k = \mathbf{Q}_k\mathbf{R}_k であり、これは AkA^k の(RR の対角を正にした)QR 分解である。
  2. Z0=IZ_0 = I から始めた同時反復(定義 6.1[固有値の計算 I])の ZkZ_k は Qk\mathbf{Q}_k に等しい。
証明(定理 2.3)
  1. kk についての帰納法です。k=0k = 0 は明らかです。Ak−1=Qk−1Rk−1A^{k-1} = \mathbf{Q}_{k-1}\mathbf{R}_{k-1} とすると、命題 2.2 から AQk−1=Qk−1Ak−1A\mathbf{Q}_{k-1} = \mathbf{Q}_{k-1}A_{k-1} なので
Ak=AQk−1Rk−1=Qk−1Ak−1Rk−1=Qk−1QkRkRk−1=QkRkA^k = A\mathbf{Q}_{k-1}\mathbf{R}_{k-1} = \mathbf{Q}_{k-1}A_{k-1}\mathbf{R}_{k-1} = \mathbf{Q}_{k-1}Q_kR_k\mathbf{R}_{k-1} = \mathbf{Q}_k\mathbf{R}_k

です。Rk\mathbf{R}_k は対角成分が正の上三角行列の積なので、対角成分が正の上三角行列です。

  1. 帰納法で Zk−1=Qk−1Z_{k-1} = \mathbf{Q}_{k-1} とします。同時反復は AZk−1AZ_{k-1} の列を Gram–Schmidt の直交化で正規直交化し、AZk−1=ZkRk′AZ_{k-1} = Z_kR'_k(Rk′R'_k は対角成分が正の上三角)と書くものでした。一方 AQk−1=Qk−1Ak−1=Qk−1QkRk=QkRkA\mathbf{Q}_{k-1} = \mathbf{Q}_{k-1}A_{k-1} = \mathbf{Q}_{k-1}Q_kR_k = \mathbf{Q}_kR_k も同じ行列の、RR の対角が正の QR 分解です。AQk−1A\mathbf{Q}_{k-1} は正則なので、QR 分解の一意性(定理 4.1[QR 分解] の 2)から Zk=QkZ_k = \mathbf{Q}_k です。

QR 法は、nn 本の正規直交なベクトル Qk−1\mathbf{Q}_{k-1} に AA を掛けて直交化し直す同時反復を、「AA を Qk\mathbf{Q}_k の基底で見た行列 AkA_k」の側で記録している、ということです。同時反復では先頭 jj 列が優勢な jj 次元の不変部分空間に近づきました(系 6.3[固有値の計算 I])。Qk\mathbf{Q}_k の先頭 jj 列が AA の不変部分空間をちょうど張れば、Ak=QkTAQkA_k = \mathbf{Q}_k^{\mathsf{T}}A\mathbf{Q}_k の左下の (n−j)×j(n-j)\times j ブロックは 00 になります。これが QR 法で AkA_k が上三角に近づく理由です。

収束の速さを定量的に示すには、「単位行列に近い行列の QR 分解の QQ は単位行列に近い」ことが要ります。次の補題はそのための道具で、I+FI + F の FF が小さいほど QQ は II に近く、その差が FF の大きさのほぼ n\sqrt{n} 倍以下で押さえられる、と言っています。証明は、直交行列の各行・各列の 2 乗和が 11 であることを使い、QQ の転置の下三角部分、上三角部分、対角の順に「II との差」を評価していきます。

補題 3.1(単位行列に近い行列の QR 分解)✓

F∈Rn×nF \in \mathbb{R}^{n\times n}、s=∥F∥Fs = \|F\|_F とし、(n+1)s2<1(n+1)s^2 < 1 とする。このとき I+FI + F は正則で、その QR 分解 I+F=Q~R~I + F = \tilde{Q}\tilde{R}(R~\tilde{R} の対角は正)について

∥Q~−I∥F≤n s+ns2\|\tilde{Q} - I\|_F \le \sqrt{n}\,s + n s^2

が成り立つ。

証明(補題 3.1)

s<1s < 1 なので、∥(I+F)x∥2≥∥x∥2−∥F∥2∥x∥2≥(1−s)∥x∥2\|(I + F)\boldsymbol{x}\|_2 \ge \|\boldsymbol{x}\|_2 - \|F\|_2\|\boldsymbol{x}\|_2 \ge (1 - s)\|\boldsymbol{x}\|_2(∥F∥2≤∥F∥F\|F\|_2 \le \|F\|_F は Cauchy–Schwarz の不等式 定理 4.2[内積空間とグラム・シュミット直交化] から)で、I+FI + F は正則です。U=Q~T=(uij)U = \tilde{Q}^{\mathsf{T}} = (u_{ij}) とおきます。

UU の狭義下三角部分は小さい. Q~T(I+F)=R~\tilde{Q}^{\mathsf{T}}(I + F) = \tilde{R} より U=R~−UFU = \tilde{R} - UF で、R~\tilde{R} は上三角なので、UU の狭義下三角部分は −UF-UF の狭義下三角部分に等しく、その Frobenius ノルムは ∥UF∥F=s\|UF\|_F = s 以下です。

狭義上三角部分も小さい. UU は直交行列なので、各行・各列の 2 乗和は 11 です。1≤m<n1 \le m < n について、先頭 mm 行の 2 乗和と先頭 mm 列の 2 乗和はともに mm で、共通の左上ブロック ∑i,j≤muij2\sum_{i,j\le m}u_{ij}^2 を引くと

∑i≤m<juij2=∑i≤m<juji2\sum_{i\le m<j}u_{ij}^2 = \sum_{i\le m<j}u_{ji}^2

です。これを m=1,…,n−1m = 1, \ldots, n-1 について足すと、(i,j)(i, j) 成分(i<ji < j)は m=i,…,j−1m = i, \ldots, j - 1 の j−ij - i 回現れるので

∑i<juij2≤∑i<j(j−i)uij2=∑i<j(j−i)uji2≤(n−1)∑i>juij2≤(n−1)s2\sum_{i<j}u_{ij}^2 \le \sum_{i<j}(j - i)u_{ij}^2 = \sum_{i<j}(j - i)u_{ji}^2 \le (n - 1)\sum_{i>j}u_{ij}^2 \le (n - 1)s^2

です。よって対角を除いた部分を U−DU - D(DD は UU の対角部分)とすると ∥U−D∥F2≤ns2\|U - D\|_F^2 \le ns^2 です。

対角は 11 に近い. 第 jj 列の 2 乗和が 11 なので ujj2=1−∑i≠juij2≥1−ns2>s2u_{jj}^2 = 1 - \sum_{i\ne j}u_{ij}^2 \ge 1 - ns^2 > s^2 です。一方 U=R~−UFU = \tilde{R} - UF の対角成分を比べると ujj=r~jj−(UF)jj>−∣(UF)jj∣≥−su_{jj} = \tilde{r}_{jj} - (UF)_{jj} > -|(UF)_{jj}| \ge -s です。∣ujj∣>s|u_{jj}| > s と ujj>−su_{jj} > -s から ujj>0u_{jj} > 0 で、0<ujj≤10 < u_{jj} \le 1 です。したがって 1−ujj≤1−ujj2=∑i≠juij21 - u_{jj} \le 1 - u_{jj}^2 = \sum_{i\ne j}u_{ij}^2 で、jj について足して ∥D−I∥F≤∑j(1−ujj)≤∥U−D∥F2≤ns2\|D - I\|_F \le \sum_j(1 - u_{jj}) \le \|U - D\|_F^2 \le ns^2 です。

以上から ∥Q~−I∥F=∥U−I∥F≤∥U−D∥F+∥D−I∥F≤n s+ns2\|\tilde{Q} - I\|_F = \|U - I\|_F \le \|U - D\|_F + \|D - I\|_F \le \sqrt{n}\,s + ns^2 です。

次の定理が、この節の本題です。Qk\mathbf{Q}_k が固有ベクトルの QR 分解に出てくる直交行列 QXQ_X に近づくことを、上の補題で見積もり、そこから AkA_k の対角より下が 00 に近づく速さを出します。証明に出る記号は、XX が固有ベクトルを並べた行列、SS が AA の上三角形(Schur 形)、DkD_k が符号をそろえるだけの ±1\pm1 の対角行列で、最後の式 Ak=DkQ~kTSQ~kDkA_k = D_k\tilde{Q}_k^{\mathsf{T}}S\tilde{Q}_kD_k は「Q~k≈I\tilde{Q}_k \approx I なら Ak≈DkSDkA_k \approx D_kSD_k(SS の成分に符号が掛かっただけ)」を言うための形です。

定理 3.2(シフトなし QR 法の収束)✓

A∈Rn×nA \in \mathbb{R}^{n\times n} が A=XΛX−1A = X\Lambda X^{-1}、Λ=diag⁡(λ1,…,λn)\Lambda = \operatorname{diag}(\lambda_1, \ldots, \lambda_n)、

∣λ1∣>∣λ2∣>⋯>∣λn∣>0|\lambda_1| > |\lambda_2| > \cdots > |\lambda_n| > 0

と対角化でき、X−1X^{-1} が LU 分解 X−1=LUX^{-1} = LU(LL は単位下三角、UU は対角成分が 00 でない上三角)をもつとする。r=max⁡1≤j<n∣λj+1/λj∣r = \max_{1\le j<n}|\lambda_{j+1}/\lambda_j| とおく。このとき定数 CC があって、シフトなし QR 法の AkA_k はすべての kk で

∣(Ak)ij∣≤Crk(i>j),∣(Ak)ii−λi∣≤Crk|(A_k)_{ij}| \le Cr^k\quad(i > j),\qquad |(A_k)_{ii} - \lambda_i| \le Cr^k

を満たす。とくに AkA_k の対角より下は 00 に、対角成分は固有値に、大きさの順に収束する。

証明(定理 3.2)

準備. 実行列の実でない固有値は共役な対で現れ絶対値が等しいので、仮定から固有値はすべて実数です。各固有空間は 1 次元なので、XX の各列を零でない複素数倍して実ベクトルにできます。X′=XD′X' = XD'(D′D' は正則な対角行列)とすると X′−1=D′−1LU=(D′−1LD′)(D′−1U)X'^{-1} = D'^{-1}LU = (D'^{-1}LD')(D'^{-1}U) も同じ形の LU 分解をもつので、はじめから XX は実としてかまいません。このとき X−1X^{-1} は実行列で、その LU 分解の LL, UU も実です(LU 分解をもつので先頭主小行列式は 00 でなく、定理 2.2[Gauss 消去と LU 分解] により実数の範囲でも LU 分解をもち、その一意性から両者は一致する)。XX の QR 分解を X=QXRXX = Q_XR_X(定理 4.1[QR 分解] の 2)とし、S=RXΛRX−1S = R_X\Lambda R_X^{-1} とおくと、SS は対角成分が λ1,…,λn\lambda_1, \ldots, \lambda_n の上三角行列で、QXTAQX=RXΛRX−1=SQ_X^{\mathsf{T}}AQ_X = R_X\Lambda R_X^{-1} = S です(AA の実 Schur 形)。

AkA^k の分解. Ak=XΛkX−1=XΛkLUA^k = X\Lambda^kX^{-1} = X\Lambda^kLU で、ΛkL=(ΛkLΛ−k)Λk\Lambda^kL = (\Lambda^kL\Lambda^{-k})\Lambda^k です。Ek=ΛkLΛ−k−IE_k = \Lambda^kL\Lambda^{-k} - I は狭義下三角で、その (i,j)(i, j) 成分は lij(λi/λj)kl_{ij}(\lambda_i/\lambda_j)^k(i>ji > j)なので、∣λi/λj∣≤r|\lambda_i/\lambda_j| \le r から ∥Ek∥F≤∥L∥Frk\|E_k\|_F \le \|L\|_Fr^k です。よって

Ak=QXRX(I+Ek)ΛkU=QX(I+Fk)RXΛkU,Fk=RXEkRX−1A^k = Q_XR_X(I + E_k)\Lambda^kU = Q_X(I + F_k)R_X\Lambda^kU,\qquad F_k = R_XE_kR_X^{-1}

で、∥Fk∥F≤∥RX∥2∥RX−1∥2∥L∥Frk=:c1rk\|F_k\|_F \le \|R_X\|_2\|R_X^{-1}\|_2\|L\|_Fr^k =: c_1r^k です。

Qk\mathbf{Q}_k の形. (n+1)c12r2k<1(n+1)c_1^2r^{2k} < 1 となる kk(r<1r < 1 なので十分大きい kk はすべて)について、補題 3.1 から I+Fk=Q~kR~kI + F_k = \tilde{Q}_k\tilde{R}_k、∥Q~k−I∥F≤nc1rk+nc12r2k\|\tilde{Q}_k - I\|_F \le \sqrt{n}c_1r^k + nc_1^2r^{2k} です。R~kRXΛkU\tilde{R}_kR_X\Lambda^kU は上三角で、対角成分 (R~k)ii(RX)iiλikuii(\tilde{R}_k)_{ii}(R_X)_{ii}\lambda_i^ku_{ii} は 00 でありません。その符号を並べた対角行列を DkD_k(成分は ±1\pm1)とすると

Ak=(QXQ~kDk)(DkR~kRXΛkU)A^k = (Q_X\tilde{Q}_kD_k)(D_k\tilde{R}_kR_X\Lambda^kU)

は、右の因子の対角が正の QR 分解です。定理 2.3 の 1 と QR 分解の一意性から Qk=QXQ~kDk\mathbf{Q}_k = Q_X\tilde{Q}_kD_k です。

AkA_k の評価. 命題 2.2 から

Ak=QkTAQk=DkQ~kTSQ~kDkA_k = \mathbf{Q}_k^{\mathsf{T}}A\mathbf{Q}_k = D_k\tilde{Q}_k^{\mathsf{T}}S\tilde{Q}_kD_k

です。Q~kTSQ~k−S=(Q~k−I)TSQ~k+S(Q~k−I)\tilde{Q}_k^{\mathsf{T}}S\tilde{Q}_k - S = (\tilde{Q}_k - I)^{\mathsf{T}}S\tilde{Q}_k + S(\tilde{Q}_k - I) から

∥Ak−DkSDk∥F=∥Q~kTSQ~k−S∥F≤2∥S∥2∥Q~k−I∥F≤2∥S∥2(nc1+nc12)rk\|A_k - D_kSD_k\|_F = \|\tilde{Q}_k^{\mathsf{T}}S\tilde{Q}_k - S\|_F \le 2\|S\|_2\|\tilde{Q}_k - I\|_F \le 2\|S\|_2(\sqrt{n}c_1 + nc_1^2)r^k

です。DkSDkD_kSD_k は上三角で、対角成分は λi\lambda_i です。よって十分大きい kk で主張の評価が成り立ち、有限個の小さい kk は定数 CC を大きくとって含めます。

AkA_k の対角より上の成分は DkSDkD_kSD_k の成分、すなわち SS の成分に符号 ±1\pm1 が掛かったものに近づきます。DkD_k の符号は λik\lambda_i^k の符号とともに変わりうるので、上三角部分は一般には収束せず符号が振動します。固有値(対角)と、下三角部分が 00 に近づくことだけが意味をもちます。

注意 3.3(成分ごとの収束の速さ)

定理 3.2 の評価は比の最大 rr だけで書いていますが、より細かく、第 jj 列より左・第 jj 行より下のブロックが O(∣λj+1/λj∣k)O(|\lambda_{j+1}/\lambda_j|^k) で、成分 (i,j)(i, j)(i>ji > j)が O(∣λi/λj∣k)O(|\lambda_i/\lambda_j|^k) で 00 に近づくことが知られています(系 6.3[固有値の計算 I] の各 jj の評価に対応)。下のコードの表はこの細かい評価と合っています。Watkins『Fundamentals of Matrix Computations』3rd ed., Wiley, 2010 — 第 5・6 章、Golub–Van Loan『Matrix Computations』§7.3 を参照してください。

# Python 3.12.10 / NumPy 2.5.2(x86-64, OpenBLAS)/乱数種 20261006
import numpy as np
rng = np.random.default_rng(20261006)
lam = np.array([6.0, 5.0, 4.0, 3.0, 2.0, 1.0])
X = rng.standard_normal((6, 6))
A = X @ np.diag(lam) @ np.linalg.inv(X)
def qr_pos(B): # R の対角を正にそろえた QR 分解
Q, R = np.linalg.qr(B)
s = np.sign(np.diag(R))
return Q * s, R * s[:, None]
Ak, sub = A.copy(), {}
for k in range(1, 101):
Q, R = qr_pos(Ak)
Ak = R @ Q
if k in (40, 60):
sub[k] = np.abs(np.diag(Ak, -1))
print(" i |a(i+1,i)|(k=60) 20 回の比 (l(i+1)/l(i))^20")
for i in range(5):
r = sub[60][i] / sub[40][i]
print(f" {i+1} {sub[60][i]:.2e} {r:.3e}"
f" {(lam[i+1] / lam[i]) ** 20:.3e}")
print("対角(k=100):", np.round(np.diag(Ak), 10))
i |a(i+1,i)|(k=60) 20 回の比 (l(i+1)/l(i))^20
1 3.71e-06 2.610e-02 2.608e-02
2 2.98e-06 1.153e-02 1.153e-02
3 3.87e-08 3.171e-03 3.171e-03
4 2.21e-11 3.007e-04 3.007e-04
5 6.00e-19 9.537e-07 9.537e-07
対角(k=100): [6. 5. 4. 3. 2. 1.]

検算. (a) 固有値は構成に使った 6,5,…,16, 5, \ldots, 1 で、100 回後の対角は 10 桁に丸めてそれに一致します。(b) 別の算法・別の精度との照合は §4 の最後のコードで行います。(c) 副対角成分 (i+1,i)(i+1, i) の 20 回あたりの縮小率は (λi+1/λi)20(\lambda_{i+1}/\lambda_i)^{20} と 3〜4 桁一致し、注意 3.3 の成分ごとの速さが見えます。定理 3.2 の r=5/6r = 5/6 は最も遅い成分 (2,1)(2, 1) の速さです。(XX は乱数なので、X−1X^{-1} の LU 分解の存在は確率 1 で成り立ちます。)

例 3.4(固有値の絶対値が等しいと収束しない、シフトで直る)

A=(0110)A = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} の固有値は ±1\pm1 で絶対値が等しく、定理 3.2 の仮定を満たしません。実際 AA は直交行列なので A=A⋅IA = A\cdot I が QR 分解で、A1=IA=AA_1 = IA = A となり、QR 法は一歩も進みません。

シフト μ\mu(∣μ∣<1|\mu| < 1)を入れて A−μI=QRA - \mu I = QR、A1=RQ+μIA_1 = RQ + \mu I とします(次節のシフトつき QR 法)。c=1+μ2c = 1 + \mu^2 とおくと

Q=1c(−μ11μ),R=1c(c−2μ01−μ2),A1=1c(−2μ1−μ21−μ22μ)Q = \frac{1}{\sqrt{c}}\begin{pmatrix} -\mu & 1 \\ 1 & \mu \end{pmatrix},\qquad R = \frac{1}{\sqrt{c}}\begin{pmatrix} c & -2\mu \\ 0 & 1 - \mu^2 \end{pmatrix},\qquad A_1 = \frac{1}{c}\begin{pmatrix} -2\mu & 1 - \mu^2 \\ 1 - \mu^2 & 2\mu \end{pmatrix}

です(QQ の列が正規直交で QR=A−μIQR = A - \mu I、RR の対角が正であることは掛け算で確かめられます)。非対角成分は 11 から (1−μ2)/(1+μ2)(1 - \mu^2)/(1 + \mu^2) に減ります。たとえば μ=1/2\mu = 1/2 なら 0.60.6 です。ただし、次節の Rayleigh 商シフト μ=a22=0\mu = a_{22} = 0 ではこの行列は動きません。Rayleigh 商シフトが失敗するこの種の対称な状況を避けるのが、Wilkinson シフト(注意 5.5)です。

密行列の QR 分解は O(n3)O(n^3) の演算を要するので、QR 法を nn 回以上反復すると全体で O(n4)O(n^4) になります。そこで最初に一度だけ、QR 反復で保たれる簡単な形に直しておきます。

定理 4.1(Householder 変換による Hessenberg 化)✓

任意の A∈Rn×nA \in \mathbb{R}^{n\times n}(n≥3n \ge 3)について、n−2n - 2 個の Householder 鏡映(または単位行列)の積である直交行列 QQ があって、H=QTAQH = Q^{\mathsf{T}}AQ は上 Hessenberg 行列(i>j+1i > j + 1 で hij=0h_{ij} = 0)になる。演算量は約 10n3/310n^3/3 である。AA が対称なら HH は対称な三重対角行列である。

証明(定理 4.1)

k=1,…,n−2k = 1, \ldots, n-2 の順に、第 kk 列の第 k+2k+2 行以下を 00 にします。第 k−1k - 1 段までで、いまの行列 A(k)A^{(k)} の第 1,…,k−11, \ldots, k-1 列は Hessenberg 形になっているとします。x∈Rn−k\boldsymbol{x} \in \mathbb{R}^{n-k} を第 kk 列の第 k+1k+1 行以下とし、x≠0\boldsymbol{x} \ne \boldsymbol{0} なら x\boldsymbol{x} の Householder 鏡映 P~k\tilde{P}_k(定義 3.1[QR 分解])をとります。P~kx=αe1\tilde{P}_k\boldsymbol{x} = \alpha\boldsymbol{e}_1 で、P~k\tilde{P}_k は対称な直交行列です(命題 3.2[QR 分解])。x=0\boldsymbol{x} = \boldsymbol{0} なら P~k=I\tilde{P}_k = I とします。Pk=diag⁡(Ik,P~k)P_k = \operatorname{diag}(I_k, \tilde{P}_k) とおき、A(k+1)=PkA(k)PkA^{(k+1)} = P_kA^{(k)}P_k とします。

左から PkP_k を掛けると第 k+1k+1 行以下の行だけが混ざり、第 1,…,k1, \ldots, k 列のうち第 k+1k + 1 行以下の成分は、第 1,…,k−11, \ldots, k-1 列ではもともと 00 なので 00 のまま、第 kk 列は (α,0,…,0)T(\alpha, 0, \ldots, 0)^{\mathsf{T}} になります。右から PkP_k を掛けると第 k+1k+1 列以降だけが混ざるので、第 1,…,k1, \ldots, k 列は変わりません。よって A(k+1)A^{(k+1)} の第 1,…,k1, \ldots, k 列は Hessenberg 形です。Q=P1⋯Pn−2Q = P_1\cdots P_{n-2} とすれば H=QTAQH = Q^{\mathsf{T}}AQ です(PkT=PkP_k^{\mathsf{T}} = P_k)。

演算量: m=n−km = n - k として、P~k\tilde{P}_k を m×(m+1)m\times(m+1) 程度のブロックに左から掛けるのに約 4m24m^2、n×mn\times m のブロックに右から掛けるのに約 4nm4nm の演算が要ります(P~y=y−βv(vTy)\tilde{P}\boldsymbol{y} = \boldsymbol{y} - \beta\boldsymbol{v}(\boldsymbol{v}^{\mathsf{T}}\boldsymbol{y}) は 1 本あたり約 4m4m)。∑m(4m2+4nm)≈4n3/3+2n3=10n3/3\sum_m(4m^2 + 4nm) \approx 4n^3/3 + 2n^3 = 10n^3/3 です。AA が対称なら HT=QTATQ=HH^{\mathsf{T}} = Q^{\mathsf{T}}A^{\mathsf{T}}Q = H で、対称な Hessenberg 行列は三重対角です。

命題 4.2(QR 反復は Hessenberg 形を保つ)✓

HH が正則な上 Hessenberg 行列で H=QRH = QR(RR の対角は正)なら、QQ と RQRQ も上 Hessenberg 行列である。この QR 分解は n−1n - 1 個の Givens 回転で O(n2)O(n^2) の演算で計算でき、RQRQ の計算も O(n2)O(n^2) である。HH が対称な三重対角行列なら RQRQ も対称な三重対角行列で、1 回の反復は O(n)O(n) の演算で済む。

証明(命題 4.2)

Q=HR−1Q = HR^{-1} で、R−1R^{-1} は上三角です(上三角行列の逆行列は後退代入で列ごとに求まり、上三角になる)。Hessenberg 行列 HH の第 jj 列は第 j+1j + 1 行までしか成分をもたないので、HR−1HR^{-1} の第 jj 列(HH の第 1,…,j1, \ldots, j 列の 1 次結合)も第 j+1j + 1 行までしか成分をもちません。よって QQ は Hessenberg です。RQRQ の第 jj 列は RR の第 1,…,j+11, \ldots, j+1 列の 1 次結合で、上三角の RR のそれらの列は第 j+1j + 1 行までしか成分をもたないので、RQRQ も Hessenberg です。

計算は、i=1,…,n−1i = 1, \ldots, n-1 の順に第 ii・i+1i+1 行に Givens 回転 GiG_i を掛けて (i+1,i)(i+1, i) 成分を 00 にします(命題 3.4[QR 分解]。回転は 2 行だけを変え、それぞれ O(n)O(n) の演算)。Gn−1⋯G1H=R′G_{n-1}\cdots G_1H = R' は上三角で、各行の符号を調整すれば RR の対角が正になり、Q=G1T⋯Gn−1TQ = G_1^{\mathsf{T}}\cdots G_{n-1}^{\mathsf{T}}(符号の対角行列を含めて)です。RQ=R′G1T⋯Gn−1TRQ = R'G_1^{\mathsf{T}}\cdots G_{n-1}^{\mathsf{T}}(符号を含めて)も、右から回転を掛けるごとに 2 列だけが変わるので O(n2)O(n^2) です。対称な場合は RQ=QTHQRQ = Q^{\mathsf{T}}HQ が対称かつ Hessenberg なので三重対角で、三重対角行列に回転を掛けるときに変わる成分は定数個なので、各回転が O(1)O(1)、全体で O(n)O(n) です。

Hessenberg 化は一度だけ O(n3)O(n^3) で、その後の反復は 1 回 O(n2)O(n^2)(対称なら O(n)O(n))になります。経験的に固有値 1 つあたり 2〜3 回の反復で済むので、全体の手間は Hessenberg 化と同じ O(n3)O(n^3) の程度です。

Hessenberg 形に直す直交相似変換は何通りもありそうですが、実は第 1 列を決めると、符号を除いてただ 1 通りしか残りません。次の定理がそれを保証します。「既約」とは、副対角成分 hk+1,kh_{k+1,k} がどれも 00 でないことです。Hessenberg 形と、対称なときの三重対角形の成分の位置は、次の図のとおりです。

上 Hessenberg 形三重対角形
6 次の行列で、成分が入りうる位置(塗り)。左が上 Hessenberg 形(対角のすぐ下の列まで)、右が三重対角形(対角とそのすぐ上下だけ)。塗っていない位置は 0。

定理 4.3(陰的 Q の定理)✓

A∈Rn×nA \in \mathbb{R}^{n\times n}、QQ, VV を直交行列とし、H=QTAQH = Q^{\mathsf{T}}AQ と G=VTAVG = V^{\mathsf{T}}AV がともに上 Hessenberg 行列で、HH は既約(すべての kk で hk+1,k≠0h_{k+1,k} \ne 0)とする。QQ と VV の第 1 列が等しいならば、各成分が ±1\pm1 の対角行列 DD があって V=QDV = QD、G=DHDG = DHD である。

証明(定理 4.3)

q1=Qe1=Ve1\boldsymbol{q}_1 = Q\boldsymbol{e}_1 = V\boldsymbol{e}_1 とし、Krylov 行列 K=(q1  Aq1  ⋯  An−1q1)K = (\boldsymbol{q}_1\ \ A\boldsymbol{q}_1\ \ \cdots\ \ A^{n-1}\boldsymbol{q}_1) を考えます。AQ=QHAQ = QH から AjQ=QHjA^jQ = QH^j なので

K=Q (e1  He1  ⋯  Hn−1e1)=:QRH,K=V (e1  Ge1  ⋯  Gn−1e1)=:VRGK = Q\,(\boldsymbol{e}_1\ \ H\boldsymbol{e}_1\ \ \cdots\ \ H^{n-1}\boldsymbol{e}_1) =: QR_H,\qquad K = V\,(\boldsymbol{e}_1\ \ G\boldsymbol{e}_1\ \ \cdots\ \ G^{n-1}\boldsymbol{e}_1) =: VR_G

です。Hessenberg 行列を掛けると成分の入る行が 1 つ下に延びるだけなので、帰納法で Hje1H^j\boldsymbol{e}_1 は第 j+1j + 1 行までしか成分をもたず、その第 j+1j + 1 成分は h21h32⋯hj+1,jh_{21}h_{32}\cdots h_{j+1,j} です。よって RHR_H は上三角で、既約性から対角成分はすべて 00 でなく、RHR_H は正則です。同様に RGR_G も上三角です。K=QRHK = QR_H は正則なので RG=VTKR_G = V^{\mathsf{T}}K も正則です。

QRH=VRGQR_H = VR_G から VTQ=RGRH−1=:WV^{\mathsf{T}}Q = R_GR_H^{-1} =: W は上三角で、直交行列でもあります。W−1=WTW^{-1} = W^{\mathsf{T}} は上三角行列の逆なので上三角、かつ上三角行列の転置なので下三角で、対角行列です。直交な対角行列の成分は ±1\pm1 なので W=DW = D、VTQ=DV^{\mathsf{T}}Q = D から V=QDV = QD(D−1=DD^{-1} = D)です。最後に G=VTAV=DQTAQD=DHDG = V^{\mathsf{T}}AV = DQ^{\mathsf{T}}AQD = DHD です。

この定理の意味は、「既約な Hessenberg 形への直交相似変換は、第 1 列を決めれば符号を除いて一意」ということです。QR 反復 Hk=QkTHk−1QkH_k = Q_k^{\mathsf{T}}H_{k-1}Q_k を行うのに、QkQ_k を明示的に作らず、第 1 列だけを正しく選んで、あとは Hessenberg 形に戻す(「バルジ追跡」。回転を掛けると Hessenberg 形からはみ出る成分が 1 つできるので、これを次々に斜め下へ送り出して形を回復する操作)だけでよいことになります。形が Hessenberg に戻った時点で、定理により符号を除いて明示的に QkQ_k を作った場合と同じ行列が得られるからです。Francis の二重シフト QR 法(注意 5.6)や Lanczos 法の陰的再開はこの原理で作られています。

# Python 3.12.10 / NumPy 2.5.2 / SciPy 1.18.1(x86-64)/乱数種 20261006
import numpy as np
from scipy.linalg import hessenberg
rng = np.random.default_rng(20261006)
n = 8
lam = np.arange(1.0, n + 1)
X = rng.standard_normal((n, n))
cases = {"非対称": X @ np.diag(lam) @ np.linalg.inv(X)}
Qs, _ = np.linalg.qr(X)
cases["対称"] = Qs @ np.diag(lam) @ Qs.T
for name, A in cases.items():
H, P = hessenberg(A, calc_q=True)
low = np.abs(np.tril(H, -2)).max()
orth = np.linalg.norm(P.T @ P - np.eye(n))
print(f"{name}: 下の帯の外 {low:.0e}, ||P^T P - I|| < 1e-14:",
orth < 1e-14)
seq = []
for k in range(12):
mu = H[-1, -1] # Rayleigh 商シフト
Q, R = np.linalg.qr(H - mu * np.eye(n))
H = R @ Q + mu * np.eye(n)
seq.append(abs(H[-1, -2]))
if seq[-1] < 1e-14:
break
print(" |h(n,n-1)|:", " ".join(f"{s:.1e}" for s in seq))
非対称: 下の帯の外 0e+00, ||P^T P - I|| < 1e-14: True
|h(n,n-1)|: 4.2e-01 4.8e-01 4.6e-01 2.3e-01 1.8e-02 6.8e-06 2.0e-12 1.6e-25
対称: 下の帯の外 0e+00, ||P^T P - I|| < 1e-14: True
|h(n,n-1)|: 7.5e-02 1.0e-04 3.5e-13 1.6e-38

検算. (a) scipy.linalg.hessenberg の結果は副対角より下が厳密に 00 で、変換行列の直交性は単位丸めの程度です(定理 4.1)。(b) 下の mpmath との照合で、固有値そのものも確かめます。(c) Rayleigh 商シフトの QR 法の ∣hn,n−1∣|h_{n,n-1}| は、非対称では 1.8×10−2→6.8×10−6→2.0×10−12→1.6×10−251.8\times10^{-2} \to 6.8\times10^{-6} \to 2.0\times10^{-12} \to 1.6\times10^{-25} と指数がほぼ 2 倍ずつ(2 次収束)、対称では 1.0×10−4→3.5×10−13→1.6×10−381.0\times10^{-4} \to 3.5\times10^{-13} \to 1.6\times10^{-38} と指数がほぼ 3 倍ずつ(3 次収束、系 5.3)進みます。最初の数回は大域的な段階で、収束の次数は現れません。

# Python 3.12.10 / NumPy 2.5.2 / SciPy 1.18.1 / mpmath 1.3.0/乱数種 20261006
import numpy as np
import mpmath as mp
from scipy.linalg import eigvals
rng = np.random.default_rng(20261006)
lam = np.array([6.0, 5.0, 4.0, 3.0, 2.0, 1.0])
X = rng.standard_normal((6, 6))
A = X @ np.diag(lam) @ np.linalg.inv(X) # 丸めで固有値はわずかにずれる
Ak = A.copy() # シフトなし QR 法 300 回
for k in range(300):
Q, R = np.linalg.qr(Ak)
Ak = R @ Q
mine = np.sort(np.diag(Ak))[::-1]
sp_ = np.sort(eigvals(A).real)[::-1]
mp.mp.dps = 40 # 格納された A の厳密な固有値
E, _ = mp.eig(mp.matrix(A.tolist()))
ref = sorted([mp.re(e) for e in E], reverse=True)
d1 = max(abs(float(r - m)) for r, m in zip(ref, mine))
d2 = max(abs(float(r - s)) for r, s in zip(ref, sp_))
d3 = max(abs(float(r) - l) for r, l in zip(ref, lam))
print("自作 QR 法と mpmath の差の最大 < 1e-12:", d1 < 1e-12)
print("eigvals と mpmath の差の最大 < 1e-12:", d2 < 1e-12)
print("mpmath と構成値 6,...,1 の差の最大 < 1e-13:",
d3 < 1e-13)
自作 QR 法と mpmath の差の最大 < 1e-12: True
eigvals と mpmath の差の最大 < 1e-12: True
mpmath と構成値 6,...,1 の差の最大 < 1e-13: True

検算. (a) 構成に使った固有値 6,…,16, \ldots, 1 と、格納された(丸めを含む)行列 AA の 40 桁の固有値の差は 10−1310^{-13} 未満です。(b) 自作の QR 法(numpy.linalg.qr の符号のままの版。符号は AkA_k の対角に影響しません)と LAPACK の eigvals は、どちらも 40 桁の参照値と 10−1210^{-12} 以内で一致します。(c) 300 回の反復では最も遅い比 (5/6)300≈2×10−24(5/6)^{300} \approx 2\times10^{-24} まで下三角部分が縮んでおり、残る差は丸めの水準です。

シフトなし QR 法の速さ ∣λj+1/λj∣|\lambda_{j+1}/\lambda_j| は行列で決まり、固有値が近いと非常に遅くなります。逆反復と同じく、シフト(行列から μI\mu I を引いてから分解すること)で改善します。

定義 5.1(シフトつき QR 法)↗

A0=AA_0 = A とし、シフト μk∈R\mu_k \in \mathbb{R} を選んで、Ak−1−μkIA_{k-1} - \mu_kI が正則なら Ak−1−μkI=QkRkA_{k-1} - \mu_kI = Q_kR_k(RkR_k の対角は正)と分解し、

Ak=RkQk+μkIA_k = R_kQ_k + \mu_kI

とする。μk=(Ak−1)nn\mu_k = (A_{k-1})_{nn} とするものを Rayleigh 商シフトという。

Ak=QkT(Ak−1−μkI)Qk+μkI=QkTAk−1QkA_k = Q_k^{\mathsf{T}}(A_{k-1} - \mu_kI)Q_k + \mu_kI = Q_k^{\mathsf{T}}A_{k-1}Q_k なので、シフトつきでも直交相似変換で、固有値は保たれます。Ak−1A_{k-1} が Hessenberg なら Ak−1−μkIA_{k-1} - \mu_kI も Hessenberg なので、命題 4.2 により AkA_k も Hessenberg です。

次の定理で転置が出てくるのは、B=QRB = QR の逆行列を取ると QQ が BB の転置の逆行列を使って書けるためです。Ak−1A_{k-1} が対称なら Ak−1T=Ak−1A_{k-1}^{\mathsf{T}} = A_{k-1} なので、転置は気にせず普通の逆反復と読んでかまいません。

定理 5.2(シフトつき QR 法と逆反復)✓

シフトつき QR 法の 1 段で Ak−1−μkIA_{k-1} - \mu_kI が正則とし、q=Qken\boldsymbol{q} = Q_k\boldsymbol{e}_n(QkQ_k の最後の列)とする。このとき

  1. q=(Rk)nn (Ak−1−μkI)−Ten\boldsymbol{q} = (R_k)_{nn}\,(A_{k-1} - \mu_kI)^{-\mathsf{T}}\boldsymbol{e}_n であり、(Rk)nn>0(R_k)_{nn} > 0。すなわち q\boldsymbol{q} は、Ak−1TA_{k-1}^{\mathsf{T}} にシフト μk\mu_k の逆反復を en\boldsymbol{e}_n から 1 回行ったベクトルである。
  2. θ=qTAk−1q\theta = \boldsymbol{q}^{\mathsf{T}}A_{k-1}\boldsymbol{q} とおくと (Ak)nn=θ(A_k)_{nn} = \theta であり、AkA_k の最下行の非対角部分について
(∑j<n(Ak)nj2)1/2=∥Ak−1Tq−θq∥2.\Bigl(\sum_{j<n}(A_k)_{nj}^2\Bigr)^{1/2} = \|A_{k-1}^{\mathsf{T}}\boldsymbol{q} - \theta\boldsymbol{q}\|_2 .
証明(定理 5.2)
  1. B=Ak−1−μkI=QkRkB = A_{k-1} - \mu_kI = Q_kR_k を転置すると BT=RkTQkTB^{\mathsf{T}} = R_k^{\mathsf{T}}Q_k^{\mathsf{T}} で、その逆行列は B−T=Qk−TRk−T=QkRk−TB^{-\mathsf{T}} = Q_k^{-\mathsf{T}}R_k^{-\mathsf{T}} = Q_kR_k^{-\mathsf{T}}(QkQ_k は直交)なので Qk=B−TRkTQ_k = B^{-\mathsf{T}}R_k^{\mathsf{T}} です。RkTR_k^{\mathsf{T}} は下三角なので RkTen=(Rk)nnenR_k^{\mathsf{T}}\boldsymbol{e}_n = (R_k)_{nn}\boldsymbol{e}_n で、Qken=(Rk)nnB−TenQ_k\boldsymbol{e}_n = (R_k)_{nn}B^{-\mathsf{T}}\boldsymbol{e}_n です。(Rk)nn>0(R_k)_{nn} > 0 は分解の約束です。

  2. Ak=QkTAk−1QkA_k = Q_k^{\mathsf{T}}A_{k-1}Q_k の (n,j)(n, j) 成分は qTAk−1qj=(Ak−1Tq)Tqj\boldsymbol{q}^{\mathsf{T}}A_{k-1}\boldsymbol{q}_j = (A_{k-1}^{\mathsf{T}}\boldsymbol{q})^{\mathsf{T}}\boldsymbol{q}_j(qj\boldsymbol{q}_j は QkQ_k の第 jj 列)で、j=nj = n では θ\theta です。s=Ak−1Tq−θq\boldsymbol{s} = A_{k-1}^{\mathsf{T}}\boldsymbol{q} - \theta\boldsymbol{q} とおくと、θ\theta は単位ベクトル q\boldsymbol{q} の Ak−1TA_{k-1}^{\mathsf{T}} に関する Rayleigh 商なので s⊥q\boldsymbol{s} \perp \boldsymbol{q} です(命題 7.1[固有値の計算 I])。j<nj < n では qTqj=0\boldsymbol{q}^{\mathsf{T}}\boldsymbol{q}_j = 0 なので (Ak)nj=sTqj(A_k)_{nj} = \boldsymbol{s}^{\mathsf{T}}\boldsymbol{q}_j です。q1,…,qn\boldsymbol{q}_1, \ldots, \boldsymbol{q}_n は正規直交基底で sTqn=0\boldsymbol{s}^{\mathsf{T}}\boldsymbol{q}_n = 0 なので、∥s∥22=∑j<n(sTqj)2\|\boldsymbol{s}\|_2^2 = \sum_{j<n}(\boldsymbol{s}^{\mathsf{T}}\boldsymbol{q}_j)^2 です。

つまり、シフトつき QR 法は「最後の列について逆反復を行い、最下行の非対角部分にその残差を記録する」算法です。Rayleigh 商シフト μk=(Ak−1)nn=enTAk−1en\mu_k = (A_{k-1})_{nn} = \boldsymbol{e}_n^{\mathsf{T}}A_{k-1}\boldsymbol{e}_n は en\boldsymbol{e}_n の Rayleigh 商なので、これは Rayleigh 商反復の 1 段になります。対称行列ではこれを元の座標に戻すと、正確に Rayleigh 商反復の列になります。

次の系は、対称行列では最下行の非対角部分が 1 回ごとに前の 3 乗にほぼ比例して小さくなる、という主張です。式の定数 322 Δ2/δ432\sqrt{2}\,\Delta^2/\delta^4 の細かい値より、「次の ηk+1\eta_{k+1} が今の ηk\eta_k の 3 乗に比例する」ことが要点です。δ\delta, Δ\Delta は固有値の間隔と広がりを表す定数で、定義は冪乗法の章の定理にあります。

系 5.3(Rayleigh 商シフトの局所 3 次収束(対称行列))✓

AA を実対称行列、λ\lambda をその単純な固有値、v\boldsymbol{v} を単位固有ベクトルとし、δ\delta, Δ\Delta を 定理 5.2[固有値の計算 I] と同じく定める。Rayleigh 商シフトの QR 法で、xk=Qken\boldsymbol{x}_k = \mathbf{Q}_k\boldsymbol{e}_n(Qk=Q1⋯Qk\mathbf{Q}_k = Q_1\cdots Q_k)、θk=∠(xk,v)\theta_k = \angle(\boldsymbol{x}_k, \boldsymbol{v})、ηk=(∑j<n(Ak)nj2)1/2\eta_k = \bigl(\sum_{j<n}(A_k)_{nj}^2\bigr)^{1/2} とおく。

  1. μk\mu_k が AA の固有値でない限り、xk\boldsymbol{x}_k は x0=en\boldsymbol{x}_0 = \boldsymbol{e}_n から始めた Rayleigh 商反復(定義 5.1[固有値の計算 I])の kk 回目に等しく、ηk=∥Axk−RA(xk)xk∥2\eta_k = \|A\boldsymbol{x}_k - R_A(\boldsymbol{x}_k)\boldsymbol{x}_k\|_2 である。
  2. Δsin⁡2θ0<δ/2\Delta\sin^2\theta_0 < \delta/2 ならば、反復が続く限り δ2sin⁡θk≤ηk≤Δsin⁡θk\tfrac{\delta}{2}\sin\theta_k \le \eta_k \le \Delta\sin\theta_k であり、
ηk+1≤322 Δ2δ4 ηk3.\eta_{k+1} \le \frac{32\sqrt{2}\,\Delta^2}{\delta^4}\,\eta_k^3 .
証明(系 5.3)
  1. 帰納法です。k=0k = 0 では Q0=I\mathbf{Q}_0 = I です。xk−1=Qk−1en\boldsymbol{x}_{k-1} = \mathbf{Q}_{k-1}\boldsymbol{e}_n が Rayleigh 商反復の k−1k - 1 回目とすると、Ak−1=Qk−1TAQk−1A_{k-1} = \mathbf{Q}_{k-1}^{\mathsf{T}}A\mathbf{Q}_{k-1} から μk=enTAk−1en=RA(xk−1)\mu_k = \boldsymbol{e}_n^{\mathsf{T}}A_{k-1}\boldsymbol{e}_n = R_A(\boldsymbol{x}_{k-1}) で、これは Rayleigh 商反復のシフトそのものです。Ak−1A_{k-1} は対称なので、定理 5.2 の 1 から
xk=Qk−1Qken=(Rk)nnQk−1(Ak−1−μkI)−1en=(Rk)nn(A−μkI)−1xk−1\boldsymbol{x}_k = \mathbf{Q}_{k-1}Q_k\boldsymbol{e}_n = (R_k)_{nn}\mathbf{Q}_{k-1}(A_{k-1} - \mu_kI)^{-1}\boldsymbol{e}_n = (R_k)_{nn}(A - \mu_kI)^{-1}\boldsymbol{x}_{k-1}

です(Qk−1(Qk−1T(A−μkI)Qk−1)−1=(A−μkI)−1Qk−1\mathbf{Q}_{k-1}(\mathbf{Q}_{k-1}^{\mathsf{T}}(A - \mu_kI)\mathbf{Q}_{k-1})^{-1} = (A - \mu_kI)^{-1}\mathbf{Q}_{k-1})。xk\boldsymbol{x}_k は単位ベクトルで (Rk)nn>0(R_k)_{nn} > 0 なので、Rayleigh 商反復の正規化と一致します。後半は、定理 5.2 の 2 の右辺が、q=Qken\boldsymbol{q} = Q_k\boldsymbol{e}_n を Qk−1\mathbf{Q}_{k-1} で元の座標に戻すと ∥Axk−RA(xk)xk∥2\|A\boldsymbol{x}_k - R_A(\boldsymbol{x}_k)\boldsymbol{x}_k\|_2 になること(Qk−1\mathbf{Q}_{k-1} は直交)から従います。

  1. AA の正規直交な固有ベクトル ui\boldsymbol{u}_i(固有値 λi\lambda_i。v\boldsymbol{v} は ±ui0\pm\boldsymbol{u}_{i_0})で xk=∑iciui\boldsymbol{x}_k = \sum_ic_i\boldsymbol{u}_i と展開し、ρ=RA(xk)\rho = R_A(\boldsymbol{x}_k) とおきます。定理 5.2[固有値の計算 I] から、反復が続く限り Δsin⁡2θk<δ/2\Delta\sin^2\theta_k < \delta/2 と ∣ρ−λ∣≤Δsin⁡2θk<δ/2|\rho - \lambda| \le \Delta\sin^2\theta_k < \delta/2 が成り立ちます。上からは、ηk\eta_k が残差の最小値であること(命題 7.1[固有値の計算 I])から
ηk2≤∥(A−λI)xk∥22=∑i(λi−λ)2ci2≤Δ2∑i≠i0ci2=Δ2sin⁡2θk\eta_k^2 \le \|(A - \lambda I)\boldsymbol{x}_k\|_2^2 = \sum_{i}(\lambda_i - \lambda)^2c_i^2 \le \Delta^2\sum_{i\ne i_0}c_i^2 = \Delta^2\sin^2\theta_k

です。下からは、i≠i0i \ne i_0 で ∣λi−ρ∣≥δ−∣λ−ρ∣>δ/2|\lambda_i - \rho| \ge \delta - |\lambda - \rho| > \delta/2 なので

ηk2=∑i(λi−ρ)2ci2≥δ24∑i≠i0ci2=δ24sin⁡2θk\eta_k^2 = \sum_i(\lambda_i - \rho)^2c_i^2 \ge \frac{\delta^2}{4}\sum_{i\ne i_0}c_i^2 = \frac{\delta^2}{4}\sin^2\theta_k

です。最後に、sin⁡2θk<δ/(2Δ)≤1/2\sin^2\theta_k < \delta/(2\Delta) \le 1/2 から cos⁡2θk>1/2\cos^2\theta_k > 1/2、tan⁡θk<2sin⁡θk\tan\theta_k < \sqrt{2}\sin\theta_k なので、定理 5.2[固有値の計算 I] の 2 と合わせて

ηk+1≤Δsin⁡θk+1≤Δtan⁡θk+1≤2Δ2δtan⁡3θk≤2Δ2δ(2sin⁡θk)3≤2Δ2δ⋅22(2ηkδ)3=322 Δ2δ4ηk3\eta_{k+1} \le \Delta\sin\theta_{k+1} \le \Delta\tan\theta_{k+1} \le \frac{2\Delta^2}{\delta}\tan^3\theta_k \le \frac{2\Delta^2}{\delta}\bigl(\sqrt{2}\sin\theta_k\bigr)^3 \le \frac{2\Delta^2}{\delta}\cdot 2\sqrt{2}\Bigl(\frac{2\eta_k}{\delta}\Bigr)^3 = \frac{32\sqrt{2}\,\Delta^2}{\delta^4}\eta_k^3

です。

AA が対称な三重対角行列なら ηk=∣(Ak)n,n−1∣\eta_k = |(A_k)_{n,n-1}| です。ηk\eta_k が単位丸め程度になったら最下行を切り離し(デフレーション)、(Ak)nn(A_k)_{nn} を固有値として、残りの n−1n - 1 次の行列で続けます。非対称な行列では Rayleigh 商反復は 2 次収束なので(注意 5.3[固有値の計算 I])、上のコードのとおり ∣hn,n−1∣|h_{n,n-1}| も 2 次で収束します。

次の命題は、副対角成分を 00 とみなして切り離すことで、どれだけ精度を失うかを測ります。結論は、切り離したあとに得られる固有値が、元の行列 AA に単位丸め程度の小さな変化を加えた行列の固有値になっている、ということです。

命題 5.4(デフレーションの後退誤差)✓

H=QTAQH = Q^{\mathsf{T}}AQ(QQ は直交)を上 Hessenberg 行列とし、ある kk で

∣hk+1,k∣≤u (∣hkk∣+∣hk+1,k+1∣)|h_{k+1,k}| \le u\,(|h_{kk}| + |h_{k+1,k+1}|)

とする(uu は単位丸め)。hk+1,kh_{k+1,k} を 00 に置き換えた行列を H+EH + E とすると、

  1. ∥E∥2=∣hk+1,k∣≤2u∥H∥2=2u∥A∥2\|E\|_2 = |h_{k+1,k}| \le 2u\|H\|_2 = 2u\|A\|_2 で、H+EH + E の固有値は左上 kk 次と右下 n−kn - k 次の対角ブロックの固有値を合わせたものであり、それらは A+QEQTA + QEQ^{\mathsf{T}}(∥QEQT∥2=∥E∥2\|QEQ^{\mathsf{T}}\|_2 = \|E\|_2)の固有値に等しい。
  2. AA が対称で、HH が対称な三重対角行列のとき、hk+1,kh_{k+1,k} と hk,k+1h_{k,k+1} をともに 00 に置き換えた行列を H+E′H + E' とすると ∥E′∥2=∣hk+1,k∣\|E'\|_2 = |h_{k+1,k}| で、大きい順に並べた固有値は ∣λi(H+E′)−λi(A)∣≤2u∥A∥2|\lambda_i(H + E') - \lambda_i(A)| \le 2u\|A\|_2 を満たす。
  3. A=VΛV−1A = V\Lambda V^{-1} が対角化可能なら、H+EH + E の各固有値 ν\nu について min⁡i∣ν−λi∣≤2u κ2(V)∥A∥2\min_i|\nu - \lambda_i| \le 2u\,\kappa_2(V)\|A\|_2 である。
証明(命題 5.4)
  1. E=−hk+1,kek+1ekTE = -h_{k+1,k}\boldsymbol{e}_{k+1}\boldsymbol{e}_k^{\mathsf{T}} で、∥Ex∥2=∣hk+1,k∣∣xk∣≤∣hk+1,k∣∥x∥2\|E\boldsymbol{x}\|_2 = |h_{k+1,k}||x_k| \le |h_{k+1,k}|\|\boldsymbol{x}\|_2(x=ek\boldsymbol{x} = \boldsymbol{e}_k で等号)です。∣hii∣=∣eiTHei∣≤∥H∥2|h_{ii}| = |\boldsymbol{e}_i^{\mathsf{T}}H\boldsymbol{e}_i| \le \|H\|_2(Cauchy–Schwarz の不等式 定理 4.2[内積空間とグラム・シュミット直交化])から ∥E∥2≤2u∥H∥2\|E\|_2 \le 2u\|H\|_2 で、直交行列を掛けても 2 ノルムは変わらないので ∥H∥2=∥A∥2\|H\|_2 = \|A\|_2 です。H+EH + E はブロック上三角なので、特性多項式はブロック三角行列の行列式(補題 4.1[行列の固有値評価と不等式])により 2 つの対角ブロックの特性多項式の積です。H+E=QT(A+QEQT)QH + E = Q^{\mathsf{T}}(A + QEQ^{\mathsf{T}})Q なので、固有値は A+QEQTA + QEQ^{\mathsf{T}} のものと同じです。

  2. E′E' は (k+1,k)(k+1, k) と (k,k+1)(k, k+1) に −hk+1,k-h_{k+1,k} をもつ対称行列で、∥E′x∥22=hk+1,k2(xk2+xk+12)≤hk+1,k2∥x∥22\|E'\boldsymbol{x}\|_2^2 = h_{k+1,k}^2(x_k^2 + x_{k+1}^2) \le h_{k+1,k}^2\|\boldsymbol{x}\|_2^2 から ∥E′∥2=∣hk+1,k∣\|E'\|_2 = |h_{k+1,k}| です。HH と AA は同じ固有値をもち、HH と E′E' は対称なので、エルミート行列の固有値の摂動(系 8.1[行列のノルムと線形方程式の条件数])と 1 の評価から従います。

  3. HH は AA と相似で H=(QTV)Λ(QTV)−1H = (Q^{\mathsf{T}}V)\Lambda(Q^{\mathsf{T}}V)^{-1}、κ2(QTV)=κ2(V)\kappa_2(Q^{\mathsf{T}}V) = \kappa_2(V) です。Bauer–Fike の定理(定理 6.2[行列計算の認証と最適化の証明書])と 1 から従います。

対称行列では、デフレーションの誤差は固有値の絶対誤差として 2u∥A∥22u\|A\|_2 以下で、どの固有値にも同じ精度が保証されます。非対称行列では κ2(V)\kappa_2(V) 倍に拡大されうるので、固有値の精度は固有ベクトルの条件で決まります。

注意 5.5(Wilkinson シフトと大域収束)

例 3.4 のように Rayleigh 商シフトは停滞しうるので、対称三重対角行列では、右下 2×22\times2 ブロックの 2 つの固有値のうち (Ak−1)nn(A_{k-1})_{nn} に近い方をシフトにとる Wilkinson シフトを使います。Wilkinson は、このシフトで QR 法がすべての対称三重対角行列について収束し(大域収束)、その速さが少なくとも 2 次、通常は 3 次であることを示しました。証明は数頁の場合分けで、本章では定理として扱いません。J. H. Wilkinson, “Global convergence of tridiagonal QR algorithm with origin shifts”, Linear Algebra Appl. 1 (1968)、Parlett『The Symmetric Eigenvalue Problem』第 8 章を参照してください。

注意 5.6(Francis の二重シフト)

実の非対称行列は複素共役な固有値の対をもちえ、実のシフトではそれに収束しません。複素共役なシフト μ\mu, μˉ\bar{\mu}(右下 2×22\times2 ブロックの固有値)で 2 回続けて QR 反復を行うと、結果は実行列 (A−μI)(A−μˉI)=A2−2Re⁡μ A+∣μ∣2I(A - \mu I)(A - \bar{\mu}I) = A^2 - 2\operatorname{Re}\mu\,A + |\mu|^2I の QR 分解だけで決まり、実数演算で実行できます。Francis は、この行列の第 1 列だけを計算し、定理 4.3 に基づいて Hessenberg 形を回復することで、1 回 O(n2)O(n^2) で実行しました。収束後の AkA_k は 1×11\times1 と 2×22\times2 の対角ブロックをもつ準上三角行列(実 Schur 形)になります。J. G. F. Francis, “The QR transformation”, Comput. J. 4 (1961/62)、Watkins の前掲書第 5・6 章、Golub–Van Loan §7.5 を参照してください。

注意 5.7(積極的な早期デフレーション)

現代の実装(LAPACK の dhseqr)は、最下行だけでなく右下の大きめのブロック全体について、その部分の Schur 分解から切り離せる固有値を探し、一度に多くの固有値をデフレーションします。また、多数のシフトを小さなバルジとして同時に追跡して、キャッシュを有効に使います。K. Braman, R. Byers, R. Mathias, “The multishift QR algorithm. Part II: Aggressive early deflation”, SIAM J. Matrix Anal. Appl. 23 (2002) を参照してください。

演習 6.1標準

A=(2111)A = \begin{pmatrix} 2 & 1 \\ 1 & 1 \end{pmatrix} に Rayleigh 商シフト μ1=a22=1\mu_1 = a_{22} = 1 の QR 反復を 1 回行い、A1A_1 を求めよ。AA の固有値は (3±5)/2(3 \pm \sqrt{5})/2 である。e2\boldsymbol{e}_2 と小さい方の固有値の固有ベクトルのなす角を θ\theta、A1A_1 についての同じ角を θ′\theta' とするとき、tan⁡θ′=tan⁡3θ\tan\theta' = \tan^3\theta を確かめよ。

解答

A−I=(1110)A - I = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} の第 1 列を正規化して q1=(1,1)T/2\boldsymbol{q}_1 = (1, 1)^{\mathsf{T}}/\sqrt{2}、r11=2r_{11} = \sqrt{2}、r12=q1T(1,0)T=1/2r_{12} = \boldsymbol{q}_1^{\mathsf{T}}(1, 0)^{\mathsf{T}} = 1/\sqrt{2}。r22>0r_{22} > 0 となるよう q2=(1,−1)T/2\boldsymbol{q}_2 = (1, -1)^{\mathsf{T}}/\sqrt{2} とすると r22=1/2r_{22} = 1/\sqrt{2} です。

RQ=(21/201/2)12(111−1)=(3/21/21/2−1/2),A1=(5/21/21/21/2).RQ = \begin{pmatrix} \sqrt{2} & 1/\sqrt{2} \\ 0 & 1/\sqrt{2} \end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} = \begin{pmatrix} 3/2 & 1/2 \\ 1/2 & -1/2 \end{pmatrix},\qquad A_1 = \begin{pmatrix} 5/2 & 1/2 \\ 1/2 & 1/2 \end{pmatrix} .

跡 33 と行列式 11 は保たれています。小さい固有値 λ=(3−5)/2\lambda = (3 - \sqrt{5})/2 の固有ベクトルは、AA では (1,λ−2)(1, \lambda - 2) に比例するので tan⁡θ=1/(2−λ)=2/(1+5)≈0.618\tan\theta = 1/(2 - \lambda) = 2/(1 + \sqrt{5}) \approx 0.618、A1A_1 では (A1−λI)v=0(A_1 - \lambda I)\boldsymbol{v} = \boldsymbol{0} の第 1 行から v∝(1/2,λ−5/2)\boldsymbol{v} \propto (1/2, \lambda - 5/2) なので tan⁡θ′=(1/2)/(5/2−λ)=1/(2+5)≈0.236\tan\theta' = (1/2)/(5/2 - \lambda) = 1/(2 + \sqrt{5}) \approx 0.236 です。tan⁡3θ=8/(1+5)3=8/(16+85)=1/(2+5)\tan^3\theta = 8/(1 + \sqrt{5})^3 = 8/(16 + 8\sqrt{5}) = 1/(2 + \sqrt{5}) なので、tan⁡θ′=tan⁡3θ\tan\theta' = \tan^3\theta がちょうど成り立ちます(2 次の Rayleigh 商反復の性質。冪乗法の章の演習を参照)。

演習 6.2易

定理 4.3 で HH が既約という仮定を外すと結論が成り立たない例を挙げよ。

解答

A=diag⁡(1,2,3)A = \operatorname{diag}(1, 2, 3) とし、Q=IQ = I、VV を第 2 列と第 3 列を入れ替える置換行列とします。どちらも第 1 列は e1\boldsymbol{e}_1 で、H=AH = A と G=VTAV=diag⁡(1,3,2)G = V^{\mathsf{T}}AV = \operatorname{diag}(1, 3, 2) はともに(対角なので)上 Hessenberg 行列です。しかし V≠QDV \ne QD(DD は ±1\pm1 の対角)です。HH の副対角は 00 なので既約ではありません。証明では RHR_H が正則であることにこの仮定を使いました。

演習 6.3標準

nn 次の行列のすべての固有値を、(a) 密行列のまま QR 法で、(b) Hessenberg 化してから QR 法で求めるとき、固有値 1 つあたり平均 3 回の反復で済むとして、全体の演算量の主要項を比べよ。QR 分解と RQRQ の積は、密行列で約 (4/3)n3+n3(4/3)n^3 + n^3、Hessenberg 行列で約 6n26n^2 とする。

解答

(a) 各反復は約 (7/3)m3(7/3)m^3(mm はデフレーションで縮んだ次数)で、m=n,n−1,…,1m = n, n-1, \ldots, 1 について 3 回ずつなので約 3⋅(7/3)∑m3≈(7/4)n43\cdot(7/3)\sum m^3 \approx (7/4)n^4 です。(b) Hessenberg 化が約 (10/3)n3(10/3)n^3、反復は 3⋅6∑m2≈6n33\cdot 6\sum m^2 \approx 6n^3 で、合わせて約 (28/3)n3≈9.3n3(28/3)n^3 \approx 9.3n^3 です(固有ベクトルも求めるなら QQ の累積の分が加わる)。n=1000n = 1000 なら (a) は約 1.8×10121.8\times10^{12}、(b) は約 9.3×1099.3\times10^9 で、約 190 倍の差になります。

  • G. H. Golub, C. F. Van Loan『Matrix Computations』4th ed., Johns Hopkins University Press, 2013 — §7.3(同時反復と QR 法)、§7.4(Hessenberg 化と陰的 Q の定理)、§7.5(Francis の QR 法)、§8.3(対称 QR 法)。
  • D. S. Watkins『Fundamentals of Matrix Computations』3rd ed., Wiley, 2010 — 第 5・6 章。
  • B. N. Parlett『The Symmetric Eigenvalue Problem』SIAM, 1998 — 第 8 章(QL 法・QR 法とシフト)。
  • L. N. Trefethen, D. Bau III『Numerical Linear Algebra』SIAM, 1997 — Lectures 26(Hessenberg 化)、28–29(QR 法とシフト)。
  • J. G. F. Francis, “The QR transformation: a unitary analogue to the LR transformation”, The Computer Journal 4 (1961), 265–271 および 332–345.

このテーマの 100 本ノック(100 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。