线性方程组与矩阵的基本概念

线性方程组形如下面的样子:

{a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2am1x1+am2x2++amnxn=bm\begin{cases}a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n=b_1\\ a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n=b_2\\ \cdots\\a_{m1}x_1+a_{m2}x_2+\cdots+a_{mn}x_n=b_m\\ \end{cases}

或矩阵形式:

Ax=b\mathbf{A}\mathbf{x}=\mathbf{b}

  • m>nm>n,称为超定方程组,一般无解,可以考虑最小二乘解
  • m<nm<n,一般有无穷多解,可以考虑约束优化问题

现在讨论的情况均假定m=nm=n,即要求

ARn×n\mathbf{A}\in \mathbb{R}^{n\times n}

bRn\mathbf{b}\in\mathbb{R}^n

基础矩阵概念复习

  • 对称矩阵AT=A\mathbf{A}^T=\mathbf{A}
  • 对称正定矩阵AT=A\mathbf{A}^T=\mathbf{A}x0, xTAx>0\forall \mathbf{x}\neq \mathbf{0},\ \mathbf{x}^T\mathbf{A}\mathbf{x}>0
  • 正交矩阵AT=A1\mathbf{A}^T=\mathbf{A}^{-1}
  • 顺序主子阵:左上角的方块;其行列式称为顺序主子式

向量的范数

定义(一般的范数)

对线性空间V\mathcal{V},若一个映射: VR||\cdot||:\ \mathcal{V}\to\mathbb{R}满足:

  • 正定性:xV, x0\forall\mathbf{x}\in\mathcal{V},\ ||\mathbf{x}||\geq0,当且仅当x=0\mathbf{x}=\mathbf{0}时取等
  • 正齐次性:αx=αx||\alpha\mathbf{x}||=|\alpha|\cdot||\mathbf{x}||
  • 三角不等式:x,yV, x+yx+y\forall \mathbf{x},\mathbf{y}\in\mathcal{V},\ ||\mathbf{x}+\mathbf{y}||\leq||\mathbf{x}||+||\mathbf{y}||

则称该映射是一个范数,此空间是一个赋范线性空间


常用的向量范数包括:

  • pp-范数xp=(i=1nxip)1/p||\mathbf{x}||_p=(\sum\limits_{i=1}^n|x_i|^p)^{1/p}
  • 内积范数:对一个内积<,>\left<\cdot,\cdot\right>x=<x,x>||\mathbf{x}||=\sqrt{\left<\mathbf{x},\mathbf{x}\right>}
    • 对常用内积<x,y>=xTy\left<\mathbf{x},\mathbf{y}\right>=\mathbf{x}^T\mathbf{y}而言,这等价于2-范数

定义(范数的等价性)

若对两种范数s||\cdot||_st||\cdot||_t,有

c1,c2>0, xV, c1xsxtc2xs\exists c_1,c_2>0,\ \forall \mathbf{x}\in\mathcal{V},\ c_1||\mathbf{x}||_s\leq||\mathbf{x}||_t\leq c_2||\mathbf{x}||_s

则称两种范数等价

范数等价意味着用这两种范数定义的极限连续等等概念都相同

定理 Rn\mathbb{R}^n上的一切范数等价

这让我们证明一些极限问题时可以任意选择一种范数

矩阵的范数

定义(矩阵范数)

矩阵范数需要满足向量范数的正定、正齐次、三角不等式三条性质,同时增加乘法限制:

A,BRn×n, ABA B\forall \mathbf{A},\mathbf{B}\in\mathbb{R}^{n\times n},\ ||\mathbf{A}\mathbf{B}||\leq||\mathbf{A}||\ ||\mathbf{B}||

ARn×n, xRn, AxA x\forall \mathbf{A}\in\mathbb{R}^{n\times n},\ \mathbf{x}\in\mathbb{R}^n,\ ||\mathbf{A}\mathbf{x}||\leq||\mathbf{A}||\ ||\mathbf{x}||

上述第二条称为相容性条件,它建立了矩阵范数和向量范数的联系


矩阵的默认范数为算子范数,它根据某种向量范数v||\cdot||_v来定义:

Av=maxv0Avvvv||\mathbf{A}||_v=\max\limits_{\mathbf{v}\neq\mathbf{0}}\frac{||\mathbf{Av}||_{v}}{||\mathbf{v}||_v}

算子范数的含义是矩阵作为一种作用于向量上的算子,对向量的最大拉伸倍数

向量范数使用2-范数时,Av||\mathbf{A}||_v表示椭圆xTATA1x=1\mathbf{x}^T\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{x}=1的半长轴长度

根据算子范数的定义,很容易证明算子范数是一种合要求的矩阵范数


常用矩阵范数

  • 1-范数A1=maxji=1naij||\mathbf{A}||_1=\max\limits_j\sum\limits_{i=1}^n|a_{ij}|
  • ∞-范数A=maxij=1naij||\mathbf{A}||_\infty=\max\limits_i\sum\limits_{j=1}^n|a_{ij}|
  • 2-范数:矩阵ATA\mathbf{A}^T\mathbf{A}的最大特征值的算术平方根
  • Frobenius范数AF=ijaij2=tr(ATA)||\mathbf{A}||_F=\sqrt{\sum\limits_i\sum\limits_ja_{ij}^2}=\sqrt{\mathrm{tr}(\mathbf{A}^T\mathbf{A})}

上述除了Frobenius范数以外都是算子范数,矩阵的pp-范数表示利用向量pp-范数得到的算子范数。证明如下:

矩阵的1-范数

A1=maxv0jvjaj1v1||\mathbf{A}||_1=\max\limits_{\mathbf{v}\neq\mathbf{0}}\frac{\left|\left|\sum\limits_{j}v_j\mathbf{a}_j\right|\right|_1}{||\mathbf{v}||_1}

由于

jvjaj1v1v1 a11++vn an1v1++vnmaxjaj1 \frac{\left|\left|\sum\limits_{j}v_j\mathbf{a}_j\right|\right|_1}{||\mathbf{v}||_1}\leq\frac{|v_1|\ ||\mathbf{a}_1||_1+\cdots+|v_n|\ ||\mathbf{a}_n||_1}{|v_1|+\cdots+|v_n|}\leq\max_{j}||\mathbf{a}_j||_1

且此不等式在v=ejm\mathbf{v}=e_{j_m},其中jm=argmaxj(aj1)j_m=\mathrm{argmax}_j(||\mathbf{a}_j||_1)时取等,于是

A1=maxv0jvjaj1v1=maxjaj1||\mathbf{A}||_1=\max\limits_{\mathbf{v}\neq\mathbf{0}}\frac{\left|\left|\sum\limits_{j}v_j\mathbf{a}_j\right|\right|_1}{||\mathbf{v}||_1}=\max\limits_j||\mathbf{a}_j||_1

矩阵的∞-范数

A=maxv0maxijaijvjmaxjvj||\mathbf A||_\infty=\max_{\mathbf v\neq\mathbf 0}\frac{\max\limits_i\left|\sum\limits_{j}a_{ij}v_j\right|}{\max\limits_j|v_j|}

考虑当ii固定,v\mathbf{v}可变时,下式的最大值:

jaijvjmaxjvj \frac{\left|\sum\limits_{j}a_{ij}v_j\right|}{\max\limits_j|v_j|}

显然,当所有vjv_j取绝对值相同,且符号使分子的各和项同号时取最大,最大值为

jaij \sum\limits_j|a_{ij}|

于是

A=maxijaij||\mathbf A||_\infty=\max\limits_i\sum\limits_j|a_{ij}|

矩阵的2-范数

Av2v2\frac{||\mathbf{Av}||_2}{||\mathbf{v}||_2}的最大值等价于取

vTATAvvTv\frac{|\mathbf v^T\mathbf A^T\mathbf{Av}|}{|\mathbf v^T\mathbf v|}

的最大值

由于ATA\mathbf A^T\mathbf A实对称,可以用其特征向量构成一组标准正交基{x1,,xn}\{\mathbf x_1,\cdots,\mathbf x_n\},在此基上分解v\mathbf v,得到

v=v1x1++vnxn\mathbf v=v_1\mathbf x_1+\cdots+v_n\mathbf x_n

于是

ATAv=λ1v1x1++λnvnxn\mathbf A^T\mathbf{Av}=\lambda_1v_1\mathbf x_1+\cdots+\lambda_nv_n\mathbf x_n

由于

xiTxj={0,ij1,i=j\mathbf x_i^T\mathbf x_j=\begin{cases}0,&i\neq j\\1,&i=j\end{cases}

因此

vTATAvvTv=λ1v12++λnvn2v12++vn2\frac{|\mathbf v^T\mathbf A^T\mathbf{Av}|}{|\mathbf v^T\mathbf v|}=\frac{|\lambda_1v_1^2+\cdots+\lambda_nv_n^2|}{|v_1^2+\cdots+v_n^2|}

由于ATA\mathbf A^T\mathbf A半正定

vTATAvvTv=λ1v12++λnvn2v12++vn2=λ1v12++λnvn2v12++vn2λmax\frac{|\mathbf v^T\mathbf A^T\mathbf{Av}|}{|\mathbf v^T\mathbf v|}=\frac{|\lambda_1v_1^2+\cdots+\lambda_nv_n^2|}{|v_1^2+\cdots+v_n^2|}=\frac{\lambda_1v_1^2+\cdots+\lambda_nv_n^2}{v_1^2+\cdots+v_n^2}\leq \lambda_\mathrm{max}

v\mathbf vλmax\lambda_\mathrm{max}对应的特征向量时取等

线性方程组求解问题的敏感性

考虑以下问题:

Ax=b\mathbf{Ax}=\mathbf{b}

当右端发生扰动时:

A(x+Δx)=b+Δb\mathbf{A}(\mathbf{x}+\Delta\mathbf{x})=\mathbf{b}+\Delta\mathbf{b}

根据线性性:

AΔx=Δb\mathbf{A}\Delta\mathbf{x}=\Delta\mathbf{b}

于是问题的条件数

cond=Δx/xΔb/bA A1{\rm cond}=\frac{||\Delta\mathbf{x}||/||\mathbf{x}||}{||\Delta\mathbf b||/||\mathbf b||}\leq||\mathbf{A}||\ \left|\left|\mathbf A^{-1}\right|\right|

定义矩阵的条件数

cond(A)=A A1{\rm cond}(\mathbf{A})=||\mathbf{A}||\ \left|\left|\mathbf A^{-1}\right|\right|

条件数较大的矩阵对应着很病态的求解问题,称之为病态矩阵


定理

cond(A)=maxv0Avvminv0Avv\mathrm{cond}(\mathbf A)=\frac{\max\limits_{\mathbf v\neq\mathbf 0}\frac{||\mathbf{Av}||}{||\mathbf v||}}{\min\limits_{\mathbf v\neq\mathbf 0}\frac{||\mathbf{Av}||}{||\mathbf v||}}

证明是容易的

定理说明条件数表示矩阵对单位圆的扭曲程度,它的值为比矩阵作用在单位圆上得到的椭圆的半长轴与半短轴之比

定义奇异矩阵的条件数为++\infty


定理(矩阵条件数的性质)

  1. cond(A)1{\rm cond}(\mathbf A)\geq1
  2. cond(A1)=cond(A){\rm cond}(\mathbf A^{-1})={\rm cond}(\mathbf A)
  3. cond(cA)=cond(A), c0{\rm cond}(c\mathbf A)={\rm cond}(\mathbf A),\ c\neq0
  4. 单位阵条件数为11
  5. 对角阵条件数为对角元的最大绝对值与最小绝对值之比
  6. 2-范数下条件数是ATA\mathbf A^T\mathbf A的最大特征值与最小特征值之比的算术平方根
  7. 2-范数下乘正交矩阵不改变条件数

高斯消去法

消去过程:将增广矩阵的系数矩阵部分变为上三角

回代过程:解上三角方程组

在第kk步消去前的主元akka_{kk}不能为00,否则无法消去

消去过程可以使用原地工作,不消耗额外的存储空间

计算复杂度为O(n3)O(n^3)

LU分解

以下过程为矩阵的LU分解:

A=LU\mathbf A =\mathbf {LU}

其中L\mathbf L单位下三角矩阵U\mathbf U上三角矩阵


LU分解可以通过在高斯消去法的同时记录消去的过程而得到,这种方法在线性代数课程中已经有过充分介绍,这里不再赘述

定理(LU分解的条件) 对方阵ARn×n\mathbf A\in \mathbb R^{n\times n},其存在唯一的LU分解当且仅当执行高斯消去过程中第kk步消去前的主元akk(k)0, k=1,,n1a_{kk}^{(k)}\neq 0,\ \forall k=1,\cdots,n-1

直接LU分解算法

如果我们不通过高斯消去的思路来进行LU分解,而是直接列出逐元素的表达式(这里以3阶为例):

[1l211l31l321][u11u12u13u22u23u33]=[a11a12a13a21a22a23a31a32a33]\begin{bmatrix}1\\l_{21}&1\\l_{31}&l_{32}&1\end{bmatrix}\begin{bmatrix}u_{11}&u_{12}&u_{13}\\&u_{22}&u_{23}\\&&u_{33}\end{bmatrix}=\begin{bmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}

可以列出如下方程:

u1j=a1j, j=1,2,3u_{1j}=a_{1j},\ j=1,2,3

li1u11=ai1, i=2,3l_{i1}u_{11}=a_{i1},\ i=2,3

l21u1j+u2j=a2j, j=2,3l_{21}u_{1j}+u_{2j}=a_{2j},\ j=2,3

l31u12+l32u22=a32l_{31}u_{12}+l_{32}u_{22}=a_{32}

l31u13+l32u23+u33=a33l_{31}u_{13}+l_{32}u_{23}+u_{33}=a_{33}

于是可以循着

u1jli1u2jli2u3jli3li(n1)unnu_{1j}\to l_{i1}\to u_{2j}\to l_{i2}\to u_{3j}\to l_{i3}\to\cdots\to l_{i(n-1)}\to u_{nn}

的顺序来解出所有L\mathbf LU\mathbf U的元素,每个元素的求解过程类似于简单的回代法


特别地,注意到在上面的方程中,形如

aijlikukja_{ij}-l_{ik}u_{kj}

的形状会频繁出现在方程右端,因此可以使用循环更新A\mathbf A的方式来减少重复计算,具体地,对:

A=[2112222342430061]\mathbf A=\begin{bmatrix} 2&1&1&2\\ 2&2&2&3\\ 4&2&4&3\\ 0&0&6&-1 \end{bmatrix}

首先解出U\mathbf U的第一行,它就是A\mathbf A的第一行:

L=[1111]U=[2112]A=[2112222342430061]\mathbf L=\begin{bmatrix} 1\\ \cdot&1\\ \cdot&\cdot&1\\ \cdot&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &\cdot&\cdot&\cdot\\ &&\cdot&\cdot\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A=\begin{bmatrix} 2&1&1&2\\ 2&2&2&3\\ 4&2&4&3\\ 0&0&6&-1 \end{bmatrix}

之后计算L\mathbf L的第一列,它由A\mathbf A的第一列除以u11=a11u_{11}=a_{11}得到:

L=[1112101]U=[2112]A=[2112222342430061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&\cdot&1\\ 0&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &\cdot&\cdot&\cdot\\ &&\cdot&\cdot\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A=\begin{bmatrix} 2&1&1&2\\ 2&2&2&3\\ 4&2&4&3\\ 0&0&6&-1 \end{bmatrix}

此时,我们希望迭代地用上述方法计算A\mathbf A右下角块的LU分解,但实际上A\mathbf A的右下角块中包含已经被解出的第一行和第一列的成分,因此需要把对应的成分减去,即:A\mathbf A的右下角块中减去L\mathbf L第一列和U\mathbf U第一行对应位置的乘积

L=[1112101]U=[2112]A(1)=[2112211140210061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&\cdot&1\\ 0&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &\cdot&\cdot&\cdot\\ &&\cdot&\cdot\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(1)}=\begin{bmatrix} 2&1&1&2\\ 2&1&1&1\\ 4&0&2&-1\\ 0&0&6&-1 \end{bmatrix}

此后,可以直接进行递归求解,求出U\mathbf U第二行:

L=[1112101]U=[2112111]A(1)=[2112011100210061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&\cdot&1\\ 0&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&\cdot&\cdot\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(1)}=\begin{bmatrix} 2&1&1&2\\ 0&1&1&1\\ 0&0&2&-1\\ 0&0&6&-1 \end{bmatrix}

求出L\mathbf L第二列:

L=[111201001]U=[2112111]A(1)=[2112011100210061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&0&1\\ 0&0&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&\cdot&\cdot\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(1)}=\begin{bmatrix} 2&1&1&2\\ 0&1&1&1\\ 0&0&2&-1\\ 0&0&6&-1 \end{bmatrix}

减掉A\mathbf A中第二行和第二列带来的影响(实际上这里没有影响,因此不变);然后求出U\mathbf U第三行:

L=[111201001]U=[211211121]A(2)=[2112011100210061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&0&1\\ 0&0&\cdot&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&2&-1\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(2)}=\begin{bmatrix} 2&1&1&2\\ 0&1&1&1\\ 0&0&2&-1\\ 0&0&6&-1 \end{bmatrix}

求出L\mathbf L第三列:

L=[1112010031]U=[211211121]A(2)=[2112011100210061]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&0&1\\ 0&0&3&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&2&-1\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(2)}=\begin{bmatrix} 2&1&1&2\\ 0&1&1&1\\ 0&0&2&-1\\ 0&0&6&-1 \end{bmatrix}

更新A\mathbf A

L=[1112010031]U=[211211121]A(3)=[2112011100210002]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&0&1\\ 0&0&3&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&2&-1\\ &&&\cdot\\ \end{bmatrix} \quad \mathbf A^{(3)}=\begin{bmatrix} 2&1&1&2\\ 0&1&1&1\\ 0&0&2&-1\\ 0&0&0&2 \end{bmatrix}

于是

L=[1112010031]U=[2112111212]\mathbf L=\begin{bmatrix} 1\\ 1&1\\ 2&0&1\\ 0&0&3&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 2&1&1&2\\ &1&1&1\\ &&2&-1\\ &&&2\\ \end{bmatrix}

注意到循环更新A\mathbf A的过程其实就是将A\mathbf A化为U\mathbf U的形式,与高斯消去法在理论上完全一致,但可以直接采取同时消去A\mathbf A右下角整个块的方式,人工计算更加迅速。计算机计算时两种方法对稠密矩阵表现相近,稀疏矩阵会有差别

LU分解的用途

尽管LU分解的复杂度仍为O(n3)O(n^3),但如果已经完成LU分解,再进行解方程(即解Ly=b\mathbf {Ly}=\mathbf bUx=y\mathbf {Ux}=\mathbf y两个方程)的复杂度只有O(n2)O(n^2),因此,对同一个矩阵多个右端项的问题,只需进行一次LU分解,就可以对pp个右端项达到O(n3+pn2)O(n^3+pn^2)的复杂度

选主元技术

在LU分解过程中可能会出现遇到零主元使LU分解无法继续的情况,然而这种情况其实可以通过调换原方程组的方程顺序解决,下面讨论这种技术


定理(零主元出现的条件)ARn×n\mathbf A\in \mathbb R^{n\times n},高斯消去过程中不出现零主元当且仅当A\mathbf A的前n1n-1个顺序主子式均不为零


事实上,在进行方程组求解的时候,交换两个方程的顺序并不会影响方程组求解,尽管这会改变方程组的矩阵。因此,对于以求解方程组为目标的LU分解,我们可以适当交换矩阵两行的顺序

注意到在LU分解进行了k1k-1步时,第k,,nk,\cdots,n行在消去状态上是完全等价的,因此如果此时发现akk(k)=0a_{kk}^{(k)}=0,但ajk(k)0,j>ka_{jk}^{(k)}\neq 0, j>k,则可以交换第jj行与第kk行而不影响方程求解

这被称为选主元技术

事实上,主元较大时,数值误差的传播会减小,因此我们可以强制选择绝对值较大的主元,来增强算法稳定性

但为了保证方程求解的顺利进行,我们需要记录下来发生交换的行。对于单一右端项的情况,我们可以同时交换右端项的元素顺序而不做这样的记录,但这对多右端项的问题不适用,因此较好的办法是用一个置换矩阵P\mathbf P来记录,形成PLU分解

设PLU分解过程中第kk步的交换矩阵为Pk\mathbf P_k,消去矩阵为Mk\mathbf M_k,则有

Mn1Pn1M2P2M1P1A=U\mathbf M_{n-1}\mathbf P_{n-1}\cdots \mathbf M_2\mathbf P_2\mathbf M_1\mathbf P_1\mathbf A =\mathbf U

于是

Pn1M2P2M1P1A=M(n1)1U\mathbf P_{n-1}\cdots \mathbf M_2\mathbf P_2\mathbf M_1\mathbf P_1\mathbf A =\mathbf M_{(n-1)}^{-1}\mathbf U

由于交换矩阵满足

Pk2=I\mathbf P_k^2=\mathbf I

由于Mk\mathbf M_k起消去第kk列的作用,只在第kk列有非对角元素,而Pk\mathbf P_k交换第kk行和某一个第kk行下方的行,于是

PjMkPj=Mˉk\mathbf{P}_j\mathbf{M}_k\mathbf{P}_j=\bar{\mathbf{M}}_k

仍然是消去第kk列的消去阵

因此可以作如下变形

(Pn1Mn2Pn1)(Pn1Pn2Mn3Pn2Pn1)(Pn1P3P2M1P2P3Pn1)(Pn1P2P1)A=M(n1)1U(\mathbf P_{n-1}\mathbf M_{n-2}\mathbf P_{n-1})(\mathbf P_{n-1}\mathbf P_{n-2}\mathbf M_{n-3}\mathbf P_{n-2}\mathbf P_{n-1})\cdots (\mathbf P_{n-1}\cdots\mathbf P_3\mathbf P_2\mathbf M_1\mathbf P_2\mathbf P_3\cdots\mathbf P_{n-1})(\mathbf P_{n-1}\cdots\mathbf P_2\mathbf P_1)\mathbf A =\mathbf M_{(n-1)}^{-1}\mathbf U

左端记为

Mˉn2Mˉn3Mˉ1PA=Mn11U\bar{\mathbf M}_{n-2}\bar{\mathbf M}_{n-3}\cdots\bar{\mathbf M}_{1}\mathbf P\mathbf A=\mathbf M_{n-1}^{-1}\mathbf U

于是,将左侧所有带横线的矩阵逆到右边,可以得到以下形状:

PA=LU\mathbf {PA}=\mathbf {LU}

这就得到了一个PLU分解


实际计算时,我们只需要在计算过程中加入行交换,并使用向量p\mathbf p来记录行置换矩阵P\mathbf PP\mathbf P极其稀疏,只需要记录nn个整数即可),具体地,我们仍然以上一节的例子进行计算(这次我们省略U\mathbf U的中间表示):

p=[1,2,3,4]L=[1111]A=[2112222342430061]\mathbf p=[1,2,3,4]\quad \mathbf L=\begin{bmatrix} 1\\ \cdot&1\\ \cdot&\cdot&1\\ \cdot&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf A=\begin{bmatrix} 2&1&1&2\\ 2&2&2&3\\ 4&2&4&3\\ 0&0&6&-1 \end{bmatrix}

交换第1、3行:

p=[3,2,1,4]L=[1111]A=[4243222321120061]\mathbf p=[3,2,1,4]\quad \mathbf L=\begin{bmatrix} 1\\ \cdot&1\\ \cdot&\cdot&1\\ \cdot&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf A=\begin{bmatrix} 4&2&4&3\\ 2&2&2&3\\ 2&1&1&2\\ 0&0&6&-1 \end{bmatrix}

消去第1行、第1列:

p=[3,2,1,4]L=[11/211/2101]A(1)=[42430103/20011/20061]\mathbf p=[3,2,1,4]\quad \mathbf L=\begin{bmatrix} 1\\ 1/2&1\\ 1/2&\cdot&1\\ 0&\cdot&\cdot&1\\ \end{bmatrix} \quad \mathbf A^{(1)}=\begin{bmatrix} 4&2&4&3\\ 0&1&0&3/2\\ 0&0&-1&1/2\\ 0&0&6&-1 \end{bmatrix}

第2行、第2列已经消除完毕:

p=[3,2,1,4]L=[11/211/201001]A(2)=[42430103/20011/20061]\mathbf p=[3,2,1,4]\quad \mathbf L=\begin{bmatrix} 1\\ 1/2&1\\ 1/2&0&1\\ 0&0&\cdot&1\\ \end{bmatrix} \quad \mathbf A^{(2)}=\begin{bmatrix} 4&2&4&3\\ 0&1&0&3/2\\ 0&0&-1&1/2\\ 0&0&6&-1 \end{bmatrix}

交换第3行、第4行(注意此时要同时在L\mathbf L中重排):

p=[3,2,4,1]L=[11/210011/201]A(2)=[42430103/200610011/2]\mathbf p=[3,2,4,1]\quad \mathbf L=\begin{bmatrix} 1\\ 1/2&1\\ 0&0&1\\ 1/2&0&\cdot&1\\ \end{bmatrix} \quad \mathbf A^{(2)}=\begin{bmatrix} 4&2&4&3\\ 0&1&0&3/2\\ 0&0&6&-1\\ 0&0&-1&1/2 \end{bmatrix}

消去第3行、第3列:

p=[3,2,4,1]L=[11/210011/201/61]A(3)=[42430103/200610001/3]\mathbf p=[3,2,4,1]\quad \mathbf L=\begin{bmatrix} 1\\ 1/2&1\\ 0&0&1\\ 1/2&0&-1/6&1\\ \end{bmatrix} \quad \mathbf A^{(3)}=\begin{bmatrix} 4&2&4&3\\ 0&1&0&3/2\\ 0&0&6&-1\\ 0&0&0&1/3 \end{bmatrix}

得到最终结果:

P=[1111]L=[11/210011/201/61]U=[4243103/2611/3]\mathbf P=\begin{bmatrix} &&1&\\ &1&&\\ &&&1\\ 1&&& \end{bmatrix} \quad\mathbf L=\begin{bmatrix} 1\\ 1/2&1\\ 0&0&1\\ 1/2&0&-1/6&1\\ \end{bmatrix} \quad \mathbf U=\begin{bmatrix} 4&2&4&3\\ &1&0&3/2\\ &&6&-1\\ &&&1/3 \end{bmatrix}


在实际计算中,由于L\mathbf L的对角元素不需要存储,可以直接将其下三角元素存储在A\mathbf A的已经消去的下三角元素的位置;同时,为了避免大量数据交换,不会真的对矩阵进行重排,而是通过向量p\mathbf p维护下标映射,进行“懒重排”

上述算法称为部分选主元技术,因为其主元选取只选择待消去列中绝对值最大的元素,实际上可以有更加稳定的全选主元技术,同时进行行、列交换使得整个待消去的右下角子阵中绝对值最大的元素作为主元。这样的技术稳定性更好,但开销也响应更大,得到的分解形如PAQ=LU\mathbf{PAQ}=\mathbf{LU}

LU分解的稳定性与其增长因子有关,定义为

ρ=maxi,juijmaxi,jaij\rho=\frac{\max\limits_{i,j}|u_{ij}|}{\max\limits_{i,j}|a_{ij}|}

对解方程的过程作向后误差分析,即使(A+ΔA)x^=b(\mathbf A+\Delta\mathbf {A})\hat{\mathbf x}=\mathbf bΔA\Delta\mathbf A满足

ΔAAnρεmach\frac{||\Delta\mathbf A||_\infty}{||\mathbf A||_\infty}\leq n\rho\varepsilon_{\rm mach}

对部分选主元技术,可以证明ρ2n1\rho\leq 2^{n-1},而一般情况下ρ<10\rho<10;如果不选主元则ρ\rho不受控制

ρ=2n1\rho=2^{n-1}的一个例子:

A=[10.50110.750.5110.250.75110.250.251]\mathbf A=\begin{bmatrix}1&-0.5&0&1\\-1&0.75&-0.5&1 \\-1&0.25&0.75&1\\-1&0.25&0.25&1 \end{bmatrix}

此矩阵无需置换即可达到部分选主元,但其分解结果为

L=[1111111111]\mathbf L=\begin{bmatrix}1\\-1&1\\-1&-1&1\\-1&-1&-1&1\end{bmatrix}

U=[10.5010.250.520.2548]\mathbf U=\begin{bmatrix}1&-0.5&0&1\\&0.25&-0.5&2\\&&0.25&4\\&&&8\end{bmatrix}

每次消去时,最后一列的元素都恰好翻一倍。可以证明这也是它能够变大的最大倍数

对称正定矩阵的Cholesky分解

对称正定矩阵一定可以进行LU分解,且其LU分解可以写成更好的对称形式:

A=LDLT\mathbf A=\mathbf {LDL}^T

其中D\mathbf D为对角阵

如果令D\mathbf D的所有对角元素取算术平方根得到的矩阵为D1/2\mathbf D^{1/2},则

A=(LD1/2)(LD1/2)T\mathbf A=(\mathbf {LD}^{1/2})(\mathbf {LD}^{1/2})^T

L~=LD1/2\tilde{\mathbf L}=\mathbf{LD}^{1/2}

A=L~L~T\mathbf A=\tilde{\mathbf L}\tilde{\mathbf L}^T

定理(Cholesky分解) 对称正定矩阵的A=LLT\mathbf A=\mathbf {LL}^T形式分解存在且唯一


下面我们仿照之前的思路进行Cholesky分解,注意由于矩阵对陈,我们只需要记录其一半的元素即可

[4242×1081××95×××19]\begin{bmatrix} 4&2&4&2\\ \times&10&8&1\\ \times&\times&9&5\\ \times&\times&\times&19 \end{bmatrix}

处理第一行和第一列(先对对角元求平方根,然后对其它元素等比例缩小)

[21211081×95××19]\begin{bmatrix} 2&1&2&1\\ &10&8&1\\ &\times&9&5\\ &\times&\times&19 \end{bmatrix}

更新右下角(用右下角的原始矩阵减去第一列乘第一行的对应位置)

[2121960×53××18]\begin{bmatrix} 2&1&2&1\\ &9&6&0\\ &\times&5&3\\ &\times&\times&18 \end{bmatrix}

处理第二行和第二列

[212132053×18]\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&5&3\\ &&\times&18 \end{bmatrix}

更新右下角

[212132013×18]\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&1&3\\ &&\times&18 \end{bmatrix}

处理第三行和第三列

[21213201318]\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&1&3\\ &&&18 \end{bmatrix}

更新右下角

[2121320139]\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&1&3\\ &&&9 \end{bmatrix}

处理右下角元素(开平方即可)

[2121320133]\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&1&3\\ &&&3 \end{bmatrix}

完成计算,得到的分解为

L=[2132211033]LT=[2121320133]\mathbf L=\begin{bmatrix} 2&&&\\ 1&3&&\\ 2&2&1&\\ 1&0&3&3 \end{bmatrix} \quad \mathbf L^T=\begin{bmatrix} 2&1&2&1\\ &3&2&0\\ &&1&3\\ &&&3 \end{bmatrix}

Cholesky分解算法非常稳定,其增长因子ρ1\rho\leq1,存储量与计算量与一般LU分解在渐进阶上一致,但常数约为一半

带状矩阵

对角阵→三对角阵→带状阵

定义(带状矩阵)ARn×n\mathbf A\in\mathbb R^{n\times n},若i,j:ij>β\forall i,j:|i-j|>\beta都有aij=0a_{ij}=0k\exists kak,kβ,ak,k+βa_{k,k-\beta},a_{k,k+\beta}至少一个非零,则称A\mathbf A半带宽β\beta带状矩阵

带状矩阵的LU分解结果仍然是不超过原始带宽的带状矩阵

特别地,对三对角矩阵,可以只考虑三对角的元素,用线性向量存储,同时计算LU分解也只计算三对角元素,复杂度降低为线性

对一般的带状矩阵,在不选主元的情况下,时间复杂度O(β2n)O(\beta^2n),空间复杂度O(βn)O(\beta n)

然而带状矩阵的逆是稠密的,因此计算逆矩阵永远是不好的选择


不选主元也有稳定LU分解的矩阵:

  • 对称正定矩阵
  • 对角占优矩阵

定义(按行对角占优矩阵) i, aiij=1,jinaij\forall i,\ |a_{ii}|\geq\sum\limits_{j=1,j\neq i}^{n}|a_{ij}|,且至少一个大于号成立

类似可以定义按列对角占优按行/列严格对角占优

对于带状矩阵,即使选主元,L和U的带宽也不会超过原始矩阵带宽的两倍

稀疏矩阵

稀疏矩阵要求使用非常规的数据结构存储,以达到在计算和存储时优化掉零元素带来的大量浪费的目的

常见的数据结构有:

  • COO格式:包含NN(非零元个数)个三元组(row,column,value)
  • 压缩稀疏行(CSR)格式:包含NN个按行顺序存储的二元组(column,value)和一个nn长度数组prow,后者记载了每一行在前者中的起始点;相比COO格式节省了NnN-n个整数
  • 压缩稀疏列(CSC)
  • 若干个一维数组(例如带状矩阵)
  • 分块CSR

非线性方程组求解

这实际上是非线性方程求解的多维拓展,下面介绍之前的几种方法的拓展

不动点迭代法

f(x)=0\mathbf f(\mathbf x)=\mathbf 0,其中xRn\mathbf x\in \mathbb R^nf:RnRn\mathbf f:\mathbb R^n\to\mathbb R^n,构造一个g\mathbf g使g(x)=xf(x)=0\mathbf g(\mathbf x)=\mathbf x\Leftrightarrow \mathbf f(\mathbf x)=\mathbf 0,则仍然可以进行不动点迭代

回忆:一元不动点迭代的局部收敛准则为g(x)<1|g'(x^*)|<1

一元函数的导数对应多元函数的Jacobi矩阵

Jg(x):Jg,ij(x)=gi(x)xj\mathbf J_g(\mathbf x):\quad J_{g,ij}(\mathbf x)=\frac{\partial g_i(\mathbf x)}{\partial x_j}

则局部收敛准则变为Jg(x)\mathbf J_g(\mathbf x^*)的所有特征值都满足λ<1|\lambda|<1

牛顿法

回忆一元牛顿法的迭代公式:

xk+1=xkf(xk)f(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}

类似得到多元牛顿法:

xk+1=xk[Jf(xk)]1f(xk)\mathbf x_{k+1}=\mathbf x_k-[\mathbf J_f(\mathbf x_k)]^{-1}\mathbf f(\mathbf x_k)