这一章的核心是:
如何用有限次加、减、乘、除,把线性方程组
Ax=b
解出来,并尽量让计算过程稳定、可编程、可复用。
这一章和下一章都围绕线性方程组展开:
- Chapter 2:直接方法
- 有限步内把方程组化成容易解的形式
- 代表方法:Gauss 消去法、主元素法、LU 分解、Cholesky 分解
- Chapter 3:迭代方法
- 从初值开始逐步逼近真解
- 适合更大规模、更稀疏的问题
这章最重要的思想链条是:
直接方法的目标不只是“会手算”,更重要的是:
- 程序怎么写
- 运算量是多少
- 舍入误差会不会被放大
- 矩阵结构能不能利用
- 同一个 A、不同右端项 b 时能不能复用已有计算
线性方程组与直接方法#
一般线性方程组写成:
⎩⎨⎧a11x1+a12x2+⋯+a1nxn=b1,a21x1+a22x2+⋯+a2nxn=b2,⋯an1x1+an2x2+⋯+annxn=bn.矩阵形式为:
Ax=b,其中
A=(aij)n×n,x=(x1,x2,…,xn)T,b=(b1,b2,…,bn)T.如果 det(A)=0,方程组有唯一解。
为什么不用 Cramer 法则#
Cramer 法则给出了解析表达:
xi=det(A)det(Ai),其中 Ai 是把 A 的第 i 列替换成 b 后得到的矩阵。
但它在数值计算中基本不可用,主要原因是:
- 行列式展开会产生阶乘级别的计算量
- n! 增长极快,远大于多项式复杂度
- 实际计算中还会伴随大量舍入误差
所以 Cramer 法则适合说明理论存在性,不适合真正写程序求解大规模线性方程组。
直接方法的基本想法#
直接方法的核心思路:
- 通过等价变换,把原方程组变成容易解的方程组
- 最典型的目标形式是上三角方程组
- 再用回代得到所有未知量
也就是:
其中 U 是上三角矩阵。
TIP消元过程不能改变方程组的解。
从方程组角度看,它是“某一行减去另一行的倍数”;从矩阵角度看,它是左乘初等行变换矩阵。
工程问题中的矩阵规模与稀疏性#
老师上课举了一个很重要的工程直观:
如果要计算一个飞行器、炮弹或流场周围每个网格点上的物理量,最终往往也会落到某种线性方程组:
Ax=b.例如在 1m×1m×1m 的区域内,如果空间步长取 1mm,单个标量未知量的网格点数量已经达到约
10003=109.这意味着未知量可能达到十亿量级。若矩阵是满矩阵,存储和计算都很难承受。
但真实物理模型往往有局部性:
- 一个网格点通常只和附近网格点强相关
- 很远处的点对它的直接影响可忽略
- 于是矩阵中大量元素为 0
这种矩阵叫 稀疏矩阵(sparse matrix)。
在一维局部相邻作用模型中,矩阵常常呈现三对角结构;二维、三维中也会出现带状或稀疏结构。
配图占位:插入 lesson2 手写 PPT 中“网格点局部耦合导致稀疏矩阵 / 三对角矩阵”的示意图。
Gauss 消去法#
基本消元过程#
以第 k 步为例,假设当前主元为 akk(k),希望消去第 k 列中 k 行以下的元素。
对 i=k+1,k+2,…,n,令
lik=akk(k)aik(k).然后做行变换:
第 i 行←第 i 行−lik⋅第 k 行.于是有
aij(k+1)=aij(k)−likakj(k),j=k+1,k+2,…,n,以及右端项
bi(k+1)=bi(k)−likbk(k).经过 n−1 轮消元后,原方程组化为上三角方程组:
Ux=c.上三角方程组形如:
⎩⎨⎧u11x1+u12x2+⋯+u1nxn=c1,u22x2+⋯+u2nxn=c2,⋯unnxn=cn.先由最后一行得到
xn=unncn,再依次向上求:
xk=ukkck−∑j=k+1nukjxj,k=n−1,n−2,…,1.这一步叫 回代(back substitution)。
运算量#
Gauss 消去的主要计算量来自消元。
粗略看:
(n−1)2+(n−2)2+⋯+12=O(n3).回代的计算量为
1+2+⋯+(n−1)=O(n2).因此整体复杂度为
O(n3).TIPGauss 消去法比 Cramer 法则实用得多:
Cramer 法则接近阶乘级复杂度,Gauss 消去法是三次多项式复杂度。
例:三元线性方程组的消元#
课本例子:
⎩⎨⎧x1+x2+x3=6,12x1−3x2+3x3=15,−18x1+3x2−x3=−15.写成增广矩阵:
112−181−3313−1615−15.第一步,用第 1 行消去第 1 列下面的元素:
R2←R2−12R1,R3←R3+18R1.得到
1001−15211−9176−5793.第二步,用第 2 行消去第 2 列下面的元素:
R3←R3+57R2.得到上三角方程组:
1001−1501−95226−57522.回代:
x3=1,−15x2−9=−57⇒x2=3,x1+x2+x3=6⇒x1=2.所以
x=(2,3,1)T.
主元素法#
小主元为什么危险#
Gauss 消去法中,每一步都要除以主元 akk(k)。
如果主元很小,形如
lik=akk(k)aik(k)中的分母很小,舍入误差会被放大。
这会导致:
- 理论上等价的行变换,在浮点数计算中产生严重误差
- 后续步骤继续使用带误差的数据,误差不断传播
- 最终结果可能偏离真解很多
所以数值计算里不能只看“代数上能不能消”,还要看“消元顺序是否稳定”。
列主元素 Gauss 消去法#
列主元素法的规则:
第 k 步消元前,在第 k 列的第 k 行到第 n 行中,选绝对值最大的元素作为主元,并把它所在行交换到第 k 行。
数学写法:
p=argk≤i≤nmax∣aik(k)∣.若 p=k,先交换第 p 行和第 k 行,再继续消元。
这样做的目的:
- 避免用很小的数作分母
- 降低舍入误差被放大的风险
- 不改变未知量 x1,x2,…,xn 的顺序
TIP只交换行,未知量编号不变。
如果交换列,x 的分量顺序也会变化,程序实现更麻烦。
例:例 2.1 的数值不稳定#
课本例 2.1:
⎩⎨⎧0.50x1+1.1x2+3.1x3=6.0,2.0x1+4.5x2+0.36x3=0.02,5.0x1+0.96x2+6.5x3=0.96.若按原顺序直接用普通 Gauss 消去法,在有限位数计算下会得到近似结果:
x1≈−5.80,x2≈2.40,x3≈2.00.真解应为:
x1=−2.60,x2=1.00,x3=2.00.误差的关键原因在于:第一次消元后,第二步主元附近出现了类似 0.1 的小数。下一轮消元要除以它,舍入误差被大幅放大。
列主元素法的做法:第一列中绝对值最大的元素是 5.0,先把第 3 行换到第 1 行:
⎩⎨⎧5.0x1+0.96x2+6.5x3=0.96,2.0x1+4.5x2+0.36x3=0.02,0.50x1+1.1x2+3.1x3=6.0.接下来再消元,主元分母从 0.50 换成 5.0,误差不会被小分母放大。最终可得到正确近似:
x1≈−2.60,x2≈1.00,x3≈2.00.
配图占位:插入 lesson2 手写 PPT 中“例 2.1 小主元导致误差放大,以及交换行后主元变大”的推导截图。
全主元素法#
全主元素法在每一步中,从剩余子矩阵中选绝对值最大的元素作为主元。
它比列主元素法更稳定,但会带来列交换。
列交换意味着未知量顺序变化,例如 x1 和 x2 的位置可能被交换,程序中需要额外记录变量顺序。
实际工程计算中,常用列主元素法;全主元素法用得较少。
初等行变换与 LU 分解#
初等行变换矩阵#
交换矩阵左乘一个矩阵,就等价于交换它的行。
例如
A=147258369.若要交换第 1 行和第 3 行,可以构造
P13=001010100.于是
P13A=741852963.这一点说明:
对矩阵做初等行变换,可以理解为左乘某个初等矩阵。
消元也是初等行变换。比如
Ri←Ri−li1R1对应的初等矩阵是在单位矩阵的 (i,1) 位置放入 −li1。
Gauss 消去与 LU 分解的关系#
不选主元时,Gauss 消去可以写成一串初等矩阵左乘:
Ln−1⋯L2L1A=U,其中 U 是上三角矩阵。
于是
A=(Ln−1⋯L2L1)−1U.把左边这一串逆矩阵记为 L,得到
A=LU.这里通常取:
这种形式也叫 Doolittle 分解。
TIPGauss 消去过程中的乘子 lik,最后会出现在 L 的下三角部分。
U 则是消元后的上三角矩阵。
压缩存储格式#
在普通消元中,被消掉的位置本来会变成 0。
例如第一列中 a21,a31,…,an1 被消成 0,但这些位置可以拿来存放对应的消元乘子:
l21,l31,…,ln1.因此可以把 L 和 U 存在同一个二维数组中:
u11l21l31⋮ln1u12u22l32⋮ln2u13u23u33⋮ln3⋯⋯⋯⋱⋯u1nu2nu3n⋮unn.这就是老师反复强调的 压缩存储格式。
它的好处:
- 不额外开一个矩阵存 L
- 原来应为 0 的位置被有效利用
- 更接近真实程序中的 LU 分解实现
为什么 LU 分解有用#
如果只解一个方程组,Gauss 消去和 LU 分解的计算量接近,都是 O(n3)。
但如果同一个 A 对应多个右端项:
Ax=b(1),Ax=b(2),Ax=b(3),…LU 分解就非常有用。
先做一次
A=LU.每次解
Ax=b时,只需解两个三角方程组:
Ly=b,Ux=y.其中:
- Ly=b:前代,O(n2)
- Ux=y:回代,O(n2)
所以:
这就是 LU 分解在工程计算中的核心意义。
WARNING工程计算中通常不会真的求 A−1。
如果需要 A−1 对某个向量的作用,例如 q=A−1p,实际做法是解
Aq=p.若已经有 A=LU,就通过前代和回代得到 q。
带列主元素的三角分解:PA = LU#
如果消元过程中发生了行交换,分解形式要写成
PA=LU,而不能只写 A=LU。
其中 P 是置换矩阵,记录行交换。
理解方式:
- P 把 A 的行重新排列
- 对重新排列后的矩阵做普通 LU 分解
- 列主元素法对应的分解结果就是 PA=LU
例:带列主元素的 LU 分解#
老师课上重新演示了课本例 2.5。设
A=024622−31030−6121−5,b=0−2−76.第一列主元选绝对值最大的 6,所以第 4 行换到最上面。
第一轮消元后,压缩存储形式为:
631320135−3112−6540−531131316−4−110.第二列主元在剩余行中选 −311,所以当前第 2 行和第 3 行交换。继续消元后得到:
6323101−311−115−116−6411751124−5313116211376−11−9−6.第三列不用换主元,消元乘子为
11751124=258.最终得到
P=0001001001001000,L=13231001−115−1160012580001,U=60001−31100−6411750−531311622539.它们满足
PA=LU.如果继续求解方程组,最终得到
x=(−21,1,31,−2)T.
配图占位:插入 lesson3 手写 PPT 中“例 2.5 带列主元素 LU 分解的压缩存储表格”截图。
TIP这个例子的重点是理解结构:
行交换通过 P 记录,消元乘子进入 L,剩下的上三角部分构成 U。
三对角方程组与追赶法#
三对角矩阵从哪里来#
三对角方程组形如:
b1a20c1b2a3c2b3⋱c3⋱an0⋱bnx1x2x3⋮xn=d1d2d3⋮dn.也就是只有三条对角线上可能非零:
- 主对角线 bi
- 上副对角线 ci
- 下副对角线 ai
这种结构常来自一维网格上的局部耦合。
例如:某点 xi 的方程只考虑相邻点 xi−1、xi、xi+1 的影响,远处点影响忽略,于是每一行只有三个非零元素。
如果网格等距、材料均匀,还常常得到对称三对角矩阵。
三对角矩阵的 LU 分解#
设
A=LU,其中
L=1l201l31⋱⋱ln01,U=u10c1u2c2u3c3⋱0⋱un.把 L 和 U 相乘并对比 A,可得:
u1=b1,对 i=2,3,…,n,有
li=ui−1ai,ui=bi−lici−1.注意:上副对角线 ci 不变。
追赶法求解步骤#
追赶法分三步。
第一步:分解
u1=b1,li=ui−1ai,ui=bi−lici−1,i=2,3,…,n.第二步:前代解 Ly=d
y1=d1,yi=di−liyi−1,i=2,3,…,n.第三步:回代解 Ux=y
xn=unyn,xi=uiyi−cixi+1,i=n−1,n−2,…,1.所以追赶法只需要三个循环,计算量为
O(n).这比普通 LU 分解的 O(n3) 低很多。
WARNING三对角结构非常宝贵。
如果直接把它当作一般满矩阵处理,会浪费大量计算和存储。
配图占位:插入 lesson3 手写 PPT 中“三对角矩阵结构与追赶法三个循环”的截图。
对称正定矩阵与平方根法#
对称正定的直观来源#
对称正定矩阵在工程建模中非常常见。
对称性常来自物理作用的互易性:
- 点 i 对点 j 的影响
- 点 j 对点 i 的影响
在均匀材料、对称几何或对称相互作用下,这两者常常对应同一系数。
正定性可理解为能量意义上的“稳定”:
xTAx>0,x=0.在很多弹性、热传导、扩散等问题中,系统能量为正,离散后得到的矩阵也常为对称正定矩阵。
TIP当你在工程建模中断言 A 是对称正定矩阵时,背后通常包含物理假设:局部作用、能量稳定、材料或几何的对称性。
Cholesky 分解#
定理:若 A 是对称正定矩阵,则存在唯一的下三角矩阵 L,且 L 的对角元全为正,使得
A=LLT.这叫 Cholesky 分解,也叫平方根法。
对于
A=(aij)n×n,算法为:
lkk=akk−j=1∑k−1lkj2,k=1,2,…,n.对 i=k+1,k+2,…,n,
lik=lkkaik−∑j=1k−1lijlkj.正定性保证根号内为正,因此算法能继续做下去。
若要求解
Ax=b,由于
A=LLT,可分两步:
Ly=b,LTx=y.第一步前代,第二步回代。
改进平方根法:LDL^T 分解#
Cholesky 分解需要开平方。开平方在计算上比加减乘除更贵。
为了避免开平方,可以把分解写成
A=LDLT,其中:
设
D=diag(d1,d2,…,dn).算法为:
dk=akk−j=1∑k−1lkj2dj,k=1,2,…,n.对 i=k+1,k+2,…,n,
lik=dkaik−∑j=1k−1lijlkjdj.求解时分三步:
Ly=b,Dz=y,LTx=z.TIPLDLT 分解保留了对称正定结构,又避开了开平方运算,在程序实现中很实用。
配图占位:插入 lesson3 手写 PPT 中“Cholesky 与 LDL^T 待定系数推导”的截图。
向量范数、矩阵范数与条件数#
前面的算法都在处理误差与稳定性。要严格讨论“误差多大”,需要先定义向量和矩阵的大小,这就是范数。
向量范数#
向量范数是从 Rn 到 R 的映射:
x↦∥x∥.它要满足:
- 非负性与正定性
∥x∥≥0,∥x∥=0⟺x=0.
- 齐次性
∥αx∥=∣α∣∥x∥.
- 三角不等式
∥x+y∥≤∥x∥+∥y∥.常用向量范数有:
1 范数
∥x∥1=i=1∑n∣xi∣.2 范数
∥x∥2=(i=1∑nxi2)1/2.它就是欧氏长度。
无穷范数
∥x∥∞=1≤i≤nmax∣xi∣.在 R2 中,不同范数下的“单位圆”形状不同:
这说明范数改变后,几何意义也会改变。
配图占位:插入 lesson3 手写 PPT 中“2 范数圆与无穷范数正方形单位圆”的示意图。
矩阵范数#
矩阵范数给矩阵定义大小。对 A,B∈Rn×n,矩阵范数满足:
- 非负性与正定性
∥A∥≥0,∥A∥=0⟺A=0.
- 齐次性
∥αA∥=∣α∣∥A∥.
- 三角不等式
∥A+B∥≤∥A∥+∥B∥.
- 相容性 / 次乘性
∥AB∥≤∥A∥∥B∥.相容性非常重要,因为矩阵代表线性算子。它允许我们估计多次线性作用带来的放大效果。
例如:
∥Am∥≤∥A∥m.若 ∥A∥<1,则 ∥Am∥→0。
向量诱导的矩阵范数#
给定一个向量范数,可以定义对应的矩阵范数:
∥A∥=x=0max∥x∥∥Ax∥.由于
∥x∥∥Ax∥=A∥x∥x,所以也可以理解为:
在所有单位向量上,找出 A 对向量长度的最大放大倍数。
常用诱导矩阵范数:
矩阵 1 范数
∥A∥1=1≤j≤nmaxi=1∑n∣aij∣.即最大列和。
矩阵无穷范数
∥A∥∞=1≤i≤nmaxj=1∑n∣aij∣.即最大行和。
矩阵 2 范数
∥A∥2=λmax(ATA).其中 λmax(ATA) 是 ATA 的最大特征值。
还有一个常用但非诱导的矩阵范数:Frobenius 范数
∥A∥F=(i=1∑nj=1∑naij2)1/2.它计算方便,性质也很好,很多场合可作为 2 范数的替代估计。
条件数#
考虑
Ax=b.若右端项有扰动:
A(x+δx)=b+δb.因为 Ax=b,相减得
Aδx=δb.若 A 非奇异,则
δx=A−1δb.于是
∥δx∥≤∥A−1∥∥δb∥.另一方面
∥b∥=∥Ax∥≤∥A∥∥x∥,所以
∥x∥∥δx∥≤∥A∥∥A−1∥∥b∥∥δb∥.定义矩阵 A 的条件数:
κ(A)=∥A∥∥A−1∥.因此
∥x∥∥δx∥≤κ(A)∥b∥∥δb∥.条件数的意义:
它衡量输入相对误差可能被放大多少倍后传到解中。
- κ(A) 小:问题条件好
- κ(A) 大:问题病态,右端项中的小误差可能造成解的大误差
工程直观:
如果测量得到的 b 本身有 10% 误差,那么解 x 的误差可能被 κ(A) 放大。模型建得好不好,不只看方程形式,也要看条件数是否可接受。
WARNING条件数描述的是问题本身对扰动的敏感性。
算法稳定性描述的是计算方法在有限精度下是否额外放大误差。二者都重要。
本章总结#
这一章的主线可以压缩成几句话:
- 线性方程组 Ax=b 是工程计算的核心问题之一。
- Cramer 法则有理论意义,但运算量过大。
- Gauss 消去法通过消元把方程组化为上三角方程组,再回代求解。
- 普通 Gauss 消去可能遇到小主元,导致舍入误差被放大。
- 列主元素法通过行交换选较大主元,提高数值稳定性。
- 从初等行变换角度看,Gauss 消去本质上产生了 LU 分解。
- 不换行时 A=LU,带列主元素时 PA=LU。
- LU 分解适合同一个 A、多个 b 的问题:一次分解,多次前代回代。
- 三对角矩阵可用追赶法,计算量从 O(n3) 降到 O(n)。
- 对称正定矩阵可用 Cholesky 分解 A=LLT,也可用无需开根号的 A=LDLT。
- 范数提供“误差大小”的度量,条件数刻画误差放大能力。
本章真正要掌握的是:
方程组怎么解、为什么这样解、计算量是多少、误差在哪里被放大、矩阵结构如何帮助我们更快更稳地解。