4.5_带位移的隐式QR迭代法

4.5 带位移的隐式QR迭代法

QR迭代法中需要考虑的另一个重要问题就是运算量:每一步迭代都需要做一次QR分解和矩阵乘积,运算量为 O(n3)\mathcal{O}(n^3) 。即使每计算一个特征值只需迭代一步,则计算所有特征值也需要 O(n4)\mathcal{O}(n^4) 的运算量。因此QR迭代算法??虽然简单易用,但离实际应用还很远。下面我们就想办法将总运算量从 O(n4)\mathcal{O}(n^4) 减小到 O(n3)\mathcal{O}(n^3)

为了实现这个目标, 我们需要利用 Hessenberg 矩阵. 具体步骤如下: 首先通过相似变化将 AA 转化成一个上 Hessenberg 矩阵, 然后再对这个 Hessenberg 矩阵实施隐式 QR 迭代. 所谓隐式 QR 迭代, 就是在 QR 迭代中, 我们不需要进行显式的 QR 分解, 以及 RRQQ 的乘积. 这样就可以将 QR 迭代的每一步运算量从 O(n3)\mathcal{O}(n^{3}) 降低到 O(n2)\mathcal{O}(n^{2}) . 从而将总的运算量降低到 O(n3)\mathcal{O}(n^{3}) .

带位移的隐式QR迭代法是当前计算中小规模矩阵的所有特征值的标准方法.

4.5.1 上Hessenberg矩阵

H=[hij]Rn×nH = [h_{ij}] \in \mathbb{R}^{n \times n} , 若当 i>j+1i > j + 1 时, 有 hij=0h_{ij} = 0 , 则称 HH 为上Hessenberg矩阵.

定理4.4设 ARn×nA\in \mathbb{R}^{n\times n} ,则存在正交矩阵 QRn×nQ\in \mathbb{R}^{n\times n} ,使得 QAQTQAQ^{\mathrm{T}} 是上Hessenberg矩阵

下面我们以一个 5×55 \times 5 的矩阵 AA 为例, 给出具体的上 Hessenberg 化过程, 所采用的工具仍然是 Householder 变换.

第一步:令 Q1=diag(I1×1,H1)Q_{1} = \mathrm{diag}(I_{1\times 1},H_{1}) ,其中 H1H_{1} 是对应于向量 A(2:5,1)A(2:5,1) 的Householder矩阵.于是可得

Q1A=[000].Q _ {1} A = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & * & * & * & * \\ 0 & * & * & * & * \end{array} \right].

由于用 Q1TQ_1^{\mathsf{T}} 右乘 Q1AQ_{1}A 时,不会改变 Q1AQ_{1}A 第一列元素的值,故

A1Q1AQ1T=[000].A _ {1} \triangleq Q _ {1} A Q _ {1} ^ {\mathsf {T}} = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & * & * & * & * \\ 0 & * & * & * & * \end{array} \right].

第二步:令 Q2=diag(I2×2,H2)Q_{2} = \mathrm{diag}(I_{2\times 2},H_{2}) ,其中 H2H_{2} 是对应于向量 A1(3:5,2)A_{1}(3:5,2) 的Householder矩阵,则用 Q2Q_{2} 左乘 A1A_{1} 时,不会改变 A1A_{1} 的第一列元素的值.用 Q2TQ_{2}^{\mathsf{T}} 右乘 Q2A1Q_{2}A_{1} 时,不会改变 Q2A1Q_{2}A_{1} 前两列元素的值.因此,

Q2A1=[00000]A2Q2A1Q2T=[00000].Q _ {2} A _ {1} = \left[ \begin{array}{l l l l l} {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \end{array} \right] \quad \text {和} \quad A _ {2} \triangleq Q _ {2} A _ {1} Q _ {2} ^ {\mathsf {T}} = \left[ \begin{array}{l l l l l} {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \end{array} \right].

第三步:令 Q3=diag(I3×3,H3)Q_{3} = \mathrm{diag}(I_{3\times 3},H_{3}) ,其中 H3H_{3} 是对应于向量 A2(4:5,3)A_{2}(4:5,3) 的Householder矩阵,则有

Q3A2=[000000]A3Q3A2Q3T=[000000].Q _ {3} A _ {2} = \left[ \begin{array}{l l l l l} {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & 0 & {*} & {*} \end{array} \right] \quad \text {和} \quad A _ {3} \triangleq Q _ {3} A _ {2} Q _ {3} ^ {\mathsf {T}} = \left[ \begin{array}{l l l l l} {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & 0 & {*} & {*} \end{array} \right].

这时, 我们就将 AA 转化成一个上Hessenberg矩阵, 即 QAQT=A3QAQ^{\mathsf{T}} = A_{3} 其中 Q=Q3Q2Q1Q = Q_{3}Q_{2}Q_{1} 是正交矩阵, A3A_{3} 是上Hessenberg矩阵.

下面是将任意一个矩阵转化成上Hessenberg矩阵的算法

算法4.7.上Hessenberg化(UpperHessenbergReduction)

1: Set Q=IQ = I
2: for k=1k = 1 to n2n - 2 do
3: compute Householder matrix Hk=IβkvkvkTH_{k} = I - \beta_{k}v_{k}v_{k}^{\mathsf{T}} with respect to A(k+1:n,k)A(k + 1:n,k)
4: wkT=vkTA(k+1:n,k:n)w_{k}^{\mathsf{T}} = v_{k}^{\mathsf{T}}A(k + 1:n,k:n)
5: A(k+1:n,k:n)=HkA(k+1:n,k:n)=A(k+1:n,k:n)βkvkwkTA(k + 1:n,k:n) = H_kA(k + 1:n,k:n) = A(k + 1:n,k:n) - \beta_kv_kw^{\mathsf{T}}_k
6: wk=A(1:n,k+1:n)vkw_{k} = A(1:n,k + 1:n)v_{k}
7: A(k:n,k+1:n)=A(k:n,k+1:n)Hk=A(k:n,k+1:n)βkwkvkA(k:n,k + 1:n) = A(k:n,k + 1:n)H_k^\top = A(k:n,k + 1:n) - \beta_kw_kv_k^\top
8: end for
9: for k=n2k = n - 2 to 1 do

10: % 用向后累积法计算 QQ

11: end for

在实际计算时, 我们不需要显式地形成 Householder 矩阵 HkH_{k} .
可以先存储所有 Householder 向量, 最后用向前累积法计算 QQ .

上述算法的运算量大约为 143n3+O(n2)\frac{14}{3} n^3 + \mathcal{O}(n^2) . 如果不需要计算特征向量, 则正交矩阵 QQ 也不用计算, 此时运算量大约为 103n3+O(n2)\frac{10}{3} n^3 + \mathcal{O}(n^2) .

上Hessenberg矩阵的一个很重要的性质就是在QR迭代中能保持形状不变.

定理4.5 设 ARn×nA \in \mathbb{R}^{n \times n} 是非奇异上Hessenberg矩阵, 其QR分解为 A=QRA = QR , 则 A~RQ\tilde{A} \triangleq RQ 也是上Hessenberg矩阵. (板书)

证明. 设 A=QRA = QRAA 的 QR 分解, 则 Q=AR1Q = AR^{-1} . 由于 RR 是一个上三角矩阵, 所以 R1R^{-1} 也是一个上三角矩阵. 因此 QQ 的第 jj 列是 AA 的前 jj 列的线性组合. 又 AA 是上 Hessenberg 矩阵, 所以 QQ 也是一个上 Hessenberg 矩阵.

相类似地, 我们很容易验证 RQRQ 也是一个上Hessenberg矩阵. 所以结论成立.

AA 是奇异的, 也可以通过选取适当的 QQ , 使得定理 4.5 中的结论成立. 事实上, 由基于 Gram-Schmidt 过程的 QR 分解可知, 如果 AA 是奇异的上 Hessenberg 矩阵, 则 QQ 仍可取为上 Hessenberg 矩阵.

由这个性质可知, 如果 ARn×nA \in \mathbb{R}^{n \times n} 是上Hessenberg矩阵, 则QR迭代中的每一个 AkA_{k} 都是上Hessenberg矩阵. 这样, 在进行QR分解时, 运算量可大大降低.

Hessenberg 矩阵还有一个重要性质, 就是在 QR 迭代过程中能保持下次对角线元素非零.

定理4.6 设 ARn×nA \in \mathbb{R}^{n \times n} 是非奇异的上Hessenberg矩阵, 且下次对角线元素均非零, 即 ai+1,i0a_{i+1, i} \neq 0 , i=1,2,,n1i = 1, 2, \ldots, n-1 . 设其QR分解为 A=QRA = QR , 则 A~RQ\tilde{A} \triangleq RQ 的下次对角线元素也都非零.

(留作练习)

易知, 如果上Hessenberg矩阵 AA 存在某个下次对角线元素为零, 则 AA 一定可约, 此时计算 AA 的特征值就转化为计算两个更小规模的矩阵的特征值. 因此, 我们只需考虑下次对角线均非零的情形.
需要指出的是, 如果上 Hessenberg 矩阵 AA 存在某个下次对角线元素为零, 则 AA 一定可约, 但反之却不成立, 即如果 AA 是可约的上 Hessenberg 矩阵, AA 的下次对角线元素仍可能均非零.

推论4.7 设 ARn×nA \in \mathbb{R}^{n \times n} 是非奇异的上Hessenberg矩阵, 且下次对角线元素均非零, 则在带位移的QR迭代中, 所有的 AkA_{k} 的下次对角线元素均非零.

4.5.2 隐式QR迭代

在QR迭代中,我们需要先做QR分解 Ak=QkRkA_{k} = Q_{k}R_{k} ,然后再计算 Ak+1=RkQkA_{k + 1} = R_kQ_k .但事实上,我们可以将这个过程进行简化,即在不对 AkA_{k} 进行QR分解的前提下,直接计算出 Ak+1A_{k + 1} .这就是隐式QR迭代.

我们这里考虑不可约的上Hessenberg矩阵,即 AA 的下次对角线元素都不为0.事实上,若 AA 是可约的,则 AA 就是一个块上三角矩阵,这时 AA 的特征值计算问题就转化成计算两个对角块的特征值问题.隐式QR迭代的理论基础就是下面的隐式 QQ 定理

定理4.8 (Implicit QQ Theorem) 设 H=QTAQRn×nH = Q^{\mathsf{T}}AQ \in \mathbb{R}^{n \times n} 是一个不可约上Hessenberg矩阵, 其中 QRn×nQ \in \mathbb{R}^{n \times n} 是正交矩阵, 则 QQ 的第2至第 nn 列均由 QQ 的第一列所唯一确定 (可相差一个符号).

(板书)

证明. 设 H=QTAQH = Q^{\mathsf{T}}AQG=VTAVG = V^{\mathsf{T}}AV 都是不可约上Hessenberg矩阵, 其中 Q=[q1,q2,,qn],V=[v1,v2,,vn]Q = [q_{1}, q_{2}, \ldots, q_{n}], V = [v_{1}, v_{2}, \ldots, v_{n}] 都是正交矩阵, 且 q1=v1q_{1} = v_{1} . 下面我们只需证明 qi=viq_{i} = v_{i}qi=vi,i=2,3,,n,q_{i} = -v_{i}, i = 2, 3, \ldots, n, 即证明

WVTQ=diag(1,±1,,±1).W \triangleq V ^ {\mathsf {T}} Q = \operatorname {d i a g} (1, \pm 1, \dots , \pm 1).

W=[w1,w2,,wn],H=[hij]W = [w_{1},w_{2},\ldots ,w_{n}],H = [h_{ij}] ,则有

GW=GVTQ=(VTAV)VTQ=VTAQ=VTQ(QTAQ)=VTQH=WH,G W = G V ^ {\mathsf {T}} Q = (V ^ {\mathsf {T}} A V) V ^ {\mathsf {T}} Q = V ^ {\mathsf {T}} A Q = V ^ {\mathsf {T}} Q (Q ^ {\mathsf {T}} A Q) = V ^ {\mathsf {T}} Q H = W H,

Gwi=j=1i+1hjiwj,i=1,2,,n1.G w _ {i} = \sum_ {j = 1} ^ {i + 1} h _ {j i} w _ {j}, \quad i = 1, 2, \dots , n - 1.

所以

hi+1,iwi+1=Gwij=1ihjiwj.h _ {i + 1, i} w _ {i + 1} = G w _ {i} - \sum_ {j = 1} ^ {i} h _ {j i} w _ {j}.

因为 q1=v1q_{1} = v_{1} , 所以 w1=[1,0,,0]Tw_{1} = [1,0,\dots,0]^{\mathsf{T}} . 又 GG 是上Hessenberg矩阵, 利用归纳法, 我们可以证明 wiw_{i} 的第 i+1i + 1 到第 nn 个元素均为 0. 所以 WW 是一个上三角矩阵. 又 WW 是正交矩阵, 所以 W=diag(1,±1,,±1)W = \mathrm{diag}(1,\pm 1,\ldots ,\pm 1) . 由此, 定理结论成立. □

由于 QkQ_{k} 的其它列都是由 QkQ_{k} 的第一列唯一确定 (至多相差一个符号), 所以我们只要找到一个正交矩阵 Q~k\tilde{Q}_{k} 使得其第一列与 QkQ_{k} 的第一列相等, 且 Q~kTAkQ~k\tilde{Q}_{k}^{\mathsf{T}}A_{k}\tilde{Q}_{k} 为上Hessenberg矩阵, 则由隐式Q定理可知 Q~k=WQk\tilde{Q}_k = WQ_k , 其中 W=diag(1,±1,,±1)W = \mathrm{diag}(1,\pm 1,\ldots ,\pm 1) . 于是

Q~kTAkQ~k=WTQkTAkQkW=WTAk+1W.\tilde {Q} _ {k} ^ {\mathsf {T}} A _ {k} \tilde {Q} _ {k} = W ^ {\mathsf {T}} Q _ {k} ^ {\mathsf {T}} A _ {k} Q _ {k} W = W ^ {\mathsf {T}} A _ {k + 1} W.

WTAk+1WW^{\mathsf{T}}A_{k + 1}WAk+1A_{k + 1} 相似,且对角线元素相等,而其它元素也至多相差一个符号,所以不会影响 Ak+1A_{k + 1} 的收敛性,即下三角元素收敛到0,对角线元素收敛到 AA 的特征值.换句话说,在QR迭代法中,如果我们用 Q~kAkQ~k\tilde{Q}_k^\top A_k\tilde{Q}_k 代替 QkAkQkQ_{k}A_{k}Q_{k}^{\top} ,即直接令 Ak+1=Q~kAkQ~kA_{k + 1} = \tilde{Q}_k^\top A_k\tilde{Q}_k ,则其收敛性与原QR迭代法没有任何区别!这就是隐式QR迭代的基本思想.

由于 AA 是上Hessenberg矩阵,因此在计算中可以使用Givens变换,即 Q~k\tilde{Q}_k 是一系列Givens变换的乘积.下面我们举一个例子,具体说明如何利用隐式Q定理,由 A1A_{1} 得到 A2A_{2}

例4.5 设 AR5×5A \in \mathbb{R}^{5 \times 5} 是一个不可约上Hessenberg矩阵, 即

A1=A=[000000].A _ {1} = A = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & 0 & * & * & * \\ 0 & 0 & 0 & * & * \end{array} \right].

第一步:构造一个Givens变换 G1G_{1} ,其转置如下

G1TG(1,2,θ1)=[c1s1s1c1111].G _ {1} ^ {\mathsf {T}} \triangleq G (1, 2, \theta_ {1}) = \left[ \begin{array}{c c c c c} c _ {1} & s _ {1} & & & \\ - s _ {1} & c _ {1} & & & \\ & & 1 & & \\ & & & 1 & \\ & & & & 1 \end{array} \right].

这里 G1G_{1} 的第一列 [c1,s1,0,,0]T[c_{1},s_{1},0,\ldots ,0]^{\mathsf{T}} 就是 A1σ1IA_{1} - \sigma_{1}I 的第一列 [a11σ1,a21,0,,0]T[a_{11} - \sigma_1,a_{21},0,\dots ,0]^{\mathsf{T}} 的单位化后的列向量,其中 σ1\sigma_{1} 是位移.于是有

G1TA=[000000]A(1)G1TAG1=[+00000].G _ {1} ^ {\mathsf {T}} A = \left[ \begin{array}{l l l l l} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & 0 & * & * & * \\ 0 & 0 & 0 & * & * \end{array} \right] \quad \text {和} \quad A ^ {(1)} \triangleq G _ {1} ^ {\mathsf {T}} A G _ {1} = \left[ \begin{array}{l l l l l} * & * & * & * & * \\ * & * & * & * & * \\ + & * & * & * & * \\ 0 & 0 & * & * & * \\ 0 & 0 & 0 & * & * \end{array} \right].

A1A_{1} 相比较, A(1)A^{(1)} 在 (3,1) 位置上多出一个非零元, 我们把它记为 “+”, 并称之为 bulge. 在下面的计算过程中, 我们的目标就是将其“赶”出矩阵, 从而得到一个新的上 Hessenberg 矩阵, 即 A2A_{2} .

第二步:为了消去这个 bulge, 我们可以构造 Givens 变换

G2TG(2,3,θ2)=[1c2s2s2c211]使 得G2TA(1)=[000000].G _ {2} ^ {\mathsf {T}} \triangleq G (2, 3, \theta_ {2}) = \left[ \begin{array}{c c c c c} {{1}} & {} & {} & {} & {} \\ {} & {{c _ {2}}} & {{s _ {2}}} & {} & {} \\ {} & {{- s _ {2}}} & {{c _ {2}}} & {} & {} \\ {} & {} & {} & {{1}} & {} \\ {} & {} & {} & {} & {{1}} \end{array} \right] \quad \text {使 得} \quad G _ {2} ^ {\mathsf {T}} A ^ {(1)} = \left[ \begin{array}{c c c c c} {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{0}} & {{*}} & {{*}} \end{array} \right].

为了保持与原矩阵的相似性, 需要再右乘 G2G_{2} , 所以

A(2)G2TA(1)G2=[00+000].A ^ {(2)} \triangleq G _ {2} ^ {\mathsf {T}} A ^ {(1)} G _ {2} = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & + & * & * & * \\ 0 & 0 & 0 & * & * \end{array} \right].

此时, bugle 从 (3,1) 位置被 “赶” 到 (4,2) 位置.

第三步:与第二步类似,构造Givens变换

G3TG(3,4,θ3)=[11c3s3s3c31]使 得G3TA(2)=[000000].G _ {3} ^ {\mathsf {T}} \triangleq G (3, 4, \theta_ {3}) = \left[ \begin{array}{c c c c c} {{1}} & {} & {} & {} & {} \\ {} & {{1}} & {} & {} & {} \\ {} & {} & {{c _ {3}}} & {{s _ {3}}} & {} \\ {} & {} & {{- s _ {3}}} & {{c _ {3}}} & {} \\ {} & {} & {} & {} & {{1}} \end{array} \right] \quad \text {使 得} \quad G _ {3} ^ {\mathsf {T}} A ^ {(2)} = \left[ \begin{array}{c c c c c} {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{0}} & {{*}} & {{*}} \end{array} \right].

这时

A(3)G3TA(2)G3=[00000+].A ^ {(3)} \triangleq G _ {3} ^ {\mathsf {T}} A ^ {(2)} G _ {3} = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & 0 & * & * & * \\ 0 & 0 & + & * & * \end{array} \right].

于是, bugle 又从 (4,2) 位置又被“赶”到 (5,3) 位置.

第四步:再次构造Givens变换

G4TG(4,5,θ4)=[111c4s4s4c4]使 得G4TA(3)=[000000]G _ {4} ^ {\mathsf {T}} \triangleq G (4, 5, \theta_ {4}) = \left[ \begin{array}{c c c c c} {{1}} & {} & {} & {} & {} \\ {} & {{1}} & {} & {} & {} \\ {} & {} & {{1}} & {} & {} \\ {} & {} & {} & {{c _ {4}}} & {{s _ {4}}} \\ {} & {} & {} & {{- s _ {4}}} & {{c _ {4}}} \end{array} \right] \quad \text {使 得} \quad G _ {4} ^ {\mathsf {T}} A ^ {(3)} = \left[ \begin{array}{c c c c c} {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{*}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{*}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{*}} & {{*}} & {{*}} \\ {{0}} & {{0}} & {{0}} & {{*}} & {{*}} \end{array} \right]

于是

A(4)G4TA(3)G4=[000000].A ^ {(4)} \triangleq G _ {4} ^ {\mathsf {T}} A ^ {(3)} G _ {4} = \left[ \begin{array}{c c c c c} * & * & * & * & * \\ * & * & * & * & * \\ 0 & * & * & * & * \\ 0 & 0 & * & * & * \\ 0 & 0 & 0 & * & * \end{array} \right].

现在, bulge 已经被 “赶” 出矩阵, 且

A(4)=G4TG3TG2TG1TA1G1G2G3G4=Q~1TA1Q~1,A ^ {(4)} = G _ {4} ^ {\mathsf {T}} G _ {3} ^ {\mathsf {T}} G _ {2} ^ {\mathsf {T}} G _ {1} ^ {\mathsf {T}} A _ {1} G _ {1} G _ {2} G _ {3} G _ {4} = \tilde {Q} _ {1} ^ {\mathsf {T}} A _ {1} \tilde {Q} _ {1},

其中 Q~1=G1G2G3G4\tilde{Q}_1 = G_1G_2G_3G_4 . 通过直接计算可知, Q~1\tilde{Q}_1 的第一列为 [c1,s1,0,0,0]T[c_1, s_1, 0, 0, 0]^{\mathsf{T}} , 即 A1σ1IA_1 - \sigma_1I 的第一列的单位化. 根据隐式 Q\mathbf{Q} 定理, A2A(4)=Q~1TA1Q~1A_2 \triangleq A^{(4)} = \tilde{Q}_1^{\mathsf{T}}A_1\tilde{Q}_1 就是我们所需要的矩阵.

如果 ARn×nA \in \mathbb{R}^{n \times n} 是上Hessenberg矩阵, 则使用上面的算法, 带位移的隐式QR迭代中每一步的运算量为 6n2+O(n)6n^{2} + \mathcal{O}(n) , 如果需要计算 QQ 的话, 则总运算量为 12n2+O(n)12n^{2} + \mathcal{O}(n) .

4.5.3 位移的选取

在带位移的QR迭代法中, 位移的选取非常重要. 通常, 位移越离某个特征值越近, 收敛速度就越快. 由习题4.5可知, 如果位移 σ\sigma 与某个特征值非常接近, 则 Ak(n,n)σA_{k}(n,n) - \sigma 就非常接近于0. 这说明 Ak(n,n)A_{k}(n,n) 通常会首先收敛到 AA 的一个特征值, 所以 σ=Ak(n,n)\sigma = A_{k}(n,n) 是一个不错的选择. 但是, 如果这个特征值是复数, 这种位移选取方法就可能失效.

下面我们介绍一种针对共轭复特征值的位移选取方法, 即双位移策略.

σC\sigma \in \mathbb{C}AA 的某个复特征值 λ\lambda 的一个很好的近似, 则其共轭 σˉ\bar{\sigma} 也应该是 λˉ\bar{\lambda} 的一个很好的

近似. 因此我们可以考虑双位移策略, 即先以 σ\sigma 为位移迭代一次, 然后再以 σˉ\bar{\sigma} 为位移迭代一次, 如此不断交替进行迭代. 这样就有

A1σI=Q1R1,A2=R1Q1+σI,(4.5)\begin{array}{l} A _ {1} - \sigma I = Q _ {1} R _ {1}, \\ A _ {2} = R _ {1} Q _ {1} + \sigma I, \tag {4.5} \\ \end{array}
A2σˉI=Q2R2,A _ {2} - \bar {\sigma} I = Q _ {2} R _ {2},
A3=R2Q2+σˉI.A _ {3} = R _ {2} Q _ {2} + \bar {\sigma} I.

容易验证

A3=Q2A2Q2=Q2Q1A1Q1Q2=QA1Q,A _ {3} = Q _ {2} ^ {*} A _ {2} Q _ {2} = Q _ {2} ^ {*} Q _ {1} ^ {*} A _ {1} Q _ {1} Q _ {2} = Q ^ {*} A _ {1} Q,

其中 Q=Q1Q2Q = Q_{1}Q_{2} .我们注意到 σ\sigma 是复的,所以 Q1Q_{1}Q2Q_{2} 都可能是复矩阵.但我们却可以选取适当的 Q1Q_{1}Q2Q_{2} ,使的 Q=Q1Q2Q = Q_{1}Q_{2} 是实正交矩阵

引理4.9 在双位移QR迭代(4.3)中,我们可以选取酉矩阵 Q1Q_{1}Q2Q_{2} 使得 Q=Q1Q2Q = Q_{1}Q_{2} 是实矩阵. (板书)

证明. 由于

Q2R2=A2σˉI=R1Q1+(σσˉ)I,Q _ {2} R _ {2} = A _ {2} - \bar {\sigma} I = R _ {1} Q _ {1} + (\sigma - \bar {\sigma}) I,

所以

Q1Q2R2R1=Q1(R1Q1+(σσˉ)I)R1=Q1R1Q1R1+(σσˉ)Q1R1=(A1σI)2+(σσˉ)(A1σI)=A12(σ+σˉ)A1+σˉσI,=A122Re(σ)A1+σ2IRn×n.\begin{array}{l} Q _ {1} Q _ {2} R _ {2} R _ {1} = Q _ {1} \left(R _ {1} Q _ {1} + (\sigma - \bar {\sigma}) I\right) R _ {1} \\ = Q _ {1} R _ {1} Q _ {1} R _ {1} + (\sigma - \bar {\sigma}) Q _ {1} R _ {1} \\ = (A _ {1} - \sigma I) ^ {2} + (\sigma - \bar {\sigma}) (A _ {1} - \sigma I) \\ = A _ {1} ^ {2} - (\sigma + \bar {\sigma}) A _ {1} + \bar {\sigma} \sigma I, \\ = A _ {1} ^ {2} - 2 \operatorname {R e} (\sigma) A _ {1} + | \sigma | ^ {2} I \in \mathbb {R} ^ {n \times n}. \\ \end{array}

Q1Q2Q_{1}Q_{2} 是酉矩阵, R2R1R_{2}R_{1} 是上三角矩阵, 故 (Q1Q2)(R2R1)(Q_{1}Q_{2})(R_{2}R_{1}) 是实矩阵 A122Re(σ)A1+σ2I=(A1σI)(A1σˉI)A_{1}^{2} - 2\mathrm{Re}(\sigma)A_{1} + |\sigma|^{2}I = (A_{1} - \sigma I)(A_{1} - \bar{\sigma}I) 的 QR 分解. 所以 Q1Q2Q_{1}Q_{2}R2R1R_{2}R_{1} 都可以是实矩阵.

由这个引理可知, 存在 Q1Q_{1}Q2Q_{2} , 使得 Q=Q1Q2Q = Q_{1}Q_{2} 是实正交矩阵, 从而 A3=QTA1QA_{3} = Q^{\mathsf{T}}A_{1}Q 也是实矩阵. 这时, 在迭代过程 (4.3) 中, 我们无需计算 A2A_{2} , 可直接由 A1A_{1} 计算出 A3A_{3} .

具体计算过程仍然是根据隐式 QQ 定理:我们只要找到一个实正交矩阵 QQ ,使得其第一列与 A122Re(σ)A1+σ2IA_1^2 - 2\mathrm{Re}(\sigma)A_1 + |\sigma|^2I 的第一列平行,并且 A3=QA1QA_3 = Q^\top A_1Q 是上Hessenberg矩阵即可.

由于 A122Re(σ)A1+σ2IA_1^2 - 2\mathrm{Re}(\sigma)A_1 + |\sigma|^2 I 的第一列为

[a112+a12a212Re(σ)a11+σ2a21(a11+a222Re(σ))a21a3200].(4.6)\left[ \begin{array}{c} a _ {1 1} ^ {2} + a _ {1 2} a _ {2 1} - 2 \operatorname {R e} (\sigma) a _ {1 1} + | \sigma | ^ {2} \\ a _ {2 1} \left(a _ {1 1} + a _ {2 2} - 2 \operatorname {R e} (\sigma)\right) \\ a _ {2 1} a _ {3 2} \\ 0 \\ \vdots \\ 0 \end{array} \right]. \tag {4.6}

所以 QQ 的第一列是上述向量的单位化. 其它过程可以通过隐式 QR 迭代来实现. 但此时的“bulge”是一个 2×22 \times 2 的小矩阵. 因此, 在双位移隐式 QR 迭代过程中, 我们需要使用 Householder 变换.

需要指出的是, 双位移 QR 迭代法中的运算都是实数运算.

下面我们举一个例子, 具体说明如何在实数运算下实现双位移隐式 QR 迭代法.

例4.6 设 AR6×6A \in \mathbb{R}^{6 \times 6} 是一个不可约上Hessenberg矩阵, 即

A1=A=[0000000000].A _ {1} = A = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ 0 & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & 0 & * & * & * \\ 0 & 0 & 0 & 0 & * & * \end{array} \right].

第一步:构造一个正交矩阵 H1=[H~1T00I3×3],H_{1} = \left[ \begin{array}{cc}\tilde{H}_{1}^{\mathsf{T}} & 0\\ 0 & I_{3\times 3} \end{array} \right], 其中 H~1R3×3\tilde{H}_1\in \mathbb{R}^{3\times 3} ,使得其第一列与向量(4.4)平行.于是有

H1TA=[+000000000]A(1)H1TAH1=[+++0000000].H _ {1} ^ {\mathsf {T}} A = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ + & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & 0 & * & * & * \\ 0 & 0 & 0 & 0 & * & * \end{array} \right] \quad \text {和} \quad A ^ {(1)} \triangleq H _ {1} ^ {\mathsf {T}} A H _ {1} = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ + & * & * & * & * & * \\ + & + & * & * & * & * \\ 0 & 0 & 0 & * & * & * \\ 0 & 0 & 0 & 0 & * & * \end{array} \right].

A1A_{1} 相比较, A(1)A^{(1)}(3,1)(3,1) , (4,1)(4,1)(4,2)(4,2) 位置上出现 bulge. 在下面的计算过程中, 我们的目标就是把它们“赶”出矩阵, 从而得到一个新的上 Hessenberg 矩阵.

第二步:令 H2=[I1×1000H~2T000I2×2],H_{2} = \left[ \begin{array}{ccc}I_{1\times 1} & 0 & 0\\ 0 & \tilde{H}_{2}^{\mathsf{T}} & 0\\ 0 & 0 & I_{2\times 2} \end{array} \right], 其中 H~2R3×3\tilde{H}_2\in \mathbb{R}^{3\times 3} 是对应于 A(2:4,1)A(2:4,1) 的Householder变换,使得

H2TA(1)=[00+0000000]A(2)H2TA(1)H2=[00+0++0000].H _ {2} ^ {\mathsf {T}} A ^ {(1)} = \left[ \begin{array}{c c c c c c} {*} & {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} & {*} \\ 0 & + & {*} & {*} & {*} & {*} \\ 0 & 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & 0 & 0 & {*} & {*} \end{array} \right] \quad \text {和} \quad A ^ {(2)} \triangleq H _ {2} ^ {\mathsf {T}} A ^ {(1)} H _ {2} = \left[ \begin{array}{c c c c c c} {*} & {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} & {*} \\ 0 & + & {*} & {*} & {*} & {*} \\ 0 & + & + & {*} & {*} & {*} \\ 0 & 0 & 0 & 0 & {*} & {*} \end{array} \right].

这时, 我们将bugle向右下角方向“赶”了一个位置.

第三步:与第二步类似,令 H3=[I2×2000H~3T000I1×1],H_{3} = \left[ \begin{array}{ccc}I_{2\times 2} & 0 & 0\\ 0 & \tilde{H}_{3}^{\mathsf{T}} & 0\\ 0 & 0 & I_{1\times 1} \end{array} \right], 其中 H~3R3×3\tilde{H}_3\in \mathbb{R}^{3\times 3} 是对应于 A(3:5,2)A(3:5,2)

的 Householder 变换, 使得

H3TA(2)=[00000+0000]A(3)H3TA(2)H3=[00000+00++].H _ {3} ^ {\mathsf {T}} A ^ {(2)} = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ 0 & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & + & * & * & * \\ 0 & 0 & 0 & 0 & * & * \end{array} \right] \quad \text {和} \quad A ^ {(3)} \triangleq H _ {3} ^ {\mathsf {T}} A ^ {(2)} H _ {3} = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ 0 & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & + & * & * & * \\ 0 & 0 & + & + & * & * \end{array} \right].

此时, bugle 又被向右下角方向 “赶” 了一个位置.

第四步:令 H4=[I3×300H~4T],H_{4} = \left[ \begin{array}{cc}I_{3\times 3} & 0\\ 0 & \tilde{H}_{4}^{\mathsf{T}} \end{array} \right], 其中 H~4R3×3\tilde{H}_4\in \mathbb{R}^{3\times 3} 是对应于 A(4:6,3)A(4:6,3) 的Householder变换,使得

H _ {4} ^ {\mathsf {T}} A ^ {(3)} = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ 0 & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & 0 & * & * & * \\ 0 & 0 & 0 & + & * & * \end{array} \right] \quad \text {和} \quad A ^ {(4)} \triangleq H _ {4} ^ {\mathsf {T}} A ^ {(3)} H _ {4} = \left[ \begin{array}{c c c c c c} * & * & * & * & * & * \\ * & * & * & * & * & * \\ 0 & * & * & * & * & * \\ 0 & 0 & * & * & * & * \\ 0 & 0 & 0 & * & * & * \\ 0 & 0 & 0 & + & * & * \end{aligned} \right].

第五步:此时,只需构造一个Givens变换 G5=[I4×400G(4,5,θ)T]G_{5} = \left[ \begin{array}{cc}I_{4\times 4} & 0\\ 0 & G(4,5,\theta)^{\mathsf{T}} \end{array} \right] ,使得

G _ {5} ^ {\mathsf {T}} A ^ {(4)} = \left[ \begin{array}{c c c c c c} {*} & {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & 0 & 0 & {*} & {*} \end{array} \right] \quad \text {和} \quad A ^ {(5)} \triangleq G _ {5} ^ {\mathsf {T}} A ^ {(4)} G _ {5} = \left[ \begin{array}{c c c c c c} {*} & {*} & {*} & {*} & {*} & {*} \\ {*} & {*} & {*} & {*} & {*} & {*} \\ 0 & {*} & {*} & {*} & {*} & {*} \\ 0 & 0 & {*} & {*} & {*} & {*} \\ 0 & 0 & 0 & {*} & {*} & {*} \\ 0 & 0 & 0 & 0 & {*} & {*} \end{} \right].

现在, bulge 已经被全部消除, 且

A(5)=QAQ,A ^ {(5)} = Q ^ {\intercal} A Q,

其中 Q=H1H2H3H4G5Q = H_{1}H_{2}H_{3}H_{4}G_{5} . 通过直接计算可知, QQ 的第一列即为 H1H_{1} 的第一列, 也就是向量 (4.4) 的单位化. 根据隐式 Q\mathbf{Q} 定理, 可以直接令 A3A(5)=QTAQA_{3} \triangleq A^{(5)} = Q^{\mathrm{T}}AQ .

最后要考虑位移 σ\sigma 的具体选取问题.在单位移QR迭代法中,如果 AA 的特征值都是实数的话,我们可以取 σ=Ak(n,n)\sigma = A_{k}(n,n) 推广到复共轭特征值上,我们可以取 AkA_{k} 的右下角矩阵

[Ak(n1,n1)Ak(n1,n)Ak(n,n1)Ak(n,n)]\left[ \begin{array}{c c} A _ {k} (n - 1, n - 1) & A _ {k} (n - 1, n) \\ A _ {k} (n, n - 1) & A _ {k} (n, n) \end{array} \right]

的复共轭特征值作为双位移. 这样选取的位移就是 Francis 位移.

如果上述矩阵的两个特征值都是实的,则选取其中模较小的特征值做单位移QR迭代

一般来说, 采用 Francis 位移的 QR 迭代法会使得迭代矩阵的右下角收敛到一个上三角矩阵 (两个实特征值) 或一个 2×22 \times 2 的矩阵 (一对复共轭特征值), 即 Ak(n,n1)A_{k}(n, n - 1)Ak(n1,n2)A_{k}(n - 1, n - 2) 趋向于 0. 带 Francis 位移的隐式 QR 迭代法通常具有二次渐进收敛性, 在实际计算中, 计算一个特征值大约平均迭代两步.

A 作为一种实用的算法, 需要给出一种有效的收敛判别准则, 一种简单实用的准则是

Ak(n,n1)(Ak(n1,n1)+Ak(n,n))εu,\left| A _ {k} (n, n - 1) \right| \leq \left(\left| A _ {k} (n - 1, n - 1) \right| + \left| A _ {k} (n, n) \right|\right) \varepsilon_ {u},

其中 εu\varepsilon_{u} 是机器精度或给定的阈值

有时也可能是中间某个下次对角线元素 (不是最后两个) 首先收敛到 0, 此时可以转化为计算两个子矩阵 (对角块) 的特征值. 因此在迭代中需要判断所有下次对角线元素是否满足精度要求.
如果同时有多个下次对角线元素满足精度要求, 则可转化为多个子矩阵.

但需要指出的是, QR 迭代并不是对所有矩阵都收敛. 例如:

A=[001100010].A = \left[ \begin{array}{c c c} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array} \right].

对于上面的矩阵, 采用Francis位移的QR迭代法无效

另外,也可以考虑多重位移策略,参见[132].

4.5.4 收缩

在隐式QR迭代过程中, 当矩阵 Ak+1A_{k + 1} 的某个下次对角线元素 ai+1,ia_{i + 1,i} 很小时, 我们可以将其设为0.由于 Ak+1A_{k + 1} 是上Hessenberg矩阵, 这时 Ak+1A_{k + 1} 就可以写成分块上三角形式, 其中两个对角块都是上Hessenberg矩阵.因此我们可以将隐式QR迭代作用在这两个规模相对较小的矩阵上, 从而可以大大节约运算量.