5.4 分而治之法 分而治之 (Divide-and-Conquer, DC) 算法是由 Cuppen [28] 于 1981 年首次提出, 但直到 1995 年才出现稳定的实现方式 [66]. 该算法是目前计算大规模矩阵的所有特征值和特征向量的最快算法. 下面我们介绍该算法.
考虑不可约对称三对角矩阵
T = [ a 1 b 1 b 1 ⋱ ⋱ ⋱ a m − 1 b m − 1 b m − 1 a m b m b m a m + 1 b m + 1 b m + 1 ⋱ ⋱ ⋱ ⋱ b n − 1 b n − 1 a n ] = [ a 1 b 1 b 1 ⋱ ⋱ ⋱ a m − 1 b m − 1 b m − 1 a m − b m a m + 1 − b m b m + 1 b m + 1 ⋱ ⋱ b n − 1 b n − 1 ] + [ b m b m b m b m b n − 1 ] = [ T 1 0 0 T 2 ] + b m v v T , \begin{array}{l} T = \left[ \begin{array}{c c c c c c c c} a _ {1} & b _ {1} & & & \\ b _ {1} & \ddots & \ddots & & \\ & \ddots & a _ {m - 1} & b _ {m - 1} \\ & & b _ {m - 1} & a _ {m} & b _ {m} & & \\ \hline & & & b _ {m} & a _ {m + 1} & b _ {m + 1} & & \\ & & & & b _ {m + 1} & \ddots & \ddots & \\ & & & & & \ddots & \ddots & b _ {n - 1} \\ & & & & & & b _ {n - 1} & a _ {n} \end{array} \right] \\ = \left[ \begin{array}{c c c c c} a _ {1} & b _ {1} & & & \\ b _ {1} & \ddots & \ddots & & \\ & \ddots & a _ {m - 1} & b _ {m - 1} \\ & & b _ {m - 1} & a _ {m} - b _ {m} \\ \hline & & & a _ {m + 1} - b _ {m} & b _ {m + 1} \\ & & & b _ {m + 1} & \ddots \\ & & & & \ddots \\ & & & & b _ {n - 1} \\ & & & & b _ {n - 1} \end{array} \right] + \left[ \begin{array}{c c c c c} & & & \\ & & & \\ & & & \\ & b _ {m} & b _ {m} \\ \hline & b _ {m} & b _ {m} \\ & & \\ & b _ {n - 1} \end{array} \right] \\ = \left[ \begin{array}{c c} T _ {1} & 0 \\ \hline 0 & T _ {2} \end{array} \right] + b _ {m} v v ^ {\mathsf {T}}, \\ \end{array} T = a 1 b 1 b 1 ⋱ ⋱ ⋱ a m − 1 b m − 1 b m − 1 a m b m b m a m + 1 b m + 1 b m + 1 ⋱ ⋱ ⋱ ⋱ b n − 1 b n − 1 a n = a 1 b 1 b 1 ⋱ ⋱ ⋱ a m − 1 b m − 1 b m − 1 a m − b m a m + 1 − b m b m + 1 b m + 1 ⋱ ⋱ b n − 1 b n − 1 + b m b m b n − 1 b m b m = [ T 1 0 0 T 2 ] + b m v v T , 其中 v = [ 0 , … , 0 , 1 , 1 , 0 , … , 0 ] T v = [0,\dots ,0,1,1,0,\dots ,0]^{\mathsf{T}} v = [ 0 , … , 0 , 1 , 1 , 0 , … , 0 ] T .假定 T 1 T_{1} T 1 和 T 2 T_{2} T 2 的特征值分解已经计算出来了,即 T 1 = Q 1 Λ 1 Q 1 T , T_{1} = Q_{1}\Lambda_{1}Q_{1}^{\mathsf{T}}, T 1 = Q 1 Λ 1 Q 1 T , T 2 = Q 2 Λ 2 Q 2 T T_{2} = Q_{2}\Lambda_{2}Q_{2}^{\mathsf{T}} T 2 = Q 2 Λ 2 Q 2 T ,下面考虑 T T T 的特征值分解.
引理5.8 设 x , y ∈ R n x, y \in \mathbb{R}^n x , y ∈ R n ,则 det ( I + x y T ) = 1 + y T x \operatorname*{det}(I + xy^{\mathsf{T}}) = 1 + y^{\mathsf{T}}x det ( I + x y T ) = 1 + y T x 。
(留作练习)
我们首先考虑 T T T 的特征值与 T 1 T_{1} T 1 和 T 2 T_{2} T 2 的特征值之间的关系
T = [ T 1 0 0 T 2 ] + b m v v T = [ Q 1 Λ 1 Q 1 T 0 0 Q 2 Λ 2 Q 2 T ] + b m v v T = [ Q 1 0 0 Q 2 ] ( [ Λ 1 0 0 Λ 2 ] + b m u u T ) [ Q 1 0 0 Q 2 ] T , \begin{array}{l} T = \left[ \begin{array}{c c} T _ {1} & 0 \\ 0 & T _ {2} \end{array} \right] + b _ {m} v v ^ {\mathsf {T}} = \left[ \begin{array}{c c} Q _ {1} \Lambda_ {1} Q _ {1} ^ {\mathsf {T}} & 0 \\ 0 & Q _ {2} \Lambda_ {2} Q _ {2} ^ {\mathsf {T}} \end{array} \right] + b _ {m} v v ^ {\mathsf {T}} \\ = \left[ \begin{array}{c c} Q _ {1} & 0 \\ 0 & Q _ {2} \end{array} \right] \left(\left[ \begin{array}{c c} \Lambda_ {1} & 0 \\ 0 & \Lambda_ {2} \end{array} \right] + b _ {m} u u ^ {\mathsf {T}}\right) \left[ \begin{array}{c c} Q _ {1} & 0 \\ 0 & Q _ {2} \end{array} \right] ^ {\mathsf {T}}, \\ \end{array} T = [ T 1 0 0 T 2 ] + b m v v T = [ Q 1 Λ 1 Q 1 T 0 0 Q 2 Λ 2 Q 2 T ] + b m v v T = [ Q 1 0 0 Q 2 ] ( [ Λ 1 0 0 Λ 2 ] + b m u u T ) [ Q 1 0 0 Q 2 ] T , 其中
u = [ Q 1 0 0 Q 2 ] T v = [ Q 1 T 的 最 后 一 列 Q 2 T 的 第 一 列 ] . u = \left[ \begin{array}{c c} {{Q _ {1}}} & {{0}} \\ {{0}} & {{Q _ {2}}} \end{array} \right] ^ {\mathsf {T}} v = \left[ \begin{array}{c} {{Q _ {1} ^ {\mathsf {T}} \text {的 最 后 一 列}}} \\ {{Q _ {2} ^ {\mathsf {T}} \text {的 第 一 列}}} \end{array} \right]. u = [ Q 1 0 0 Q 2 ] T v = [ Q 1 T 的 最 后 一 列 Q 2 T 的 第 一 列 ] . 令 α = b m , D = d i a g ( Λ 1 , Λ 2 ) = d i a g ( d 1 , d 2 , … , d n ) \alpha = b_{m}, D = \mathrm{diag}(\Lambda_{1},\Lambda_{2}) = \mathrm{diag}(d_{1},d_{2},\ldots ,d_{n}) α = b m , D = diag ( Λ 1 , Λ 2 ) = diag ( d 1 , d 2 , … , d n ) ,并假定 d 1 ≥ d 2 ≥ ⋯ ≥ d n d_1\geq d_2\geq \dots \geq d_n d 1 ≥ d 2 ≥ ⋯ ≥ d n .则 T T T 的特征值与 D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T 的特征值相同.
下面计算 D + α u u ⊤ D + \alpha uu^{\top} D + αu u ⊤ 的特征值.设 λ \lambda λ 是 D + α u u ⊤ D + \alpha uu^{\top} D + αu u ⊤ 的一个特征值,若 D − λ I D - \lambda I D − λ I 非奇异,则
det ( D + α u u T − λ I ) = det ( D − λ I ) ⋅ det ( I + α ( D − λ I ) − 1 u u T ) . \det (D + \alpha u u ^ {\mathsf {T}} - \lambda I) = \det (D - \lambda I) \cdot \det (I + \alpha (D - \lambda I) ^ {- 1} u u ^ {\mathsf {T}}). det ( D + αu u T − λ I ) = det ( D − λ I ) ⋅ det ( I + α ( D − λ I ) − 1 u u T ) . 故 det ( I + α ( D − λ I ) − 1 u u T ) = 0. \operatorname{det}(I + \alpha (D - \lambda I)^{-1}uu^{\mathsf{T}}) = 0. det ( I + α ( D − λ I ) − 1 u u T ) = 0. 又由引理5.8可知
det ( I + α ( D − λ I ) − 1 u u T ) = 1 + α u T ( D − λ I ) − 1 u = 1 + α ∑ i = 1 n u i 2 d i − λ ≜ f ( λ ) . \det (I + \alpha (D - \lambda I) ^ {- 1} u u ^ {\mathsf {T}}) = 1 + \alpha u ^ {\mathsf {T}} (D - \lambda I) ^ {- 1} u = 1 + \alpha \sum_ {i = 1} ^ {n} \frac {u _ {i} ^ {2}}{d _ {i} - \lambda} \triangleq f (\lambda). det ( I + α ( D − λ I ) − 1 u u T ) = 1 + α u T ( D − λ I ) − 1 u = 1 + α i = 1 ∑ n d i − λ u i 2 ≜ f ( λ ) . 故求 A A A 的特征值等价于求特征方程 (secular equation) f ( λ ) = 0 f(\lambda) = 0 f ( λ ) = 0 的根. 由于
f ′ ( λ ) = α ∑ i = 1 n u i 2 ( d i − λ ) 2 , f ^ {\prime} (\lambda) = \alpha \sum_ {i = 1} ^ {n} \frac {u _ {i} ^ {2}}{(d _ {i} - \lambda) ^ {2}}, f ′ ( λ ) = α i = 1 ∑ n ( d i − λ ) 2 u i 2 , 当所有的 d i d_{i} d i 都互不相同, 且所有的 u i u_{i} u i 都不为零时, f ( λ ) f(\lambda) f ( λ ) 在 λ ≠ d i \lambda \neq d_{i} λ = d i 处都是严格单调的 (见下图).
图5.1. f ( λ ) = 1 + 0.5 ( 1 4 − λ + 1 3 − λ + 1 2 − λ + 1 1 − λ ) f(\lambda) = 1 + 0.5\left(\frac{1}{4 - \lambda} +\frac{1}{3 - \lambda} +\frac{1}{2 - \lambda} +\frac{1}{1 - \lambda}\right) f ( λ ) = 1 + 0.5 ( 4 − λ 1 + 3 − λ 1 + 2 − λ 1 + 1 − λ 1 ) 的图像
所以 f ( λ ) f(\lambda) f ( λ ) 在每个区间 ( d i + 1 , d i ) (d_{i + 1},d_i) ( d i + 1 , d i ) 内都有一个根, 共 n − 1 n - 1 n − 1 个, 另一个根在 ( d 1 , ∞ ) (d_1,\infty) ( d 1 , ∞ ) (若 α > 0 \alpha >0 α > 0 ) 或 ( − ∞ , d n ) (- \infty ,d_n) ( − ∞ , d n ) (若 α < 0 \alpha < 0 α < 0 ) 中. 由于 f ( λ ) f(\lambda) f ( λ ) 在每个区间 ( d i + 1 , d i ) (d_{i + 1},d_i) ( d i + 1 , d i ) 内光滑且严格单调递增 ( α > 0 ) (\alpha >0) ( α > 0 ) 或递减 ( α < 0 ) (\alpha < 0) ( α < 0 ) , 所以在实际计算中, 可以使用对分法, 牛顿类方法, 或有理逼近等算法来求解. 通常都能很快收敛, 一般只需迭代几步即可. 因此, 计算一个特征值的运算量约为 O ( n ) \mathcal{O}(n) O ( n ) , 计算 D + α u u ⊤ D + \alpha uu^{\top} D + αu u ⊤ 的所有特征值的运算量约为 O ( n 2 ) \mathcal{O}(n^2) O ( n 2 ) .
当所有特征值计算出来后, 我们可以利用下面的引理来计算特征向量.
引理5.9设 D ∈ R n × n D\in \mathbb{R}^{n\times n} D ∈ R n × n 为对角矩阵, u ∈ R n u\in \mathbb{R}^n u ∈ R n , α ∈ R , \alpha \in \mathbb{R}, α ∈ R , 若 λ \lambda λ 是 D + α u u ⊤ D + \alpha uu^{\top} D + αu u ⊤ 的特征值,且 λ ≠ d i , \lambda \neq d_{i}, λ = d i , (20 i = 1 , 2 , … , n , i = 1,2,\ldots ,n, i = 1 , 2 , … , n , 则 ( D − λ I ) − 1 u (D - \lambda I)^{-1}u ( D − λ I ) − 1 u 是其对应的特征向量. (板书)
证明. 由引理5.8可知
0 = det ( D + α u u T − λ I ) = det ( D − λ I ) ⋅ det ( I + α ( D − λ I ) − 1 u u T ) = det ( D − λ I ) ⋅ ( 1 + α u T ( D − λ I ) − 1 u ) , \begin{array}{l} 0 = \det (D + \alpha u u ^ {\mathsf {T}} - \lambda I) = \det (D - \lambda I) \cdot \det \left(I + \alpha (D - \lambda I) ^ {- 1} u u ^ {\mathsf {T}}\right) \\ = \det (D - \lambda I) \cdot \left(1 + \alpha u ^ {\mathsf {T}} (D - \lambda I) ^ {- 1} u\right), \\ \end{array} 0 = det ( D + αu u T − λ I ) = det ( D − λ I ) ⋅ det ( I + α ( D − λ I ) − 1 u u T ) = det ( D − λ I ) ⋅ ( 1 + α u T ( D − λ I ) − 1 u ) , 故 1 + α u T ( D − λ I ) − 1 u = 0 1 + \alpha u^{\mathsf{T}}(D - \lambda I)^{-1}u = 0 1 + α u T ( D − λ I ) − 1 u = 0 ,即 α u T ( D − λ I ) − 1 u = − 1. \alpha u^{\mathsf{T}}(D - \lambda I)^{-1}u = -1. α u T ( D − λ I ) − 1 u = − 1. 直接计算可得
( D + α u u T ) ( ( D − λ I ) − 1 u ) = ( D − λ I + λ I + α u u T ) ( D − λ I ) − 1 u = u + λ ( D − λ I ) − 1 u + ( α u T ( D − λ I ) − 1 u ) u = u + λ ( D − λ I ) − 1 u − u = λ ( D − λ I ) − 1 u , \begin{array}{l} \left(D + \alpha u u ^ {\mathsf {T}}\right) \left(\left(D - \lambda I\right) ^ {- 1} u\right) = \left(D - \lambda I + \lambda I + \alpha u u ^ {\mathsf {T}}\right) \left(D - \lambda I\right) ^ {- 1} u \\ = u + \lambda (D - \lambda I) ^ {- 1} u + (\alpha u ^ {\mathsf {T}} (D - \lambda I) ^ {- 1} u) u \\ = u + \lambda (D - \lambda I) ^ {- 1} u - u \\ = \lambda (D - \lambda I) ^ {- 1} u, \\ \end{array} ( D + αu u T ) ( ( D − λ I ) − 1 u ) = ( D − λ I + λ I + αu u T ) ( D − λ I ) − 1 u = u + λ ( D − λ I ) − 1 u + ( α u T ( D − λ I ) − 1 u ) u = u + λ ( D − λ I ) − 1 u − u = λ ( D − λ I ) − 1 u , 即引理结论成立.
算法5.5.计算对称三对角矩阵的特征值和特征向量的分而治之法(函数形式)
1: function [ Q , Λ ] = e i g _ d c ( T ) % T = Q Λ Q ⊤ [Q, \Lambda] = \mathbf{eig\_dc}(T) \quad \% T = Q\Lambda Q^{\top} [ Q , Λ ] = eig_dc ( T ) % T = Q Λ Q ⊤ 2: if T T T is of 1 × 1 1 \times 1 1 × 1 then 3: Q = 1 , Λ = T Q = 1, \Lambda = T Q = 1 , Λ = T 4: return 5: end if 6: form T = [ T 1 0 0 T 2 ] + b m v v T T = \left[ \begin{array}{cc}T_{1} & 0\\ 0 & T_{2} \end{array} \right] + b_{m}vv^{\mathsf{T}} T = [ T 1 0 0 T 2 ] + b m v v T 7: [ Q 1 , Λ 1 ] = e i g _ d c ( T 1 ) [Q_1, \Lambda_1] = \mathbf{eig\_dc}(T_1) [ Q 1 , Λ 1 ] = eig_dc ( T 1 ) 8: [ Q 2 , Λ 2 ] = e i g _ d c ( T 2 ) [Q_2, \Lambda_2] = \mathbf{eig\_dc}(T_2) [ Q 2 , Λ 2 ] = eig_dc ( T 2 ) 9: form D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T from Λ 1 , Λ 2 , Q 1 , Q 2 \Lambda_1, \Lambda_2, Q_1, Q_2 Λ 1 , Λ 2 , Q 1 , Q 2 10: compute the eigenvalues Λ \Lambda Λ and eigenvectors Q ^ \hat{Q} Q ^ of D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T 11: compute the eigenvectors of T T T with Q = [ Q 1 0 0 Q 2 ] ⋅ Q ^ Q = \begin{bmatrix} Q_1 & 0 \\ 0 & Q_2 \end{bmatrix} \cdot \hat{Q} Q = [ Q 1 0 0 Q 2 ] ⋅ Q ^ 12: end
在分而治之法中, 特征值和特征向量是同时计算的.
实施细节 在实际使用分而治之算法时, 我们需要考虑以下几个细节问题:
(1) 如何减小运算量; (2) 如何求解特征方程 f ( λ ) = 0 f(\lambda) = 0 f ( λ ) = 0 (3) 如何稳定地计算特征向量.
(1) 如何减小运算量——收缩技巧 (deflation)
分而治之算法的计算复杂性分析: 用 t ( n ) t(n) t ( n ) 表示对 n n n 阶矩阵调用函数 eig_dc 的运算量, 则
t ( n ) = 2 t ( n / 2 ) t(n) = 2t(n / 2) t ( n ) = 2 t ( n /2 ) 递归调用DC算法两次 +O(n²) 计算D+αuu的特征值和特征向量+ c ⋅ n 3 +c\cdot n^{3} + c ⋅ n 3 计算 Q Q Q
如果计算 Q Q Q 时使用的是稠密矩阵乘法, 则 c = 2 c = 2 c = 2 ;
若不计 O ( n 2 ) \mathcal{O}(n^2) O ( n 2 ) 项, 则由递归公式 t ( n ) = 2 t ( n / 2 ) + c ⋅ n 3 t(n) = 2t(n / 2) + c\cdot n^{3} t ( n ) = 2 t ( n /2 ) + c ⋅ n 3 可得 t ( n ) ≈ c ⋅ 4 n 3 / 3. t(n)\approx c\cdot 4n^{3} / 3. t ( n ) ≈ c ⋅ 4 n 3 /3.
但事实上, 由于收缩 (deflation) 现象的存在, 常数 c c c 通常比 1 小得多.
在前面的算法描述过程中, 我们假定 d i d_{i} d i 互不相等且 u i u_{i} u i 不能为零. 事实上, 容易证明当 d i = d i + 1 d_{i} = d_{i + 1} d i = d i + 1 或 u i = 0 u_{i} = 0 u i = 0 时, d i d_{i} d i 即为 D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T 的特征值, 这种现象我们称为收缩 (deflation). 在实际计算时, 当 d i − d i + 1 d_{i} - d_{i + 1} d i − d i + 1 或 ∣ u i ∣ |u_{i}| ∣ u i ∣ 小于一个给定的阈值时, 我们就近似认为 d i d_{i} d i 为 D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T 的特征值, 即出现收缩现象.
在实际计算中, 收缩现象会经常发生, 而且非常频繁, 所以我们可以而且应该利用这种优点加快分而治之算法的速度 [28, 110].
由于主要的计算量集中在计算 Q Q Q ,即算法最后一步的矩阵乘积.如果 u i = 0 u_{i} = 0 u i = 0 ,则 d i d_{i} d i 为特征值,其对应的特征向量为 e i e_i e i ,即 Q ^ \hat{Q} Q ^ 的第 i i i 列为 e i e_i e i ,故计算 Q Q Q 的第 i i i 列时不需要做任何的计算.当 d i = d i + 1 d_{i} = d_{i + 1} d i = d i + 1 时,也存在一个类似的简化.
(2) 特征方程求解 通常我们可以使用牛顿法来计算特征方程 f ( λ ) = 0 f(\lambda) = 0 f ( λ ) = 0 的解
当 d i ≠ d i + 1 d_{i} \neq d_{i+1} d i = d i + 1 且 u i ≠ 0 u_{i} \neq 0 u i = 0 时, 我们用牛顿法计算 f ( λ ) f(\lambda) f ( λ ) 在 ( d i + 1 , d i ) (d_{i+1}, d_{i}) ( d i + 1 , d i ) 中的零点 λ i \lambda_{i} λ i . 如果 ∣ u i ∣ |u_{i}| ∣ u i ∣ 小于给定的阈值时, 我们可直接将 d i d_{i} d i 作为特征值 λ i \lambda_{i} λ i 的一个近似. 但当 u i u_{i} u i 很小 (却大于给定的阈值) 时, 此时 f ( λ ) f(\lambda) f ( λ ) 在区间 [ d i + 1 , d i ] [d_{i+1}, d_{i}] [ d i + 1 , d i ] 中的大部分处的斜率几乎为 0 (见图 5.2). 这时, 如果任取 [ d i + 1 , d i ] [d_{i+1}, d_{i}] [ d i + 1 , d i ] 中的一个点作为迭代初始点, 经过一次牛顿迭代后, 迭代解可能会跑到区间 [ d i + 1 , d i ] [d_{i+1}, d_{i}] [ d i + 1 , d i ] 的外面, 造成不收敛.
图5.2. f ( λ ) = 1 + 0.005 ( 1 4 − λ + 1 3 − λ + 1 2 − λ + 1 1 − λ ) f(\lambda) = 1 + 0.005\left(\frac{1}{4 - \lambda} +\frac{1}{3 - \lambda} +\frac{1}{2 - \lambda} +\frac{1}{1 - \lambda}\right) f ( λ ) = 1 + 0.005 ( 4 − λ 1 + 3 − λ 1 + 2 − λ 1 + 1 − λ 1 ) 的图像
这时需要采用修正的牛顿法. 假设我们已经计算出 λ i \lambda_{i} λ i 的一个近似 λ ~ \tilde{\lambda} λ ~ , 下面我们需要从 λ ~ \tilde{\lambda} λ ~ 出发, 利用牛顿迭代计算下一个近似, 直至收敛. 我们知道牛顿法的基本原理是使用 f ( λ ) f(\lambda) f ( λ ) 在点 λ ~ \tilde{\lambda} λ ~ 的切线来近似 f ( λ ) f(\lambda) f ( λ ) , 并将切线的零点作为下一个近似, 即用切线来近似曲线 f ( λ ) f(\lambda) f ( λ ) .
当 u i u_{i} u i 很小时, 这种近似方法可能会出现问题. 这时, 我们需要寻求用其它简单函数 h ( λ ) h(\lambda) h ( λ ) (不一定是直线) 来近似 f ( λ ) f(\lambda) f ( λ ) , 然后用 h ( λ ) h(\lambda) h ( λ ) 的零点作为 f ( λ ) f(\lambda) f ( λ ) 零点的近似, 并不断迭代下去, 直至收敛.
关于 h ( λ ) h(\lambda) h ( λ ) 的选取,通常需要满足以下几个要求:(1) h ( λ ) h(\lambda) h ( λ ) 必须容易构造;(2) h ( λ ) h(\lambda) h ( λ ) 的零点容易计算;(3) h ( λ ) h(\lambda) h ( λ ) 尽可能地与 f ( λ ) f(\lambda) f ( λ ) 相近.
当然, 这样的 h ( λ ) h(\lambda) h ( λ ) 有多种不同的构造方法. 这里介绍其中的一种方法. 假定我们需要计算的是 f ( λ ) f(\lambda) f ( λ ) 在 ( d i + 1 , d i ) (d_{i+1}, d_i) ( d i + 1 , d i ) 中的零点 λ i \lambda_i λ i . 因为 d i d_i d i 和 d i + 1 d_{i+1} d i + 1 是 f ( λ ) f(\lambda) f ( λ ) 的奇点, 所以我们令
h ( λ ) = c 1 d i − λ + c 2 d i + 1 − λ + c 3 , h (\lambda) = \frac {c _ {1}}{d _ {i} - \lambda} + \frac {c _ {2}}{d _ {i + 1} - \lambda} + c _ {3}, h ( λ ) = d i − λ c 1 + d i + 1 − λ c 2 + c 3 , 其中 c 1 , c 2 , c 3 c_{1}, c_{2}, c_{3} c 1 , c 2 , c 3 是待定的参数. 显然, h ( λ ) h(\lambda) h ( λ ) 的零点很容易计算, 只需求解一个一元二次方程即可, 运算量与牛顿法相差无几. 选取参数 c 1 , c 2 , c 3 c_{1}, c_{2}, c_{3} c 1 , c 2 , c 3 的基本原则是使得 h ( λ ) h(\lambda) h ( λ ) 在 λ ~ \tilde{\lambda} λ ~ 附近尽可能地接近 f ( λ ) f(\lambda) f ( λ ) . 又 f ( λ ) f(\lambda) f ( λ ) 可写为
f ( λ ) = 1 + α ∑ k = 1 n u k 2 d k − λ = 1 + α ( ∑ k = 1 i u k 2 d k − λ + ∑ k = i + 1 n u k 2 d k − λ ) ≜ 1 + α ( Ψ 1 ( λ ) + Ψ 2 ( λ ) ) . f (\lambda) = 1 + \alpha \sum_ {k = 1} ^ {n} \frac {u _ {k} ^ {2}}{d _ {k} - \lambda} = 1 + \alpha \left(\sum_ {k = 1} ^ {i} \frac {u _ {k} ^ {2}}{d _ {k} - \lambda} + \sum_ {k = i + 1} ^ {n} \frac {u _ {k} ^ {2}}{d _ {k} - \lambda}\right) \triangleq 1 + \alpha \big (\Psi_ {1} (\lambda) + \Psi_ {2} (\lambda) \big). f ( λ ) = 1 + α k = 1 ∑ n d k − λ u k 2 = 1 + α ( k = 1 ∑ i d k − λ u k 2 + k = i + 1 ∑ n d k − λ u k 2 ) ≜ 1 + α ( Ψ 1 ( λ ) + Ψ 2 ( λ ) ) . 当 λ ∈ ( d i + 1 , d i ) \lambda \in (d_{i + 1}, d_i) λ ∈ ( d i + 1 , d i ) 时, Ψ 1 ( λ ) \Psi_1(\lambda) Ψ 1 ( λ ) 为所有正项的和, Ψ 2 ( λ ) \Psi_2(\lambda) Ψ 2 ( λ ) 为所有负项的和, 因此它们都可以较精确地计算. 但如果把它们加在一起时可能会引起对消, 从而可能失去相对精度. 因此我们将 h ( λ ) h(\lambda) h ( λ ) 相应地写成
h ( λ ) = 1 + α ( h 1 ( λ ) + h 2 ( λ ) ) , h (\lambda) = 1 + \alpha \big (h _ {1} (\lambda) + h _ {2} (\lambda) \big), h ( λ ) = 1 + α ( h 1 ( λ ) + h 2 ( λ ) ) , 其中
h 1 ( λ ) = c 1 d i − λ + c ^ 1 , h 2 ( λ ) = c 2 d i + 1 − λ + c ^ 2 h _ {1} (\lambda) = \frac {c _ {1}}{d _ {i} - \lambda} + \hat {c} _ {1}, \quad h _ {2} (\lambda) = \frac {c _ {2}}{d _ {i + 1} - \lambda} + \hat {c} _ {2} h 1 ( λ ) = d i − λ c 1 + c ^ 1 , h 2 ( λ ) = d i + 1 − λ c 2 + c ^ 2 满足
h 1 ( λ ~ ) = Ψ 1 ( λ ~ ) , h 1 ′ ( λ ~ ) = Ψ 1 ′ ( λ ~ ) , h _ {1} (\tilde {\lambda}) = \Psi_ {1} (\tilde {\lambda}), \quad h _ {1} ^ {\prime} (\tilde {\lambda}) = \Psi_ {1} ^ {\prime} (\tilde {\lambda}), h 1 ( λ ~ ) = Ψ 1 ( λ ~ ) , h 1 ′ ( λ ~ ) = Ψ 1 ′ ( λ ~ ) , h 2 ( λ ~ ) = Ψ 2 ( λ ~ ) , h 2 ′ ( λ ~ ) = Ψ 2 ′ ( λ ~ ) . h _ {2} (\tilde {\lambda}) = \Psi_ {2} (\tilde {\lambda}), \quad h _ {2} ^ {\prime} (\tilde {\lambda}) = \Psi_ {2} ^ {\prime} (\tilde {\lambda}). h 2 ( λ ~ ) = Ψ 2 ( λ ~ ) , h 2 ′ ( λ ~ ) = Ψ 2 ′ ( λ ~ ) . 即 h 1 ( λ ) h_1(\lambda) h 1 ( λ ) 和 h 2 ( λ ) h_2(\lambda) h 2 ( λ ) 分别是 Ψ 1 ( λ ) \Psi_1(\lambda) Ψ 1 ( λ ) 和 Ψ 2 ( λ ) \Psi_2(\lambda) Ψ 2 ( λ ) 的一次Hermite插值函数. 通过直接计算可得
{ c 1 = Ψ 1 ′ ( λ ~ ) ( d i − λ ~ ) 2 , c ^ 1 = Ψ 1 ( λ ~ ) − Ψ 1 ′ ( λ ~ ) ( d i − λ ~ ) , c 2 = Ψ 2 ′ ( λ ~ ) ( d i + 1 − λ ~ ) 2 , c ^ 2 = Ψ 2 ( λ ~ ) − Ψ 2 ′ ( λ ~ ) ( d i + 1 − λ ~ ) . (5.3) \left\{ \begin{array}{l} c _ {1} = \Psi_ {1} ^ {\prime} (\tilde {\lambda}) \left(d _ {i} - \tilde {\lambda}\right) ^ {2}, \quad \hat {c} _ {1} = \Psi_ {1} (\tilde {\lambda}) - \Psi_ {1} ^ {\prime} (\tilde {\lambda}) \left(d _ {i} - \tilde {\lambda}\right), \\ c _ {2} = \Psi_ {2} ^ {\prime} (\tilde {\lambda}) \left(d _ {i + 1} - \tilde {\lambda}\right) ^ {2}, \quad \hat {c} _ {2} = \Psi_ {2} (\tilde {\lambda}) - \Psi_ {2} ^ {\prime} (\tilde {\lambda}) \left(d _ {i + 1} - \tilde {\lambda}\right). \end{array} \right. \tag {5.3} ⎩ ⎨ ⎧ c 1 = Ψ 1 ′ ( λ ~ ) ( d i − λ ~ ) 2 , c ^ 1 = Ψ 1 ( λ ~ ) − Ψ 1 ′ ( λ ~ ) ( d i − λ ~ ) , c 2 = Ψ 2 ′ ( λ ~ ) ( d i + 1 − λ ~ ) 2 , c ^ 2 = Ψ 2 ( λ ~ ) − Ψ 2 ′ ( λ ~ ) ( d i + 1 − λ ~ ) . ( 5.3 ) 所以
h ( λ ) = 1 + α ( c ^ 1 + c ^ 2 ) + α ( c 1 d i − λ + c 2 d i + 1 − λ ) . (5.4) h (\lambda) = 1 + \alpha \left(\hat {c} _ {1} + \hat {c} _ {2}\right) + \alpha \left(\frac {c _ {1}}{d _ {i} - \lambda} + \frac {c _ {2}}{d _ {i + 1} - \lambda}\right). \tag {5.4} h ( λ ) = 1 + α ( c ^ 1 + c ^ 2 ) + α ( d i − λ c 1 + d i + 1 − λ c 2 ) . ( 5.4 ) 这就是迭代函数.
算法5.6.修正的Newton算法 1: set k = 0 k = 0 k = 0 2: choose an initial guess λ 0 ∈ [ d i + 1 , d i ] \lambda_0\in [d_{i + 1},d_i] λ 0 ∈ [ d i + 1 , d i ] 3: while not convergence do 4: let λ ~ = λ k \tilde{\lambda} = \lambda_{k} λ ~ = λ k and compute c 1 , c 2 , c ^ 1 , c ^ 2 c_{1}, c_{2}, \hat{c}_{1}, \hat{c}_{2} c 1 , c 2 , c ^ 1 , c ^ 2 from (5.1) 5: set k = k + 1 k = k + 1 k = k + 1
6: compute the solution λ k \lambda_{k} λ k of h ( λ ) h(\lambda) h ( λ ) defined by (5.2) 7: end while
(3) 计算特征向量的稳定算法 设 λ i \lambda_{i} λ i 是 D + α u u ⊤ D + \alpha uu^{\top} D + αu u ⊤ 的特征值, 则根据引理5.9, 可利用公式 ( D − λ i I ) − 1 u (D - \lambda_{i}I)^{-1}u ( D − λ i I ) − 1 u 来计算其对应的特征向量. 但遗憾的是, 当相邻的两个特征值非常接近时, 这个公式可能不稳定. 如果 λ i \lambda_{i} λ i 与 λ i + 1 \lambda_{i+1} λ i + 1 非常接近, 则它们都很接近 d i + 1 d_{i+1} d i + 1 (这里假定 λ i ∈ ( d i + 1 , d i ) \lambda_{i} \in (d_{i+1}, d_{i}) λ i ∈ ( d i + 1 , d i ) , λ i + 1 ∈ ( d i + 2 , d i + 1 ) \lambda_{i+1} \in (d_{i+2}, d_{i+1}) λ i + 1 ∈ ( d i + 2 , d i + 1 ) ), 此时计算 d i + 1 − λ i d_{i+1} - \lambda_{i} d i + 1 − λ i 和 d i + 1 − λ i + 1 d_{i+1} - \lambda_{i+1} d i + 1 − λ i + 1 可能会存在对消情形, 从而有可能会损失有效数字, 产生较大的相对误差. 这样就导致 ( D − λ i I ) − 1 u (D - \lambda_{i}I)^{-1}u ( D − λ i I ) − 1 u 与 ( D − λ i + 1 I ) − 1 u (D - \lambda_{i+1}I)^{-1}u ( D − λ i + 1 I ) − 1 u 的计算精度下降, 从而使得特征向量之间的正交性也因此而失去.
下面的定理可以解决这个问题. 详情参见 [64, 146].
定理5.10 (Löwner) 设对角阵 D = d i a g ( d 1 , d 2 , … , d n ) D = \mathrm{diag}(d_1, d_2, \ldots, d_n) D = diag ( d 1 , d 2 , … , d n ) 满足 d 1 > d 2 > ⋯ > d n d_1 > d_2 > \dots > d_n d 1 > d 2 > ⋯ > d n . 若矩阵 D ^ = D + u ^ u ^ ⊤ \hat{D} = D + \hat{u}\hat{u}^{\top} D ^ = D + u ^ u ^ ⊤ 的特征值 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n 满足交错性质
λ 1 > d 1 > λ 2 > d 2 > ⋯ > λ n > d n , (5.5) \lambda_ {1} > d _ {1} > \lambda_ {2} > d _ {2} > \dots > \lambda_ {n} > d _ {n}, \tag {5.5} λ 1 > d 1 > λ 2 > d 2 > ⋯ > λ n > d n , ( 5.5 ) 则向量 u ^ \hat{u} u ^ 的分量满足
∣ u ^ i ∣ = ( ∏ k = 1 n ( λ k − d i ) ∏ k = 1 , k ≠ i n ( d k − d i ) ) 1 / 2 . (5.6) \left| \hat {u} _ {i} \right| = \left(\frac {\prod_ {k = 1} ^ {n} \left(\lambda_ {k} - d _ {i}\right)}{\prod_ {k = 1 , k \neq i} ^ {n} \left(d _ {k} - d _ {i}\right)}\right) ^ {1 / 2}. \tag {5.6} ∣ u ^ i ∣ = ( ∏ k = 1 , k = i n ( d k − d i ) ∏ k = 1 n ( λ k − d i ) ) 1/2 . ( 5.6 ) (留作课外自习)
证明. 由引理5.8可知 D ^ \hat{D} D ^ 的特征多项式为 (假设 λ ≠ d i , i = 1 , 2 , … , n \lambda \neq d_{i}, i = 1,2,\dots,n λ = d i , i = 1 , 2 , … , n )
p ( λ ) = det ( D ^ − λ I ) = det ( D − λ I + u ^ u ^ T ) = det ( D − λ I ) ⋅ det ( I + ( D − λ I ) − 1 u ^ u ^ T ) = det ( D − λ I ) ⋅ ( 1 + u ^ ⊤ ( D − λ I ) − 1 u ^ ) = ( ∏ k = 1 n ( d k − λ ) ) ⋅ ( 1 + ∑ i = 1 n u ^ i 2 d i − λ ) = ∏ k = 1 n ( d k − λ ) + ∑ i = 1 n ( ∏ k = 1 , k ≠ i n ( d k − λ ) u ^ i 2 ) . (5.7) \begin{array}{l} p (\lambda) = \det (\hat {D} - \lambda I) = \det (D - \lambda I + \hat {u} \hat {u} ^ {\mathsf {T}}) \\ = \det (D - \lambda I) \cdot \det (I + (D - \lambda I) ^ {- 1} \hat {u} \hat {u} ^ {\mathsf {T}}) \\ = \det (D - \lambda I) \cdot \left(1 + \hat {u} ^ {\top} (D - \lambda I) ^ {- 1} \hat {u}\right) \\ = \left(\prod_ {k = 1} ^ {n} \left(d _ {k} - \lambda\right)\right) \cdot \left(1 + \sum_ {i = 1} ^ {n} \frac {\hat {u} _ {i} ^ {2}}{d _ {i} - \lambda}\right) \\ = \prod_ {k = 1} ^ {n} \left(d _ {k} - \lambda\right) + \sum_ {i = 1} ^ {n} \left(\prod_ {k = 1, k \neq i} ^ {n} \left(d _ {k} - \lambda\right) \hat {u} _ {i} ^ {2}\right). \tag {5.7} \\ \end{array} p ( λ ) = det ( D ^ − λ I ) = det ( D − λ I + u ^ u ^ T ) = det ( D − λ I ) ⋅ det ( I + ( D − λ I ) − 1 u ^ u ^ T ) = det ( D − λ I ) ⋅ ( 1 + u ^ ⊤ ( D − λ I ) − 1 u ^ ) = ( ∏ k = 1 n ( d k − λ ) ) ⋅ ( 1 + ∑ i = 1 n d i − λ u ^ i 2 ) = ∏ k = 1 n ( d k − λ ) + ∑ i = 1 n ( ∏ k = 1 , k = i n ( d k − λ ) u ^ i 2 ) . ( 5.7 ) 由于等式 ( \ref e q : 1 ) (\ref{eq:1}) ( \ref e q : 1 ) 两边都是关于 λ \lambda λ 的连续函数, 所以当 λ = d i \lambda = d_{i} λ = d i 时, 等式 ( \ref e q : 2 ) (\ref{eq:2}) ( \ref e q : 2 ) 仍然成立.
又 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n 是 D ^ \hat{D} D ^ 的特征值,所以特征多项式也可以写成 p ( λ ) = ∏ k = 1 n ( λ k − λ ) p(\lambda) = \prod_{k=1}^{n} (\lambda_k - \lambda) p ( λ ) = ∏ k = 1 n ( λ k − λ ) ,即
det ( D ^ − λ I ) = ∏ k = 1 n ( λ k − λ ) . \det (\hat {D} - \lambda I) = \prod_ {k = 1} ^ {n} (\lambda_ {k} - \lambda). det ( D ^ − λ I ) = k = 1 ∏ n ( λ k − λ ) . 取 λ = d i \lambda = d_{i} λ = d i ,则由 det ( D ^ − λ I ) \operatorname{det}(\hat{D} - \lambda I) det ( D ^ − λ I ) 的两个表达式可得
∏ k = 1 , k ≠ i n ( d k − d i ) u ^ i 2 = ∏ k = 1 n ( λ k − d i ) , \prod_ {k = 1, k \neq i} ^ {n} (d _ {k} - d _ {i}) \hat {u} _ {i} ^ {2} = \prod_ {k = 1} ^ {n} (\lambda_ {k} - d _ {i}), k = 1 , k = i ∏ n ( d k − d i ) u ^ i 2 = k = 1 ∏ n ( λ k − d i ) , 即
u ^ i 2 = ∏ k = 1 n ( λ k − d i ) ∏ k = 1 , k ≠ i n ( d k − d i ) . \hat {u} _ {i} ^ {2} = \frac {\prod_ {k = 1} ^ {n} (\lambda_ {k} - d _ {i})}{\prod_ {k = 1 , k \neq i} ^ {n} (d _ {k} - d _ {i})}. u ^ i 2 = ∏ k = 1 , k = i n ( d k − d i ) ∏ k = 1 n ( λ k − d i ) . 由交错性质可知,上式右边是正的,故定理结论成立
设 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n 是 D + α u u T D + \alpha uu^{\mathsf{T}} D + αu u T 的特征值,且满足交错性质 (5.3). 假定 α > 0 \alpha > 0 α > 0 ,则根据定理 5.10 可知,向量 α u \sqrt{\alpha} u α u 的分量满足 (5.4).
思考:如果 α < 0 \alpha < 0 α < 0 ,结论会是怎样?
因此, 我们可以采用公式 (5.4) 来计算特征向量. 这样就尽可能地避免了出现分母很小的情形.
下面是计算矩阵 D + u u T D + uu^{\mathsf{T}} D + u u T 的特征值和特征向量的稳定算法
算法5.7. 计算矩阵 D + u u T D + uu^{\mathsf{T}} D + u u T 的特征值和特征向量的稳定算法 1: Compute the eigenvalues λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n by solving f ( λ ) = 0 f(\lambda) = 0 f ( λ ) = 0 2: Compute u ^ i \hat{u}_i u ^ i by Lowner Theorem so that λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \ldots, \lambda_n λ 1 , λ 2 , … , λ n are the exact eigenvalues of D + u ^ u ^ T D + \hat{u}\hat{u}^{\mathsf{T}} D + u ^ u ^ T . 3: Compute the eigenvectors of D + u ^ u ^ T D + \hat{u}\hat{u}^{\mathsf{T}} D + u ^ u ^ T by Lemma 5.9.
通过分析可以说明上述算法计算出来的 D + u ^ u ^ T D + \hat{u}\hat{u}^{\mathrm{T}} D + u ^ u ^ T 的特征值和特征值向量是非常精确的, 这意味着该算法是数值稳定的. 同时, D + u ^ u ^ T D + \hat{u}\hat{u}^{\mathrm{T}} D + u ^ u ^ T 与原矩阵 D + u u T D + uu^{\mathrm{T}} D + u u T 具有相同的特征值和特征向量, 见习题5.4.
箭型分而治之法 分而治之算法于1981年被首次提出, 但直到1995年才由Gu和Eisenstat给出了一种快速稳定的实现方式, 称为箭型分而治之法 (Arrowhead Divide-and-Conquer, ADC). 他们做了大量的数值试验, 在试验中, 当矩阵规模不超过6时, 就采用对称QR迭代来计算特征值和特征向量. 在对特征方程求解时, 他们采用的是修正的有理逼近法. 数值结果表明, ADC算法的计算精度可以与其他算法媲美, 而计算速度通常比对称QR迭代快5至10倍, 比Cuppen的分而治之法快2倍. 详细介绍见[65, 66].