1. 计算特征值和特征向量

1.1 幂迭代法(The power iteration method)

在本节中,我们概述了一种计算可对角化矩阵的特征值和特征向量的技术。幂迭代(Power Iteration,PI)方法可能是计算矩阵一个特征值/特征向量对的最简单方法。它的收敛速度相对较慢,并且存在一些局限性。然而,我们在这里介绍它,因为它构成了许多其他更精细的特征值计算算法的基础。还有许多其他计算特征值和特征向量的技术,其中一些是为具有特殊结构的矩阵设计的,例如稀疏矩阵、带状矩阵或对称矩阵

ARn,n\bm{A} \in \mathbb{R} ^{n,n},假设A\bm{A}可对角化,并记λ1,,λn\lambda _1 ,\cdots , \lambda _nA\bm{A}的特征值,按模递减顺序排列,即λ1>λ2λn\lvert \lambda _1 \rvert > \lvert \lambda _2 \rvert \geq \cdots \geq \lvert \lambda _n \rvert(注意我们假设λ1\lvert \lambda _1 \rvert严格大于λ2\lvert \lambda _2 \rvert,即A\bm{A}有一个主导特征值)。由于A\bm{A}可对角化,我们可以将其写为A=UΛU1\bm{A} = \bm{U \Lambda U}^{-1},其中我们可以在不失一般性的情况下假设构成U\bm{U}列的特征向量u1,,un\bm{u}_1 , \cdots , \bm{u}_n已归一化,使得ui2=1\lVert \bm{u}_i \rVert_2 = 1。我们有Ak=UΛkU1\bm{A}^k = \bm{U} \bm{\Lambda}^k \bm{U}^{-1},那么

AkU=UΛk\bm{A}^k \bm{U} = \bm{U\Lambda}^k

现在令xCn\bm{x} \in \mathbb{C} ^n为随机选择的试验向量,且x2=1\lVert \bm{x} \rVert ^2 =1。由于U\bm{U}的列彼此线性无关,它们可以张成整个Cn\mathbb{C} ^{n}。可以定义x=Uw\bm{x} = \bm{Uw},并考虑

Akx=AkUw=UΛkw=i=1nwiλikui\bm{A}^k \bm{x} = \bm{A}^k\bm{Uw} = \bm{U\Lambda}^k \bm{w} = \sum_{i=1}^{n} w_i \lambda_i^k \bm{u}_i

请注意,如果随机选择x\bm{x},那么w\bm{w}的第一个元素w1w_1以概率11非零。将前面的表达式乘以和除以λ1k\lambda _1^k,我们可以得到

Akx=λ1ki=1nwi(λiλ1)kui=w1λ1k(u1+i=2nwiw1(λiλ1)kui)\bm{A}^k \bm{x} = \lambda _1^k \sum_{i=1}^{n} w_i \left( \frac{\lambda _i}{\lambda _1} \right)^k \bm{u}_i = w_1 \lambda _1^k \left( \bm{u}_1 + \sum_{i=2}^{n} \frac{w_i}{w_1} \left( \frac{\lambda _i}{\lambda _1} \right)^k \bm{u}_i \right)

也就是说,Akx\bm{A}^k \bm{x}u1\bm{u}_1的方向上有一个分量αku1\alpha _k \bm{u}_1,并且在u2,,un\bm{u}_2,\cdots ,\bm{u}_n的方向上有一个分量αkz\alpha _k \bm{z},即

Akx=αku1+αkz,αk=w1λ1kC,z=i=2nwiw1(λiλ1)kui\bm{A}^k \bm{x} = \alpha _k \bm{u}_1 + \alpha _k \bm{z}, \alpha _k = w_1 \lambda _1^k \in \mathbb{C} , \bm{z} = \sum_{i=2}^{n} \frac{w_i}{w_1} \left( \frac{\lambda _i}{\lambda _1} \right)^k \bm{u}_i

对于z\bm{z}分量的大小,设βi=wi/w1\beta _i = w_i / w_1,我们有

z2=i=2nβi(λiλ1)kui2i=2nβi(λiλ1)kui2=i=2nβiλiλ1kui2=i=2nβiλiλ1kλ2λ1ki=2nβi\begin{align*} \lVert \bm{z} \rVert_2 =& \left \lVert \sum_{i=2}^{n} \beta _i \left( \frac{\lambda _i}{\lambda _1} \right)^k \bm{u}_i \right \rVert_2 \leq \sum_{i=2}^{n} \left \lVert \beta _i \left( \frac{\lambda _i}{\lambda _1} \right)^k \bm{u}_i \right \rVert_2 \\ =& \sum_{i=2}^{n} \lvert \beta _i \rvert \left \lvert \frac{\lambda _i}{\lambda _1} \right \rvert^k \lVert \bm{u}_i \rVert_2 = \sum_{i=2}^{n} \lvert \beta _i \rvert \left \lvert \frac{\lambda _i}{\lambda _1} \right \rvert^k \\ \leq & \left \lvert \frac{\lambda _2}{\lambda _1} \right \rvert^k \sum_{i=2}^{n}\lvert \beta _i \rvert \end{align*}

最后的不等式是由特征值模的大小顺序得出的。由于λ2/λ1<1\lvert \lambda _2 / \lambda _1 \rvert < 1,我们有z\bm{z}分量的大小在kk \to \infty时趋于零,收敛速率由比值λ2/λ1\lvert \lambda _2 \rvert / \lvert \lambda _1 \rvert决定。因此Akxαku1\bm{A}^k \bm{x} \to \alpha _k \bm{u}_1,这意味着随着kk \to \inftyAkx\bm{A}^k \bm{x}趋向于与u1\bm{u}_1平行。因此,通过对向量Akx\bm{A}^k \bm{x}进行归一化,我们得到

limkAkxAkx2=u1\lim_{k \to \infty} \frac{\bm{A}^k \bm{x}}{\lVert \bm{A}^k \bm{x} \rVert_2} = \bm{u}_1

定义

x(k)=AkxAkx2x(k) = \frac{\bm{A}^k \bm{x}}{\lVert \bm{A}^k \bm{x} \rVert_2}

并且还注意到x(k)u1x(k) \to \bm{u}_1意味着Ax(k)Au1=λ1u1\bm{A}x(k) \to \bm{Au}_1 = \lambda _1 \bm{u}_1,因此x(k)Ax(k)λ1u1u1\bm{x}^\dagger(k)\bm{A} x(k) \to \lambda _1 \bm{u}^\dagger _1 \bm{u}_1\dagger表示厄米共轭,因为ui\bm{u}_i向量可以是复数值的)。因此,回想一下u1u1=u122=1\bm{u}^\dagger _1 \bm{u}_1 = \lVert \bm{u}_1 \rVert_2^2 = 1,我们有

limkx(k)Ax(k)=λ1\lim_{k \to \infty} \bm{x}^\dagger(k)\bm{A} x(k) = \lambda _1

也就是说,乘积x(k)Ax(k)\bm{x}^\dagger(k)\bm{A} x(k)会收敛到A\bm{A}的模最大的特征值

x(k)Ax(k)=(Akx)A(Akx)Akx22=(αku1+αkz)A(αku1+αkz)(αku1+αkz)(αku1+αkz)=(u1+z)A(u1+z)(u1+z)(u1+z)=u1Au1+u1Az+zAu1+zAzu1u1+u1z+zu1+zz=u1λ1u1+u1Az+zλ1u1+zAz1+u1z+zu1+zz=λ1+u1Az+zλ1u1+zAz1+u1z+zu1+zz\begin{align*} &x^\dagger (k)\bm{A} x(k) \\ =& \frac{(\bm{A}^k \bm{x})^\dagger\bm{A} (\bm{A}^k \bm{x})}{ \lVert \bm{A}^k \bm{x} \rVert_2^2} \\ =& \frac{(\alpha _k \bm{u}_1 + \alpha _k \bm{z})^\dagger \bm{A} (\alpha _k \bm{u}_1 + \alpha _k \bm{z})}{(\alpha _k \bm{u}_1 + \alpha _k \bm{z})(\alpha _k \bm{u}_1 + \alpha _k \bm{z})} \\ =& \frac{( \bm{u}_1 + \bm{z})^\dagger \bm{A} (\bm{u}_1 + \bm{z})}{( \bm{u}_1 + \bm{z})( \bm{u}_1 + \bm{z})} \\ =& \frac{\bm{u}^\dagger _1 \bm{A} \bm{u}_1 + \bm{u}^\dagger _1 \bm{A} \bm{z} + \bm{z}^\dagger \bm{A} \bm{u}_1 + \bm{z}^\dagger \bm{A} \bm{z}}{\bm{u}^\dagger _1 \bm{u}_1 + \bm{u}^\dagger _1 \bm{z} + \bm{z}^\dagger \bm{u}_1 + \bm{z}^\dagger \bm{z}} \\ =& \frac{\bm{u}^\dagger _1 \lambda _1 \bm{u}_1 + \bm{u}^\dagger _1 \bm{A} \bm{z} + \bm{z}^\dagger \lambda _1 \bm{u}_1 + \bm{z}^\dagger \bm{A} \bm{z}}{1 + \bm{u}^\dagger _1 \bm{z} + \bm{z}^\dagger \bm{u}_1 + \bm{z}^\dagger \bm{z}} \\ =& \frac{ \lambda _1 + \bm{u}^\dagger _1 \bm{A} \bm{z} + \bm{z}^\dagger \lambda _1 \bm{u}_1 + \bm{z}^\dagger \bm{A} \bm{z}}{1 + \bm{u}^\dagger _1 \bm{z} + \bm{z}^\dagger \bm{u}_1 + \bm{z}^\dagger \bm{z}} \end{align*}

其他项中u1\bm{u}_1A\bm{A}均不会随kk而变化,而z\bm{z}中含有(λi/λ1)k\left( \lambda _i / \lambda _1 \right)^k,因此kk \to \inftyz0\bm{z} \to \bm{0}。因此x(k)Ax(k)x^\dagger (k)\bm{A} x(k)会收敛到λ1\lambda _1,收敛速度由λ2/λ1\lvert \lambda _2 \rvert / \lvert \lambda _1 \rvert比例决定,并且以线性速度收敛

以上推理提出了以下迭代算法

algorithm1.png

算法总结:

  1. x\bm{x}可以任取,只需要满足x2=1\lVert \bm{x} \rVert_2=1便可以
  2. 不断对x\bm{x}左乘A\bm{A}并归一化便可以趋近于特征向量u1\bm{u} _1
  3. 在迭代的过程中xAxx^\dagger \bm{A} x也会趋近于标量λ1\lambda _1
  4. 这里在求解λ1\lambda _1时不需要再次对向量归一化,因为λ1\lambda _1并不参与迭代,它的取值不会影响迭代速度

幂迭代的一个主要优点是该算法主要依赖于矩阵与向量的乘法,因此可以利用A\bm{A}的任何特殊结构,例如稀疏性。幂迭代方法的两个主要缺点是

  1. 它只能求出一个特征值(模最大的那个)及其对应的特征向量
  2. 它的收敛速度取决于λ2/λ1\lvert \lambda _2 \rvert / \lvert \lambda _1 \rvert,因此当该比值接近11时,性能可能会很差。克服这些问题的一种方法是对矩阵 A 的适当移位版本应用幂迭代算法,后续将进行讨论

1.2 移位-逆幂法

给定一个复标量σ\sigma,以及ARn,n\bm{A} \in \mathbb{R} ^{n,n}可对角化,考虑矩阵

Bσ=(AσI)1\bm{B}_{\sigma } = (\bm{A} - \sigma \bm{I})^{-1}

根据谱映射定理,见Section 3.7.2 ,Bσ\bm{B}_{\sigma }A\bm{A}有相同的特征向量,且Bσ\bm{B}_{\sigma }的特征值为μi=(λiσ)1\mu _i = (\lambda _i - \sigma )^{-1},其中λi,i=1,,n\lambda _i,i=1,\cdots ,nA\bm{A}的特征值。Bσ\bm{B}_{\sigma }的最大模特征值 μmax\mu _{\max}现在对应于在复平面上最接近σ\sigmaλi\lambda _i。将幂法应用于Bσ\bm{B}_{\sigma },我们因此可以得到最接近所选σ\sigma的特征值λi\lambda _i以及相应的特征向量。移位-逆幂法如下所示

algorithm2.png

算法总结:

  1. σ\sigma选取要尽可能接近目标特征值,这样经过移位λσ\lambda -\sigma后,数值变为最小,再取逆后数值变为最大
  2. Bσ\bm{B}_{\sigma }A\bm{A}有相同的特征向量,因此不断左乘Bσ\bm{B}_{\sigma }得到的特征向量也是A\bm{A}的特征向量
  3. 由于最终要求解的是A\bm{A}的特征值,因此对特征向量左乘的矩阵是A\bm{A}

移位-逆幂法相对于幂迭代法的优势在于,我们现在可以快速(但仍然是线性速度)收敛到任意所需的特征值,只需选择一个足够接近目标特征值的移位σ\sigma。然而,移位-逆幂法要求预先已知目标特征值的一个较好的近似值。如果事先不知道这样的良好近似值,该方法的一个变体是先用一个粗略的近似值σ\sigma启动算法,然后在某个时刻,当获得了特征向量的合理近似后,动态修改移位σ\sigma,重复这个过程,不断迭代地改进σ\sigma。这个思想将在下一段中讨论

1.3 瑞利商(Rayleigh quotient)迭代

假设在移位-逆幂算法的某一步中,我们有一个近似特征向量x(k)0\bm{x}(k) \neq \bm{0}。那么,我们寻找某个近似特征值σk\sigma _k,即一个近似满足特征值/特征向量方程的标量

x(k)σkAx(k)\bm{x}(k) \sigma _k \approx \bm{Ax}(k)

这里所谓近似是指我们寻找σk\sigma _k,使得方程残差的平方范数最小,即minx(k)σkAx(k)\min \lVert \bm{x}(k) \sigma _k - \bm{Ax}(k) \rVert。通过要求该函数对σk\sigma _k的导数为零,我们得到

(x(k)σkAx(k))(x(k)σkAx(k))σk=0(σkx(k)x(k)σk2x(k)Ax(k)σk)σk=0x(k)Ax(k)x(k)x(k)=σk\begin{align*} \frac{\partial \big(\bm{x}(k) \sigma _k - \bm{Ax}(k))^\dagger (\bm{x}(k) \sigma _k - \bm{Ax}(k)\big)}{\partial \sigma_k} &= 0 \\ \frac{\partial \big(\sigma _k \bm{x}^\dagger (k) \bm{x}(k) \sigma _k - 2\bm{x}^\dagger (k)\bm{A} \bm{x}(k) \sigma _k \big)}{\partial \sigma_k} &= 0 \\ \frac{\bm{x}^\dagger (k)\bm{A} \bm{x}(k)}{\bm{x}^\dagger (k) \bm{x}(k)} &= \sigma _k \end{align*}

这被称为瑞利商(Rayleigh quotient),参见Section第4.3.1节。如果我们按照在移位-逆幂算法中自适应地选择移位,就得到了所谓的瑞利商迭代法,如下所示。与幂迭代方法不同,瑞利商迭代法可以被证明具有局部二次收敛性,也就是说,在经过一定次数迭代后,第k+1k+1次迭代中解的收敛差距与第kk次迭代中解的差距的平方成正比

algorithm3.png

算法总结:

  1. 瑞利商迭代法需要先使用幂迭代算法或者移位-逆幂算法迭代一定次数,以得到近似的特征向量值
  2. 这里在求解σk\sigma _k时需要再次对向量归一化,因为浮点数运算是有精度误差。如果归一化,这些微小的误差会在不断迭代中不断放大

1.4 使用幂迭代计算特征值分解

矩阵ARm,n\bm{A} \in \mathbb{R} ^{m,n}的奇异值分解的因子可以通过计算两个对称矩阵AA\bm{AA}^\topAA\bm{A}^\top \bm{A}的谱分解来获得。事实上,我们在Section 5定理 5.1 的证明中已经看到,V\bm{V}因子是来自AA\bm{A}^\top \bm{A}谱分解的特征向量矩阵

AA=VΛnV\bm{A}^\top \bm{A} = \bm{V \Lambda}_n \bm{V}^\top

并且U\bm{U}因子的列是AA\bm{AA}^\top的特征向量矩阵

AA=UΛmU\bm{AA}^\top = \bm{U \Lambda}_m \bm{U}^\top

Λn\bm{\Lambda }_nΛm\bm{\Lambda }_m是对角矩阵,其前rr个对角元素是平方奇异值σi2,i=1,,r\sigma_i^2,i=1,\cdots ,r其余对角元素为零

接下来,我们将概述如何使用幂迭代法来确定与矩阵最大奇异值对应的左奇异向量和右奇异向量。基本思路是对对称矩阵AA\bm{A}^\top \bm{A}AA\bm{AA}^\top应用幂迭代,但以隐式方式进行,从而绕过对该矩阵的显式计算,因为该矩阵通常是稠密的

u(k+1)=Av(k)Av(k)2v(k+1)=Au(k+1)Au(k+1)2\begin{align*} \bm{u}(k+1) &= \frac{\bm{A}\bm{v}(k)}{\lVert \bm{A}\bm{v}(k) \rVert_2} \\ \bm{v}(k+1) &= \frac{\bm{A}^\top \bm{u}(k+1)}{\lVert \bm{A}^\top \bm{u}(k+1) \rVert_2} \end{align*}

消去u(k+1)\bm{u}(k+1)可以得到

v(k+1)=AAv(k)AAv(k)2\bm{v}(k+1) = \frac{\bm{A}^\top \bm{A} \bm{v}(k)}{\lVert \bm{A}^\top \bm{A} \bm{v}(k) \rVert_2}

因此v(k)\bm{v}(k)的序列对应于对AA\bm{A}^\top \bm{A}应用幂迭代;同样,u(k)\bm{u}(k)的序列对应于对AA\bm{AA}^\top应用幂迭代。因此,下面的算法计算矩阵A\bm{A}的最大奇异值σ1\sigma _1,以及相关的左奇异向量u1\bm{u}_1和右奇异向量v1\bm{v}_1(σ=u1Av1\sigma = \bm{u}_1^\top \bm{A} \bm{v}_1),前提是有占优特征值

然后,这种技术可以递归地应用于矩阵A\bm{A}的紧凑版本,以确定其他奇异值及其对应的左奇异向量和右奇异向量。更准确地说,我们定义矩阵

Ai=Ai1σiuivi,i=1,,r;A0=A,σ0=0\bm{A}_i = \bm{A}_{i-1} - \sigma _i \bm{u}_i \bm{v}_i^\top , i = 1,\cdots ,r; \bm{A}_0 = \bm{A},\sigma _0 = 0

其中r=rank(A)\bm{r} = \operatorname{rank}(\bm{A}),并对Ai\bm{A}_i应用以下算法,以获得A\bm{A}的紧凑奇异值分解的所有项(假设奇异值彼此相差较大)

algorithm4.png

算法总结:

  1. 本质上是通过对AA\bm{A}^\top \bm{A}应用幂迭代法来求解v(k)\bm{v}(k)
  2. v(k)\bm{v}(k)左乘A\bm{A}^\top并归一化便可以得到u(k+1)\bm{u}(k+1)
  3. 对矩阵不断重复σiuivi- \sigma _i \bm{u}_i \bm{v}_i^\top便可以求出所有u\bm{u}v\bm{v}

2. 解方阵系统的线性方程组

在本节中,我们讨论求解形式为Ax=y\bm{A} \bm{x} = \bm{y}的线性方程组的数值方法,其中ARn,n\bm{A} \in \mathbb{R} ^{n,n}A\bm{A}可逆。一般的矩形情况可以通过奇异值分解处理参考Section 6.4.3 节

2.1 对角系统

我们首先考虑线性方程组可能具有的最简单的结构,即对角结构。一个方阵(square)、对角(diagonal)、非奇异(nonsingular)的线性方程组的形式是

[a11000a22000ann]x=[y1y2yn]\begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ 0 & a_{22} & 0 & \vdots \\ \vdots & \vdots & \ddots & \vdots \\ 0 & \cdots & 0 & a_{nn} \end{bmatrix} \bm{x} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}

其中a11,a22,,ann0a_{11},a_{22},\cdots ,a_{nn} \leq 0。很明显,这样一个系统的唯一解可以直接写出

x=[y1/a11y2/a22yn/ann]\bm{x} = \begin{bmatrix} y_1 / a_{11} \\ y_2 / a_{22} \\ \vdots \\ y_n / a_{nn} \end{bmatrix}

2.2 三角系统

另一种方阵非奇异系统的解很容易获得的情况是A\bm{A}矩阵具有三角结构

A=[a11a12a1n0a22a2n00ann]\bm{A} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ 0 & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & \cdots & 0 & a_{nn} \end{bmatrix}

或者形式为

A=[a1100a12a220an1an2ann]\bm{A} = \begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ a_{12} & a_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix}

假设a11,a22,,ann0a_{11},a_{22},\cdots ,a_{nn} \neq 0。例如,考虑下三角情况

[a1100a12a220an1an2ann]x=[y1y2yn]\begin{bmatrix} a_{11} & 0 & \cdots & 0 \\ a_{12} & a_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{bmatrix} \bm{x} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}

可以通过所谓的前向代入法(forward substitution)得到解:从第一个方程开始,得到x1=y1/a11x_1 = y_1 / a_{11},然后将该值代入第二个方程,我们得到

a21x1+a22x2=a21y1/a11+a22x2=y2a_{21}x_1 + a_{22}x_2 = a_{21} y_1 / a_{11} + a_{22}x_2 = y_2

因此,我们得到x2=y2a21y1/a11a22x_2 = \frac{y_2- a_{21} y_1 / a_{11}}{a_{22}}。接下来,我们将x1,x2x_1,x_2代入第三个方程以求得 x3x_3,然后以同样的方式继续,最终得到xnx_n。如下所示

algorithm5.png

算法总结:

  1. 外层循环是遍历每一个未知数
  2. 内层循环是减去每一个已知数

对于上三角系统的求解,也可以很容易地设计出类似的算法,如下所示

备注7.1(运算计数):通过反向代入求解三角系统所需的代数运算(除法、乘法和加减法)的总数很容易确定。在每一步i=n,,1i=n,\dots ,1中,算法各执行nin − i次乘法和加法运算,还有一次除法运算。因此,总运算量为

i=n12(ni)+1=n2\sum_{i=n}^{1} 2(n-i)+1 = n^2

2.3 高斯消元法(Gaussian elimination)

三角形非奇异系统的解非常容易求得。对于一个一般的非奇异但可能不是三角形的矩阵可以通过适当的操作转化为等价的上三角系统,然后使用反向代入(backward substitution)求解得到的三角系统。这种迭代三角化技术被称为高斯消元法

考虑一个方形非奇异系统

[a11a12a1na21a22a2nan1an2ann]x=[y1y2yn]\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \\ \end{bmatrix} \bm{x} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}

j=2j=2,用方程jj减去方程11乘以aj1/a11a_{j1} / a_{11}(假设a110a_{11} \neq 0)来替代每个方程,从而得到等价的方程组

[a11a12a13a1n0a22(1)a23(1)a2n(1)0a32(1)a33(1)a3n(1)0an2(1)an3(1)ann(1)]x=[y1y2(1)y3(1)yn(1)]\begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} \\ 0 & a_{22}^{(1)} & a_{23}^{(1)} & \cdots & a_{2n}^{(1)} \\ 0 & a_{32}^{(1)} & a_{33}^{(1)} & \cdots & a_{3n}^{(1)} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & a_{n2}^{(1)} & a_{n3}^{(1)} & \cdots & a_{nn}^{(1)} \end{bmatrix} \bm{x} = \begin{bmatrix} y_1 \\ y_2^{(1)} \\ y_3^{(1)} \\ \vdots \\ y_n^{(1)} \end{bmatrix}

共重复n1n − 1次,最终可以确定一个与原系统等价的上三角形式的系统

[a11a12a13a1n0a22(1)a23(1)a2n(1)00a33(2)a3n(2)000ann(n1)]x=[y1y2(1)y3(2)yn(n1)]\begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n} \\ 0 & a_{22}^{(1)} & a_{23}^{(1)} & \cdots & a_{2n}^{(1)} \\ 0 & 0 & a_{33}^{(2)} & \cdots & a_{3n}^{(2)} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & a_{nn}^{(n-1)} \end{bmatrix} \bm{x} = \begin{bmatrix} y_1 \\ y_2^{(1)} \\ y_3^{(2)} \\ \vdots \\ y_n^{(n-1)} \end{bmatrix}

然后可以通过反向代入法求解系统

备注7.2(带选主元的消元):注意,如果在消去中遇到对角元素为零,上述方法将会失败,因为无法用该元素进行除法。在实际中,如果该元素的绝对值非常小,也会出现问题。可以对算法进行修改,引入部分或完全选主元

完全选主元的思路非常简单:在过程的第kk阶段,我们寻找绝对值最大的元素aij(k1),i>k,jka_{ij}^{(k-1)},i>k,j \geq k。该元素称为主元,并将矩阵的行和列进行交换,使其进入(k,k)(k,k)位置;然后消元阶段按之前描述的方法进行,并重复此过程。注意,当交换矩阵的两行时,向量y\bm{y}中的元素也需要相应地交换。同样地,当交换矩阵的两列时,相应的xx元素也需要交换

部分选主元的工作方式类似,但只在元素所在列的下方元素中搜索主元,因此在此情况下只需要交换两行。选主元增加了求解所需的数值工作量,因为每个阶段都需要进行主元搜索,同时还需要进行内存管理操作以交换行(在完全选主元的情况下还需交换列)

下面的算法描述了带部分主元的高斯消元法

algorithm7.png

接下来我们计算通过高斯消元法解方阵系统所需的基本操作次数。首先考虑高斯消元过程,我们看到在该过程的第一次迭代中,需要2n+12n+1次操作来更新矩阵的第二行(11次除法和nn次乘法和减法运算以求出行的新的元素)。因此,为了将第一列中第一个元素以下的所有元素置零,并更新从第二行开始的所有行,需要(n1)(2n+1)(n-1)(2n+1)次操作。接下来,我们需要(n2)(2n1)(n-2)(2n-1)次操作以将第二列置零并更新矩阵;对于第三列,我们需要(n3)(2n3)(n-3)(2n-3)次操作,依此类推。这些操作的总和为

i=1n1(ni)(2(ni+1)+1)=i=1n1(ni)(2n2i+3)=k=1n1k(2k+3)=2k=1n1k2+3k=1n1k=n(n1)(2n1)3+3n(n1)2=23n3\begin{align*} & \sum_{i=1}^{n-1} \big(n-i\big)\big(2(n-i+1)+1\big) \\ =& \sum_{i=1}^{n-1} (n-i)(2n-2i+3) \\ =& \sum_{k=1}^{n-1} k(2k+3) \\ =& 2\sum_{k=1}^{n-1} k^2 + 3 \sum_{k=1}^{n-1} k \\ =& \frac{n(n-1)(2n-1)}{3} + \frac{3n(n-1)}{2} \\ =& \sim \frac{2}{3} n^3 \end{align*}

这里的符号\sim表示多项式中的首项,这种表示法比通常的O()O(\cdot)表示法更具信息性,因为它指出了首项的系数。我们最终需要对变换后的三角系统应用反向代入,这将额外需要n2n^2次运算。这不会改变主导的复杂度项,因此求解一个一般的非奇异系统所需的总运算次数为23n3\sim \frac{2}{3} n^3

3. QR分解

QR分解是一种线性代数操作,它将一个矩阵分解为一个正交分量,该分量是矩阵列空间的基,以及一个三角分量。在QR分解中,矩阵ARm,n\bm{A} \in \mathbb{R} ^{m,n},其中mnm \geq n,且rank(A)\operatorname{rank}(\bm{A}),因此被分解为

A=QR\bm{A} = \bm{Q} \bm{R}

其中QRm,n\bm{Q} \in \mathbb{R} ^{m,n}具有正交列(即QQ=In\bm{Q}^\top \bm{Q} = \bm{I}_n),并且RRn,n\bm{R} \in \mathbb{R} ^{n,n}是上三角矩阵。计算 QR 分解的方法有很多,包括 Householder 变换法、改进的 Gram–Schmidt 算法以及快速 Givens 方法。这里,我们描述基于改进的 Gram–Schmidt 算法(modified Gram–Schmidt, MGS)的方法

3.1 改进的Gram–Schmidt过程

我们回忆一下Section第2.3.3节,当给定一组线性无关向量{a(1),,a(n)}\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(n)}\right\}时,Gram–Schmidt(GS)过程会构造一个与原始向量组具有相同张成空间的正交归一向量组{q(1),,q(n)}\left\{ \bm{q}^{(1)},\cdots , \bm{q}^{(n)}\right\},具体如下:对于k=1,nk = 1,\cdots n

ζ(k)=a(k)i=1k1a(k),q(i)q(i)q(k)=ζ(k)ζ(k)\begin{gather*} \bm{\zeta}^{(k)} = \bm{a}^{(k)} - \sum_{i=1}^{k-1} \left\langle \bm{a}^{(k)}, \bm{q}^{(i)} \right\rangle\bm{q}^{(i)} \\ \bm{q}^{(k)}= \frac{\bm{\zeta}^{(k)}}{\lVert \bm{\zeta}^{(k)} \rVert} \end{gather*}

Sk1=span{a(1),,a(n)}\mathcal{S}_{k-1} = \operatorname{span}\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(n)}\right\},并设其正交补记为Sk1\mathcal{S}_{k-1}^\perp。在上述方程中,GS 过程计算a(k)\bm{a}^{(k)}Sk1\mathcal{S}_{k-1}上的投影,然后从a(k)\bm{a}^{(k)}中减去它,从而得到a(k)\bm{a}^{(k)}Sk1\mathcal{S}_{k-1}^\perp上的投影。容易看出,上述方程中的投影运算可以用矩阵形式表示如下

ζ(k)=PSk1a(k)PSk1=IPSk1PSk1=i=1k1q(i)q(i)\begin{gather*} \bm{\zeta}^{(k)} = \mathcal{P}_{\mathcal{S}_{k-1}^\perp} \bm{a}^{(k)} \\ \mathcal{P}_{\mathcal{S}_{k-1}^\perp} = \bm{I} - \mathcal{P}_{\mathcal{S}_{k-1}} \\ \mathcal{P}_{\mathcal{S}_{k-1}} = \sum_{i=1}^{k-1} \bm{q}^{(i)} \bm{q}^{(i)\top} \end{gather*}

其中PS0=0,PS0=I\mathcal{P}_{\mathcal{S}_{0}} = 0,\mathcal{P}_{\mathcal{S}_{0}}^\perp = \bm{I}。此外,正交投影矩阵PSk1=IPSk1\mathcal{P}_{\mathcal{S}_{k-1}^\perp} = \bm{I} - \mathcal{P}_{\mathcal{S}_{k-1}}可以表示为投影到各个q(1),,q(k1)\bm{q}^{(1)},\cdots ,\bm{q}^{(k-1)}的正交子空间的初等投影的乘积,即

PSk1=Pq(k1)Pq(1),k>1Pq(i)=Iq(i)q(i)\begin{gather*} \mathcal{P}_{\mathcal{S}_{k-1}^\perp} = \mathcal{P}_{\bm{q}^{(k-1) ^\perp}} \cdots \mathcal{P}_{\bm{q}^{(1) ^\perp}},k>1 \\ \mathcal{P}_{\bm{q}^{(i) ^\perp}} =\bm{I} - \bm{q}^{(i)} \bm{q}^{(i)\top} \end{gather*}

这个事实可以很容易地直接验证:例如取k=3k=3(一般情况可以通过相同的论证得出)

Pq(2)Pq(1)=(Iq(2)q(2))(Iq(1)q(1))=Iq(2)q(2)q(1)q(1)+q(2)q(2)q(1)q(1)=Iq(2)q(2)q(1)q(1)=IPS2=PS2\begin{align*} &\mathcal{P}_{\bm{q}^{(2) ^\perp}}\mathcal{P}_{\bm{q}^{(1) ^\perp}} \\ =& (\bm{I} - \bm{q}^{(2)} \bm{q}^{(2)\top})(\bm{I} - \bm{q}^{(1)} \bm{q}^{(1)\top}) \\ =& \bm{I} - \bm{q}^{(2)} \bm{q}^{(2)\top} - \bm{q}^{(1)} \bm{q}^{(1)\top} + \bm{q}^{(2)} \bm{q}^{(2)\top} \bm{q}^{(1)} \bm{q}^{(1)\top} \\ =& \bm{I} - \bm{q}^{(2)} \bm{q}^{(2)\top} - \bm{q}^{(1)} \bm{q}^{(1)\top} \\ =& \bm{I} - \mathcal{P}_{\mathcal{S}_{2}} \\ =& \mathcal{P}_{\mathcal{S}_{2}^\perp} \end{align*}

在 MGS 中,每个ζ(k)=Pq(k1)Pq(1)Ia(k)\bm{\zeta}^{(k)} = \mathcal{P}_{\bm{q}^{(k-1) ^\perp}} \cdots \mathcal{P}_{\bm{q}^{(1) ^\perp}} \bm{I} \bm{a}^{(k)}按如下方式递归计算(注意以下计算的是一个ζ\bm{\zeta}

ζ(k)(1)=a(k),ζ(k)(2)=Pq(1)ζ(k)(1)=(Iq(1)q(1))ζ(k)(1)=ζ(k)(1)q(1)q(1)ζ(k)(1),ζ(k)(3)=Pq(2)ζ(k)(2)=ζ(k)(2)q(2)q(2)ζ(k)(2),  ζ(k)(k)=Pq(k1)ζ(k)(k1)=ζ(k)(k1)q(k1)q(k1)ζ(k)(k1).\begin{align*} \bm{\zeta}^{(k)}(1) &= \bm{a}^{(k)}, \\ \bm{\zeta}^{(k)}(2) &= \mathcal{P}_{\bm{q}^{(1)\perp}} \bm{\zeta}^{(k)}(1) = \left(\bm{I} - \bm{q}^{(1)} \bm{q}^{(1)\top}\right) \bm{\zeta}^{(k)}(1) \\ &= \bm{\zeta}^{(k)}(1) - \bm{q}^{(1)} \bm{q}^{(1)\top} \bm{\zeta}^{(k)}(1), \\ \bm{\zeta}^{(k)}(3) &= \mathcal{P}_{\bm{q}^{(2)\perp}} \bm{\zeta}^{(k)}(2) = \bm{\zeta}^{(k)}(2) - \bm{q}^{(2)} \bm{q}^{(2)\top} \bm{\zeta}^{(k)}(2), \\ &\ \ \vdots \quad \vdots \quad \vdots \\ \bm{\zeta}^{(k)}(k) &= \mathcal{P}_{\bm{q}^{(k-1)\perp}} \bm{\zeta}^{(k)}(k-1) \\ &= \bm{\zeta}^{(k)}(k-1) - \bm{q}^{(k-1)} \bm{q}^{(k-1)\top} \bm{\zeta}^{(k)}(k-1). \end{align*}

虽然两种公式( GS 和 MGS )在数学上是等价的,但后者在数值上被证明更稳定。接下来将 MGS 过程形式化为一个算法

algorithm8.png

对于较大的m,nm,n,计算工作主要由算法的最内层循环支配:计算rij=q(i)ζ(j)r_{ij} = \bm{q}^{(i)\top} \bm{\zeta}^{(j)}需要mm次乘加运算(实际是mm次乘法和m1m-1次加法),而计算ζ(j)=ζ(j)rijq(i)\bm{\zeta}^{(j)} = \bm{\zeta}^{(j)} - r_{ij}\bm{q}^{(i)}需要mm次乘减运算,因此每个内层循环总计4m4m次操作。因此,算法的总体操作计数大约为

i=1nj=i+1n4m=i=1n(ni)4m=(n2n(n+1)2)4m2mn2\sum_{i=1}^{n} \sum_{j=i+1}^{n} 4m = \sum_{i=1}^{n} (n-i)4m = \big( n^2 - \frac{n(n+1)}{2} \big)4m \sim 2mn^2

接下来我们将展示 MGS 算法实际上提供了A\bm{A}的 QR 分解中的Q\bm{Q}R\bm{R}因子。设a(1),,a(n)\bm{a}^{(1)},\cdots ,\bm{a}^{(n)}表示A\bm{A}的各列。由于ζ(1)=a(1)\bm{\zeta}^{(1)} = \bm{a}^{(1)},并且对于j>1j >1

ζ(j)=a(j)i=1j1q(i)q(i)a(j)\bm{\zeta}^{(j)} = \bm{a}^{(j)} - \sum_{i=1}^{j-1} \bm{q}^{(i)} \bm{q}^{(i)\top} \bm{a}^{(j)}

现在设rjj=ζ(j),rij=q(i)a(j)r_{jj} = \lVert \bm{\zeta}^{(j)} \rVert,r_{ij} = \bm{q}^{(i)\top} \bm{a}^{(j)},并回忆q(j)=ζ(j)/rjj\bm{q}^{(j)}= \bm{\zeta}^{(j)} / r_{jj}。前面的方程变为

rjjq(j)=a(j)i=1j1rijq(i)r_{jj} \bm{q}^{(j)} = \bm{a}^{(j)} - \sum_{i=1}^{j-1} r_{ij} \bm{q}^{(i)}

那也就是说

a(j)=rjjq(j)+i=1j1rijq(i)\bm{a}^{(j)} = r_{jj} \bm{q}^{(j)} + \sum_{i=1}^{j-1} r_{ij} \bm{q}^{(i)}

这给出了所需的分解A=QR\bm{A} = \bm{Q} \bm{R},其中

[a(1)a(n)]=[q(1)q(n)][r11r12r1n0r22r2n00rnn][\bm{a}^{(1)} \cdots \bm{a}^{(n)}] = [\bm{q}^{(1)} \cdots \bm{q}^{(n)}] \begin{bmatrix} r_{11} & r_{12} & \cdots & r_{1n} \\ 0 & r_{22} & \cdots & r_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & r_{nn} \\ \end{bmatrix}

以上推理构成了以下事实的构造性证明

定理7.1(QR 分解):任意矩阵ARm,n\bm{A} \in \mathbb{R} ^{m,n},且mnm \geq nrank(A)=n\operatorname{rank}(\bm{A}) = n,都可以分解为A=QR\bm{A} = \bm{Q} \bm{R},其中RRn,n\bm{R} \in \mathbb{R} ^{n,n}为上三角矩阵且对角线元素为正,QRm,n\bm{Q} \in \mathbb{R} ^{m,n}的列向量标准正交(即满足QQ=In\bm{Q}^\top \bm{Q} = \bm{I}_n

3.2 针对秩亏矩阵的 MGS 和 QR 分解

在标准的 GS 过程中,我们假设向量{a(1),,a(n)},a(i)Rm\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(n)}\right\},\bm{a}^{(i)} \in \mathbb{R} ^m是线性无关的,也就是说矩阵A=[a(1)a(n)]Rm,n\bm{A} = [\bm{a}^{(1)} \cdots \bm{a}^{(n)}] \in \mathbb{R} ^{m,n}是列满秩的。接下来,我们讨论如何将 GS 过程和 QR 分解推广到A\bm{A}不满秩的情况,即{a(1),,a(n)}\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(n)}\right\}线性相关时。在这种情况下,令knk \leq n为最小整数,使得向量a(k)\bm{a}^{(k)}可以表示为前面向量{a(1),,a(k1)}\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(k-1)}\right\}的线性组合(前k1k-1个向量线性无关,前kk个向量线性相关),即

a(k)=i=1k1α~ia(i)\bm{a}^{(k)} = \sum_{i=1}^{k-1} \tilde{\alpha }_i \bm{a}^{(i)}

α~i\tilde{\alpha }_i为标量。可知{q(1),,q(k1)}\left\{ \bm{q}^{(1)},\cdots , \bm{q}^{(k-1)}\right\}张成的子空间与 {a(1),,a(k1)}\left\{ \bm{a}^{(1)},\cdots , \bm{a}^{(k-1)}\right\}相同,我们也有

a(k)=i=1k1αiq(i)\bm{a}^{(k)} = \sum_{i=1}^{k-1} \alpha_i \bm{q}^{(i)}

αi\alpha_i为标量。由于向量q(j),j=1,,k1\bm{q}^{(j)},j=1,\dots,k-1是标准正交的

a(k),q(j)=i=1k1αiq(i),q(j)=αj\left\langle \bm{a}^{(k)}, \bm{q}^{(j)} \right\rangle = \sum_{i=1}^{k-1}\alpha_i \left\langle \bm{q}^{(i)}, \bm{q}^{(j)} \right\rangle = \alpha _j

因此,根据ζ(k)=a(k)i=1k1a(k),q(i)q(i)\bm{\zeta}^{(k)} = \bm{a}^{(k)} - \sum_{i=1}^{k-1} \left\langle \bm{a}^{(k)}, \bm{q}^{(i)} \right\rangle\bm{q}^{(i)}可以得到ζ(k)=0\bm{\zeta}^{(k)} = \bm{0},因此标准程序无法继续。然而,广义程序通过丢弃所有满足ζ(k)=0\bm{\zeta}^{(k')} = \bm{0}的对应向量a(k),kk\bm{a}^{(k')} ,k' \geq k,来继续进行,直到程序终止,或者找到一个ζ(k)0\bm{\zeta}^{(k')} \neq \bm{0}的向量a(k)\bm{a}^{(k')}。在这种情况下,对应的标准向量q(k)\bm{q}^{(k')}被加入标准正交集合中,并继续迭代该过程。终止时,该修改后的过程返回一组r=rank(A)r = \operatorname{rank}(\bm{A})个正交向量{q(1),,q(r)}\left\{ \bm{q}^{(1)},\cdots , \bm{q}^{(r)}\right\},它们形成R(A)\mathcal{R}(\bm{A})的标准正交基

这个过程提供了一种广义的 QR 分解,因为A\bm{A}的每一列都可以表示为Q=[q(1)q(r)]\bm{Q} = [\bm{q}^{(1)}\cdots \bm{q}^{(r)}]列的线性组合,并且非零系数的数量是非递减的。具体而言,A\bm{A}的第一块n11n_1 \geq 1列被表示为q(1)\bm{q}^{(1)}的线性组合,A\bm{A}的第二块n21n_2 \geq 1列被表示为q(1),q(2)\bm{q}^{(1)},\bm{q}^{(2)}的线性组合,依此类推,直到A\bm{A}的第rrnrn_r列被表示为q(1),,q(r)\bm{q}^{(1)},\cdots,\bm{q}^{(r)}的线性组合,其中n1+n2++nr=nn_1 + n_2 + \cdots +n_r = n。用公式表示为

A=QR,R=[R11R12R1r0R22R2r00Rrr],RijR1,nj\bm{A} = \bm{Q} \bm{R} , \bm{R} = \begin{bmatrix} \bm{R}_{11} & \bm{R}_{12} & \cdots & \bm{R}_{1r} \\ \bm{0} & \bm{R}_{22} & \cdots & \bm{R}_{2r} \\ \vdots & \vdots & \ddots & \vdots \\ \bm{0} & \bm{0} & \cdots & \bm{R}_{rr} \\ \end{bmatrix} ,\bm{R}_{ij} \in \mathbb{R} ^{1,n_j}

矩阵R\bm{R}是分块上三角形式。然后可以重新排列R\bm{R}的列,使得Rii\bm{R}_{ii}第一个元素所在的列移到第ii列,构造上三角矩阵。这可以写成

A=QRE,R=[R~M]\bm{A}=\bm{Q} \bm{R} \bm{E}^\top , \bm{R} = [\tilde{\bm{R}} \quad \bm{M}]

其中E\bm{E}是一个合适的列置换矩阵(注意置换是初等变换,因此矩阵是正交的),R~Rr,r\tilde{\bm{R}} \in \mathbb{R} ^{r,r}是上三角且可逆的,MRr,nr\bm{M} \in \mathbb{R} ^{r,n-r}

QR 分解的另一种完整形式使用Q\bm{Q}矩阵中的所有mm列:在q(1)q(r)\bm{q}^{(1)}\cdots \bm{q}^{(r)}的基础上添加mrm-r个正交列,以完成Rm\mathbb{R} ^m的一组正交基。因此,在R\bm{R}矩阵中附加mrm-r个全零的尾行,以得到

A=QRE,QRm,QQ=Im,R=[R~M0mr,r0mr,nr]\bm{A}=\bm{Q} \bm{R} \bm{E}^\top ,\bm{Q} \in \mathbb{R} ^m,\bm{Q}^\top \bm{Q} = \bm{I}_m, \bm{R} = \begin{bmatrix} \tilde{\bm{R}} & \bm{M} \\ \bm{0}_{m-r,r} & \bm{0}_{m-r,n-r} \end{bmatrix}