5.4_分而治之法

5.4 分而治之法

分而治之 (Divide-and-Conquer, DC) 算法是由 Cuppen [28] 于 1981 年首次提出, 但直到 1995 年才出现稳定的实现方式 [66]. 该算法是目前计算大规模矩阵的所有特征值和特征向量的最快算法. 下面我们介绍该算法.

考虑不可约对称三对角矩阵

T=[a1b1b1am1bm1bm1ambmbmam+1bm+1bm+1bn1bn1an]=[a1b1b1am1bm1bm1ambmam+1bmbm+1bm+1bn1bn1]+[bmbmbmbmbn1]=[T100T2]+bmvvT,\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}

其中 v=[0,,0,1,1,0,,0]Tv = [0,\dots ,0,1,1,0,\dots ,0]^{\mathsf{T}} .假定 T1T_{1}T2T_{2} 的特征值分解已经计算出来了,即 T1=Q1Λ1Q1T,T_{1} = Q_{1}\Lambda_{1}Q_{1}^{\mathsf{T}}, T2=Q2Λ2Q2TT_{2} = Q_{2}\Lambda_{2}Q_{2}^{\mathsf{T}} ,下面考虑 TT 的特征值分解.

引理5.8 设 x,yRnx, y \in \mathbb{R}^n ,则 det(I+xyT)=1+yTx\operatorname*{det}(I + xy^{\mathsf{T}}) = 1 + y^{\mathsf{T}}x

(留作练习)

我们首先考虑 TT 的特征值与 T1T_{1}T2T_{2} 的特征值之间的关系

T=[T100T2]+bmvvT=[Q1Λ1Q1T00Q2Λ2Q2T]+bmvvT=[Q100Q2]([Λ100Λ2]+bmuuT)[Q100Q2]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}

其中

u=[Q100Q2]Tv=[Q1T的 最 后 一 列Q2T的 第 一 列].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].

α=bm,D=diag(Λ1,Λ2)=diag(d1,d2,,dn)\alpha = b_{m}, D = \mathrm{diag}(\Lambda_{1},\Lambda_{2}) = \mathrm{diag}(d_{1},d_{2},\ldots ,d_{n}) ,并假定 d1d2dnd_1\geq d_2\geq \dots \geq d_n .则 TT 的特征值与 D+αuuTD + \alpha uu^{\mathsf{T}} 的特征值相同.

下面计算 D+αuuD + \alpha uu^{\top} 的特征值.设 λ\lambdaD+αuuD + \alpha uu^{\top} 的一个特征值,若 DλID - \lambda I 非奇异,则

det(D+αuuTλI)=det(DλI)det(I+α(DλI)1uuT).\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(I+α(DλI)1uuT)=0.\operatorname{det}(I + \alpha (D - \lambda I)^{-1}uu^{\mathsf{T}}) = 0. 又由引理5.8可知

det(I+α(DλI)1uuT)=1+αuT(DλI)1u=1+αi=1nui2diλ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).

故求 AA 的特征值等价于求特征方程 (secular equation) f(λ)=0f(\lambda) = 0 的根. 由于

f(λ)=αi=1nui2(diλ)2,f ^ {\prime} (\lambda) = \alpha \sum_ {i = 1} ^ {n} \frac {u _ {i} ^ {2}}{(d _ {i} - \lambda) ^ {2}},

当所有的 did_{i} 都互不相同, 且所有的 uiu_{i} 都不为零时, f(λ)f(\lambda)λdi\lambda \neq d_{i} 处都是严格单调的 (见下图).


图5.1. f(λ)=1+0.5(14λ+13λ+12λ+11λ)f(\lambda) = 1 + 0.5\left(\frac{1}{4 - \lambda} +\frac{1}{3 - \lambda} +\frac{1}{2 - \lambda} +\frac{1}{1 - \lambda}\right) 的图像

所以 f(λ)f(\lambda) 在每个区间 (di+1,di)(d_{i + 1},d_i) 内都有一个根, 共 n1n - 1 个, 另一个根在 (d1,)(d_1,\infty) (若 α>0\alpha >0 ) 或 (,dn)(- \infty ,d_n) (若 α<0\alpha < 0 ) 中. 由于 f(λ)f(\lambda) 在每个区间 (di+1,di)(d_{i + 1},d_i) 内光滑且严格单调递增 (α>0)(\alpha >0) 或递减 (α<0)(\alpha < 0) , 所以在实际计算中, 可以使用对分法, 牛顿类方法, 或有理逼近等算法来求解. 通常都能很快收敛, 一般只需迭代几步即可. 因此, 计算一个特征值的运算量约为 O(n)\mathcal{O}(n) , 计算 D+αuuD + \alpha uu^{\top} 的所有特征值的运算量约为 O(n2)\mathcal{O}(n^2) .

当所有特征值计算出来后, 我们可以利用下面的引理来计算特征向量.

引理5.9设 DRn×nD\in \mathbb{R}^{n\times n} 为对角矩阵, uRnu\in \mathbb{R}^nαR,\alpha \in \mathbb{R},λ\lambdaD+αuuD + \alpha uu^{\top} 的特征值,且 λdi,\lambda \neq d_{i}, (20 i=1,2,,n,i = 1,2,\ldots ,n,(DλI)1u(D - \lambda I)^{-1}u 是其对应的特征向量. (板书)

证明. 由引理5.8可知

0=det(D+αuuTλI)=det(DλI)det(I+α(DλI)1uuT)=det(DλI)(1+αuT(DλI)1u),\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}

1+αuT(DλI)1u=01 + \alpha u^{\mathsf{T}}(D - \lambda I)^{-1}u = 0 ,即 αuT(DλI)1u=1.\alpha u^{\mathsf{T}}(D - \lambda I)^{-1}u = -1. 直接计算可得

(D+αuuT)((DλI)1u)=(DλI+λI+αuuT)(DλI)1u=u+λ(DλI)1u+(αuT(DλI)1u)u=u+λ(DλI)1uu=λ(DλI)1u,\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}

即引理结论成立.

算法5.5.计算对称三对角矩阵的特征值和特征向量的分而治之法(函数形式)

1: function [Q,Λ]=eig_dc(T)%T=QΛQ[Q, \Lambda] = \mathbf{eig\_dc}(T) \quad \% T = Q\Lambda Q^{\top}
2: if TT is of 1×11 \times 1 then
3: Q=1,Λ=TQ = 1, \Lambda = T
4: return
5: end if
6: form T=[T100T2]+bmvvTT = \left[ \begin{array}{cc}T_{1} & 0\\ 0 & T_{2} \end{array} \right] + b_{m}vv^{\mathsf{T}}
7: [Q1,Λ1]=eig_dc(T1)[Q_1, \Lambda_1] = \mathbf{eig\_dc}(T_1)
8: [Q2,Λ2]=eig_dc(T2)[Q_2, \Lambda_2] = \mathbf{eig\_dc}(T_2)
9: form D+αuuTD + \alpha uu^{\mathsf{T}} from Λ1,Λ2,Q1,Q2\Lambda_1, \Lambda_2, Q_1, Q_2
10: compute the eigenvalues Λ\Lambda and eigenvectors Q^\hat{Q} of D+αuuTD + \alpha uu^{\mathsf{T}}
11: compute the eigenvectors of TT with Q=[Q100Q2]Q^Q = \begin{bmatrix} Q_1 & 0 \\ 0 & Q_2 \end{bmatrix} \cdot \hat{Q}
12: end

在分而治之法中, 特征值和特征向量是同时计算的.

实施细节

在实际使用分而治之算法时, 我们需要考虑以下几个细节问题:

(1) 如何减小运算量;
(2) 如何求解特征方程 f(λ)=0f(\lambda) = 0
(3) 如何稳定地计算特征向量.

(1) 如何减小运算量——收缩技巧 (deflation)

分而治之算法的计算复杂性分析: 用 t(n)t(n) 表示对 nn 阶矩阵调用函数 eig_dc 的运算量, 则

t(n)=2t(n/2)t(n) = 2t(n / 2) 递归调用DC算法两次
+O(n²) 计算D+αuu的特征值和特征向量
+cn3+c\cdot n^{3} 计算 QQ

如果计算 QQ 时使用的是稠密矩阵乘法, 则 c=2c = 2 ;

若不计 O(n2)\mathcal{O}(n^2) 项, 则由递归公式 t(n)=2t(n/2)+cn3t(n) = 2t(n / 2) + c\cdot n^{3} 可得 t(n)c4n3/3.t(n)\approx c\cdot 4n^{3} / 3.

但事实上, 由于收缩 (deflation) 现象的存在, 常数 cc 通常比 1 小得多.

在前面的算法描述过程中, 我们假定 did_{i} 互不相等且 uiu_{i} 不能为零. 事实上, 容易证明当 di=di+1d_{i} = d_{i + 1}ui=0u_{i} = 0 时, did_{i} 即为 D+αuuTD + \alpha uu^{\mathsf{T}} 的特征值, 这种现象我们称为收缩 (deflation). 在实际计算时, 当 didi+1d_{i} - d_{i + 1}ui|u_{i}| 小于一个给定的阈值时, 我们就近似认为 did_{i}D+αuuTD + \alpha uu^{\mathsf{T}} 的特征值, 即出现收缩现象.

在实际计算中, 收缩现象会经常发生, 而且非常频繁, 所以我们可以而且应该利用这种优点加快分而治之算法的速度 [28, 110].

由于主要的计算量集中在计算 QQ ,即算法最后一步的矩阵乘积.如果 ui=0u_{i} = 0 ,则 did_{i} 为特征值,其对应的特征向量为 eie_i ,即 Q^\hat{Q} 的第 ii 列为 eie_i ,故计算 QQ 的第 ii 列时不需要做任何的计算.当 di=di+1d_{i} = d_{i + 1} 时,也存在一个类似的简化.

(2) 特征方程求解

通常我们可以使用牛顿法来计算特征方程 f(λ)=0f(\lambda) = 0 的解

didi+1d_{i} \neq d_{i+1}ui0u_{i} \neq 0 时, 我们用牛顿法计算 f(λ)f(\lambda)(di+1,di)(d_{i+1}, d_{i}) 中的零点 λi\lambda_{i} . 如果 ui|u_{i}| 小于给定的阈值时, 我们可直接将 did_{i} 作为特征值 λi\lambda_{i} 的一个近似. 但当 uiu_{i} 很小 (却大于给定的阈值) 时, 此时 f(λ)f(\lambda) 在区间 [di+1,di][d_{i+1}, d_{i}] 中的大部分处的斜率几乎为 0 (见图 5.2). 这时, 如果任取 [di+1,di][d_{i+1}, d_{i}] 中的一个点作为迭代初始点, 经过一次牛顿迭代后, 迭代解可能会跑到区间 [di+1,di][d_{i+1}, d_{i}] 的外面, 造成不收敛.


图5.2. f(λ)=1+0.005(14λ+13λ+12λ+11λ)f(\lambda) = 1 + 0.005\left(\frac{1}{4 - \lambda} +\frac{1}{3 - \lambda} +\frac{1}{2 - \lambda} +\frac{1}{1 - \lambda}\right) 的图像

这时需要采用修正的牛顿法. 假设我们已经计算出 λi\lambda_{i} 的一个近似 λ~\tilde{\lambda} , 下面我们需要从 λ~\tilde{\lambda} 出发, 利用牛顿迭代计算下一个近似, 直至收敛. 我们知道牛顿法的基本原理是使用 f(λ)f(\lambda) 在点 λ~\tilde{\lambda} 的切线来近似 f(λ)f(\lambda) , 并将切线的零点作为下一个近似, 即用切线来近似曲线 f(λ)f(\lambda) .

uiu_{i} 很小时, 这种近似方法可能会出现问题. 这时, 我们需要寻求用其它简单函数 h(λ)h(\lambda) (不一定是直线) 来近似 f(λ)f(\lambda) , 然后用 h(λ)h(\lambda) 的零点作为 f(λ)f(\lambda) 零点的近似, 并不断迭代下去, 直至收敛.

关于 h(λ)h(\lambda) 的选取,通常需要满足以下几个要求:(1) h(λ)h(\lambda) 必须容易构造;(2) h(λ)h(\lambda) 的零点容易计算;(3) h(λ)h(\lambda) 尽可能地与 f(λ)f(\lambda) 相近.

当然, 这样的 h(λ)h(\lambda) 有多种不同的构造方法. 这里介绍其中的一种方法. 假定我们需要计算的是 f(λ)f(\lambda)(di+1,di)(d_{i+1}, d_i) 中的零点 λi\lambda_i . 因为 did_idi+1d_{i+1}f(λ)f(\lambda) 的奇点, 所以我们令

h(λ)=c1diλ+c2di+1λ+c3,h (\lambda) = \frac {c _ {1}}{d _ {i} - \lambda} + \frac {c _ {2}}{d _ {i + 1} - \lambda} + c _ {3},

其中 c1,c2,c3c_{1}, c_{2}, c_{3} 是待定的参数. 显然, h(λ)h(\lambda) 的零点很容易计算, 只需求解一个一元二次方程即可, 运算量与牛顿法相差无几. 选取参数 c1,c2,c3c_{1}, c_{2}, c_{3} 的基本原则是使得 h(λ)h(\lambda)λ~\tilde{\lambda} 附近尽可能地接近 f(λ)f(\lambda) . 又 f(λ)f(\lambda) 可写为

f(λ)=1+αk=1nuk2dkλ=1+α(k=1iuk2dkλ+k=i+1nuk2dkλ)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).

λ(di+1,di)\lambda \in (d_{i + 1}, d_i) 时, Ψ1(λ)\Psi_1(\lambda) 为所有正项的和, Ψ2(λ)\Psi_2(\lambda) 为所有负项的和, 因此它们都可以较精确地计算. 但如果把它们加在一起时可能会引起对消, 从而可能失去相对精度. 因此我们将 h(λ)h(\lambda) 相应地写成

h(λ)=1+α(h1(λ)+h2(λ)),h (\lambda) = 1 + \alpha \big (h _ {1} (\lambda) + h _ {2} (\lambda) \big),

其中

h1(λ)=c1diλ+c^1,h2(λ)=c2di+1λ+c^2h _ {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}

满足

h1(λ~)=Ψ1(λ~),h1(λ~)=Ψ1(λ~),h _ {1} (\tilde {\lambda}) = \Psi_ {1} (\tilde {\lambda}), \quad h _ {1} ^ {\prime} (\tilde {\lambda}) = \Psi_ {1} ^ {\prime} (\tilde {\lambda}),
h2(λ~)=Ψ2(λ~),h2(λ~)=Ψ2(λ~).h _ {2} (\tilde {\lambda}) = \Psi_ {2} (\tilde {\lambda}), \quad h _ {2} ^ {\prime} (\tilde {\lambda}) = \Psi_ {2} ^ {\prime} (\tilde {\lambda}).

h1(λ)h_1(\lambda)h2(λ)h_2(\lambda) 分别是 Ψ1(λ)\Psi_1(\lambda)Ψ2(λ)\Psi_2(\lambda) 的一次Hermite插值函数. 通过直接计算可得

{c1=Ψ1(λ~)(diλ~)2,c^1=Ψ1(λ~)Ψ1(λ~)(diλ~),c2=Ψ2(λ~)(di+1λ~)2,c^2=Ψ2(λ~)Ψ2(λ~)(di+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}

所以

h(λ)=1+α(c^1+c^2)+α(c1diλ+c2di+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}

这就是迭代函数.

算法5.6.修正的Newton算法

1: set k=0k = 0
2: choose an initial guess λ0[di+1,di]\lambda_0\in [d_{i + 1},d_i]
3: while not convergence do
4: let λ~=λk\tilde{\lambda} = \lambda_{k} and compute c1,c2,c^1,c^2c_{1}, c_{2}, \hat{c}_{1}, \hat{c}_{2} from (5.1)
5: set k=k+1k = k + 1

6: compute the solution λk\lambda_{k} of h(λ)h(\lambda) defined by (5.2)
7: end while

(3) 计算特征向量的稳定算法

λi\lambda_{i}D+αuuD + \alpha uu^{\top} 的特征值, 则根据引理5.9, 可利用公式 (DλiI)1u(D - \lambda_{i}I)^{-1}u 来计算其对应的特征向量. 但遗憾的是, 当相邻的两个特征值非常接近时, 这个公式可能不稳定. 如果 λi\lambda_{i}λi+1\lambda_{i+1} 非常接近, 则它们都很接近 di+1d_{i+1} (这里假定 λi(di+1,di)\lambda_{i} \in (d_{i+1}, d_{i}) , λi+1(di+2,di+1)\lambda_{i+1} \in (d_{i+2}, d_{i+1}) ), 此时计算 di+1λid_{i+1} - \lambda_{i}di+1λi+1d_{i+1} - \lambda_{i+1} 可能会存在对消情形, 从而有可能会损失有效数字, 产生较大的相对误差. 这样就导致 (DλiI)1u(D - \lambda_{i}I)^{-1}u(Dλi+1I)1u(D - \lambda_{i+1}I)^{-1}u 的计算精度下降, 从而使得特征向量之间的正交性也因此而失去.

下面的定理可以解决这个问题. 详情参见 [64, 146].

定理5.10 (Löwner) 设对角阵 D=diag(d1,d2,,dn)D = \mathrm{diag}(d_1, d_2, \ldots, d_n) 满足 d1>d2>>dnd_1 > d_2 > \dots > d_n . 若矩阵 D^=D+u^u^\hat{D} = D + \hat{u}\hat{u}^{\top} 的特征值 λ1,λ2,,λn\lambda_1, \lambda_2, \ldots, \lambda_n 满足交错性质

λ1>d1>λ2>d2>>λn>dn,(5.5)\lambda_ {1} > d _ {1} > \lambda_ {2} > d _ {2} > \dots > \lambda_ {n} > d _ {n}, \tag {5.5}

则向量 u^\hat{u} 的分量满足

u^i=(k=1n(λkdi)k=1,kin(dkdi))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}

(留作课外自习)

证明. 由引理5.8可知 D^\hat{D} 的特征多项式为 (假设 λdi,i=1,2,,n\lambda \neq d_{i}, i = 1,2,\dots,n )

p(λ)=det(D^λI)=det(DλI+u^u^T)=det(DλI)det(I+(DλI)1u^u^T)=det(DλI)(1+u^(DλI)1u^)=(k=1n(dkλ))(1+i=1nu^i2diλ)=k=1n(dkλ)+i=1n(k=1,kin(dkλ)u^i2).(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}

由于等式 (\refeq:1)(\ref{eq:1}) 两边都是关于 λ\lambda 的连续函数, 所以当 λ=di\lambda = d_{i} 时, 等式 (\refeq:2)(\ref{eq:2}) 仍然成立.

λ1,λ2,,λn\lambda_1, \lambda_2, \ldots, \lambda_nD^\hat{D} 的特征值,所以特征多项式也可以写成 p(λ)=k=1n(λkλ)p(\lambda) = \prod_{k=1}^{n} (\lambda_k - \lambda) ,即

det(D^λI)=k=1n(λkλ).\det (\hat {D} - \lambda I) = \prod_ {k = 1} ^ {n} (\lambda_ {k} - \lambda).

λ=di\lambda = d_{i} ,则由 det(D^λI)\operatorname{det}(\hat{D} - \lambda I) 的两个表达式可得

k=1,kin(dkdi)u^i2=k=1n(λkdi),\prod_ {k = 1, k \neq i} ^ {n} (d _ {k} - d _ {i}) \hat {u} _ {i} ^ {2} = \prod_ {k = 1} ^ {n} (\lambda_ {k} - d _ {i}),

u^i2=k=1n(λkdi)k=1,kin(dkdi).\hat {u} _ {i} ^ {2} = \frac {\prod_ {k = 1} ^ {n} (\lambda_ {k} - d _ {i})}{\prod_ {k = 1 , k \neq i} ^ {n} (d _ {k} - d _ {i})}.

由交错性质可知,上式右边是正的,故定理结论成立

λ1,λ2,,λn\lambda_1, \lambda_2, \ldots, \lambda_nD+αuuTD + \alpha uu^{\mathsf{T}} 的特征值,且满足交错性质 (5.3). 假定 α>0\alpha > 0 ,则根据定理 5.10 可知,向量 αu\sqrt{\alpha} u 的分量满足 (5.4).

思考:如果 α<0\alpha < 0 ,结论会是怎样?

因此, 我们可以采用公式 (5.4) 来计算特征向量. 这样就尽可能地避免了出现分母很小的情形.

下面是计算矩阵 D+uuTD + uu^{\mathsf{T}} 的特征值和特征向量的稳定算法

算法5.7. 计算矩阵 D+uuTD + uu^{\mathsf{T}} 的特征值和特征向量的稳定算法

1: Compute the eigenvalues λ1,λ2,,λn\lambda_1, \lambda_2, \ldots, \lambda_n by solving f(λ)=0f(\lambda) = 0
2: Compute u^i\hat{u}_i by Lowner Theorem so that λ1,λ2,,λn\lambda_1, \lambda_2, \ldots, \lambda_n are the exact eigenvalues of D+u^u^TD + \hat{u}\hat{u}^{\mathsf{T}} .
3: Compute the eigenvectors of D+u^u^TD + \hat{u}\hat{u}^{\mathsf{T}} by Lemma 5.9.

通过分析可以说明上述算法计算出来的 D+u^u^TD + \hat{u}\hat{u}^{\mathrm{T}} 的特征值和特征值向量是非常精确的, 这意味着该算法是数值稳定的. 同时, D+u^u^TD + \hat{u}\hat{u}^{\mathrm{T}} 与原矩阵 D+uuTD + uu^{\mathrm{T}} 具有相同的特征值和特征向量, 见习题5.4.

箭型分而治之法

分而治之算法于1981年被首次提出, 但直到1995年才由Gu和Eisenstat给出了一种快速稳定的实现方式, 称为箭型分而治之法 (Arrowhead Divide-and-Conquer, ADC). 他们做了大量的数值试验, 在试验中, 当矩阵规模不超过6时, 就采用对称QR迭代来计算特征值和特征向量. 在对特征方程求解时, 他们采用的是修正的有理逼近法. 数值结果表明, ADC算法的计算精度可以与其他算法媲美, 而计算速度通常比对称QR迭代快5至10倍, 比Cuppen的分而治之法快2倍. 详细介绍见[65, 66].