上一篇的方程组 Newton 法在每一步都要解一个线性方程组。本篇集中研究这个线性子问题:给定 A∈Rn×n 和 b∈Rn,计算
Ax=b.
在精确算术中,消元法经过有限次运算便可得到解,因此称为直接法。浮点计算却带来三个必须分开的疑问:矩阵是否可逆,数据扰动会使精确解变化多少,算法产生的舍入误差又有多大。可逆性、问题的条件性和算法的稳定性不是同一件事。
除特别说明外,本篇假设 A 为实方阵。讨论相对误差时还假设相应的分母不为零;所有运算量均按加、减、乘、除各计一次浮点运算,只保留关于 n 的主要项。
1. 向量范数与矩阵范数
1.1 用范数统一衡量误差
定义(向量范数)
映射 ∥⋅∥:Rn→[0,∞) 若满足下列条件,就称为向量范数:
- ∥x∥≥0,且 ∥x∥=0 当且仅当 x=0;
- 对任意实数 c,有 ∥cx∥=∣c∣∥x∥;
- ∥x+y∥≤∥x∥+∥y∥。
最常用的三个向量范数是
∥x∥1=i=1∑n∣xi∣,∥x∥2=(i=1∑n∣xi∣2)1/2,∥x∥∞=imax∣xi∣.
有限维空间中的所有范数都给出相同的收敛概念,但数值大小和误差界中的常数会随范数改变。写条件数或相对误差时,应说明所用范数,不能把不同范数下的量直接代入同一个界。
1.2 从向量范数诱导矩阵范数
定义(诱导矩阵范数)
给定一个向量范数,与之对应的诱导矩阵范数为
∥A∥=x=0max∥x∥∥Ax∥=∥x∥=1max∥Ax∥.
它立即满足相容性与次乘性:
∥Ax∥≤∥A∥∥x∥,∥AB∥≤∥A∥∥B∥.
常用诱导范数可以写成
∥A∥1=jmaxi=1∑n∣aij∣,∥A∥∞=imaxj=1∑n∣aij∣,
以及
∥A∥2=λmax(ATA)=σmax(A).
因此 1 范数是最大列绝对值和,∞ 范数是最大行绝对值和,2 范数是最大奇异值。
另一个常用量是 Frobenius 范数
∥A∥F=(i,j∑∣aij∣2)1/2.
它满足次乘性,也满足 ∥Ax∥2≤∥A∥F∥x∥2,但它不是由向量 2 范数诱导的矩阵范数。例如 ∥I∥F=n,而任意诱导范数都有 ∥I∥=1。
2. 三角方程组与 Gauss 消元
2.1 前代与回代
若 L 为下三角矩阵且对角元非零,方程 Ly=b 可依次求解:
yi=lii1(bi−j=1∑i−1lijyj),i=1,2,…,n.
这称为 前代。若 U 为对角元非零的上三角矩阵,方程 Ux=y 用 回代:
xi=uii1(yi−j=i+1∑nuijxj),i=n,n−1,…,1.
每次三角求解大约需要 n2 次运算,存储矩阵本身需要 O(n2) 个数。若三角矩阵有额外的带状或稀疏结构,实际成本应按非零元计算。
2.2 消去一个未知量
Gauss 消元的目标很具体:从左到右逐列工作,把主对角线下方的系数变成零,最终得到上三角方程组。为了让系数和右端始终接受同样的行变换,把方程组写成增广矩阵
[A∣b]=a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮annb1b2⋮bn.
一次消元只做一件事。若要用第 k 行消掉第 i 行的第 k 个系数,其中 i>k 且主元 akk(k)=0,先取乘子
mik=akk(k)aik(k).
再对整行执行
Ri←Ri−mikRk.
这里 Rk 是提供消元基准的主元行,Ri 是正在修改的目标行。乘子这样选择,是因为目标位置会恰好变为
aik(k)−mikakk(k)=aik(k)−akk(k)aik(k)akk(k)=0.
行中的其余系数和右端项也必须减去同一倍数,不能只把目标系数直接写成零。这个行变换是可逆的:从新行加回 mikRk 就恢复原行,所以它不改变方程组的解集。
处理完第 k 列主元下方的所有行后,第 k 个未知量便不再出现在后面的方程中。随后转向右下角尚未处理的子矩阵,重复“选主元—消去下方元素”,直到矩阵成为上三角形。
2.3 一个完整的三阶消元过程
考虑方程组
2x+y−z−3x−y+2z−2x+y+2z=8,=−11,=−3.
其初始增广矩阵为
2−3−21−11−1228−11−3.
第一列中绝对值最大的系数是 −3,所以先交换 R1 与 R2。此时用主元 −3 消去下面的 2 与 −2:
m21=−32=−32,m31=−3−2=32.
例如第一项行变换为
R2←R2−(−32)R1=R2+32R1,
目标系数确实成为 2+32(−3)=0。完成第一列后得到
−300−1313523132−1132313.
接下来只看右下角 2×2 子矩阵。第二列的两个候选主元是 1/3 和 5/3,所以交换 R2 与 R3,再用
m32=5/31/3=51
执行 R3←R3−51R2。上三角增广矩阵为
−300−135023251−11313−51.
最后从最下面的方程向上回代:
z=−1,y=5/313/3−(2/3)z=3,x=−3−11+y−2z=2.
下方实验把刚才的过程拆成八个动作。每次只改变一行或求出一个未知量,并同时说明“正在做什么”“为什么这一项会变成零”。建议先逐步前进,再用“上一步”回看矩阵变化。
2.4 运算量与原位存储
对稠密 n×n 矩阵,消元或等价的 LU 分解主要需要
32n3+O(n2)
次运算;一次回代需要 n2+O(n) 次运算。因此求解一个一般稠密系统的主要成本来自分解,而不是三角求解。
实现中通常用上三角部分存放 U,用严格下三角部分存放乘子,即 L 的非对角元素。右端项可以与系数矩阵一起更新,也可以在分解完成后单独前代。后一种组织方式更适合多个右端项。
2.5 零主元不等于矩阵奇异
不换行的消元可能遇到零主元,即使原矩阵可逆。例如
A=(0111),detA=−1.
第一步主元为零,公式无法继续;交换两行后便可正常消元。因此“消元失败”有时只说明当前行次序不合适。
若当前列从第 k 行向下的候选元素全为零,则换行也找不到非零主元。对方阵的标准消元过程而言,这表示矩阵秩不足,系统不存在唯一解。
3. 列主元消元与置换矩阵
3.1 在当前列中选择主元
列主元策略也称部分选主元。在第 k 步,从尚未处理的行中选择
p∈k≤i≤nargmax∣aik(k)∣,
交换第 k 行与第 p 行,再执行消元。若最大值为零,则矩阵奇异;否则每个本步乘子都满足
∣mik∣≤1.
这一策略避免除以同列中不必要的小数,并控制消元乘子的大小。它的比较成本为 O(n2),不改变分解的 O(n3) 主量级。
行交换可以用置换矩阵表示。把所有交换的累计结果记为 P,保留所有乘子后得到
PA=LU,
其中 L 是单位下三角矩阵,U 是上三角矩阵。求解 Ax=b 时相应地计算
Ly=Pb,Ux=y.
不能在右端漏掉同样的行置换。在原位分解中,如果后续又交换行,先前已经存入 L 的乘子也要按正确的置换关系处理。
3.2 选主元解决什么问题
部分选主元不能把奇异矩阵变成可逆矩阵,也不能改善原问题的条件数。它控制的是计算过程,主要作用是避免因小主元产生巨大乘子和严重的中间误差放大。
为了单独观察这个作用,考虑
Aε=(ε111),bε=(1+ε2).
它的精确解为 (1,1)T。若 ε=10−8,不换行时首个乘子为 1/ε=108;列主元策略则先交换两行,首个乘子变为 ε=10−8。两种算法处理的是同一个系统,区别只在消元前是否换行。
下方实验把两种结果并排放置。输入读入以及每次乘、除、加减后都舍入到所选十进制有效位;这是教学模型,并不等同于浏览器实际的二进制浮点格式。最终残差和解误差使用原始数据与普通双精度重新计算。
“小首主元”预设直接展示巨大乘子造成的信息损失;“零首主元”预设说明不换行失败不等于矩阵奇异;“增长因子”预设则说明部分选主元也不能排除所有中间元素增长。三个预设回答的是不同问题,不应混成一个结论。
选主元之后仍需报告奇异或接近奇异情形。把某个固定绝对阈值机械地用于所有矩阵并不可靠;实际判断通常结合矩阵尺度、工作精度和条件估计。
4. LU 分解与多个右端项
4.1 不换行的 LU 分解
定义(LU 分解)
若
A=LU,
其中 L 为单位下三角矩阵,U 为上三角矩阵,就称之为 A 的 LU 分解。Gauss 消元中的乘子正好构成 L 的严格下三角部分。
定理(无主元 LU 分解的存在与唯一性)
设 A∈Rn×n。存在单位下三角 L 与对角元非零的上三角 U 使 A=LU,当且仅当 A 的所有顺序主子式都非零:
detA1:k,1:k=0,k=1,2,…,n.
在这些条件下,分解是唯一的。只知道 A 可逆并不足以保证不换行的 LU 分解存在;上一节的零首主元矩阵就是反例。
实际求解一般矩阵时通常采用带主元的 PA=LU。若矩阵本身具有能保证无零主元的结构,才可以有依据地省去选主元。
4.2 分解一次,求解多次
若有多个右端项
AX=B,B=(b1,…,bs),
可以先用约 2n3/3 次运算求出 PA=LU,再对每一列依次解
Lyj=Pbj,Uxj=yj.
每增加一个右端项只需两次三角求解,即 O(n2) 成本。若 A 不变而右端项不断变化,应保存分解结果,而不是对每个右端项重新消元。
LU 分解也可用来计算行列式:
detA=det(P)i=1∏nuii.
其中 det(P)=(−1)s,s 是行交换次数。虽然也能通过解 n 个右端项形成 A−1,但求解 Ax=b 时通常没有必要显式计算逆矩阵;直接使用分解更省计算和存储,也避免额外舍入误差。
5. 利用矩阵结构
5.1 对称正定矩阵与 Cholesky 分解
定义(对称正定矩阵)
若 A=AT,并且对任意 x=0 都有
xTAx>0,
则称 A 为对称正定矩阵。
定理(Cholesky 分解)
实矩阵 A 对称正定,当且仅当存在对角元为正的下三角矩阵 L,使
A=LLT.
要求 L 的对角元为正时,分解唯一。元素递推公式为
ljj=(ajj−k=1∑j−1ljk2)1/2,
以及对 i>j,
lij=ljjaij−∑k=1j−1likljk.
精确算术下,每个根号内的量都为正。计算中若出现非正量,可能说明输入不满足正定性,也可能说明矩阵接近正定边界并受到舍入影响;不能继续对负数开实平方根。
Cholesky 分解约需 n3/3 次运算,约为一般 LU 分解的一半,并且只需存储一个三角因子。求解时先前代 Ly=b,再回代 LTx=y。
正定性不能用“所有元素都为正”代替。例如
(1221)
的元素全为正,却有特征值 3 和 −1,因此不是正定矩阵。对称性同样是 Cholesky 定理的必要假设。
5.2 三对角方程组与追赶法
考虑三对角矩阵
A=d1ℓ2u1d2⋱⋱⋱ℓnun−1dn.
追赶法就是专门针对三对角结构的无主元消元。令
d1=d1,b1=b1.
对 i=2,…,n 计算
mi=di−1ℓi,di=di−miui−1,bi=bi−mibi−1.
随后回代
xn=dnbn,xi=dibi−uixi+1,i=n−1,…,1.
算法只需要 O(n) 次运算和 O(n) 存储,但前提是所有修改后的主元 di 都非零。严格行对角占优的三对角矩阵,以及对称正定三对角矩阵,都能给出不发生零主元的充分保证。一般三对角矩阵仍可能需要主元交换;换行还会改变简单的带状结构和存储方式。
结构化算法的优势来自利用已知结构。把三对角矩阵先扩展成稠密矩阵再调用一般消元,会把线性成本变回立方成本,并浪费大量存储。
6. 条件数与数据扰动
6.1 线性系统的条件数
给定一个诱导矩阵范数,对可逆矩阵定义
κ(A)=∥A∥∥A−1∥.
若 A 奇异,约定 κ(A)=∞。常数倍缩放不改变条件数,且
κ(A)≥1,κ(cA)=κ(A)(c=0).
在 2 范数下,
κ2(A)=σmin(A)σmax(A).
最小奇异值接近零意味着矩阵接近奇异,条件数很大。条件数依赖于范数,也是给定扰动模型下的最坏方向放大上界;一次具体扰动不一定达到这个上界。
6.2 只扰动右端项
设
Ax=b,A(x+Δx)=b+Δb.
由 AΔx=Δb 可得
∥x∥∥Δx∥≤κ(A)∥b∥∥Δb∥.
这个上界在最坏扰动方向上可以达到。若 A 的条件数很大,即使算法完全准确,输入中很小的相对扰动仍可能导致明显的解变化;这属于问题本身的敏感性。
6.3 系数矩阵和右端项同时扰动
设
(A+ΔA)(x+Δx)=b+Δb.
记
εA=∥A∥∥ΔA∥,εb=∥b∥∥Δb∥.
若 κ(A)εA<1,则 A+ΔA 仍可逆,并有有限扰动界
∥x∥∥Δx∥≤1−κ(A)εAκ(A)(εA+εb).
分母条件不可省略。当 κ(A)εA 接近 1 时,线性化的一阶近似已经不足以可靠描述解的变化,扰动后的矩阵也可能接近奇异。
6.4 实验:近乎平行的两条直线
考虑
Aε=(1111+ε),bε=(22+ε).
只要 ε=0,原系统的精确解始终是 (1,1)T。现在只给第二个右端分量增加 δ=tε。扰动后精确解为
xδ=(1−t1+t).
因此在 2 范数下,解的相对变化恰为 ∣t∣。固定 t 并减小 ε 时,输入扰动 ∣tε∣ 越来越小,解的变化却保持不变。
图中两条原始直线随着 ε 减小而趋于平行。扰动后的第二条直线与第一条直线交于新解;即使从整幅图上几乎看不出右端项的移动,交点也可能明显改变。
7. 残差、前向误差与后向误差
7.1 残差恒等式
设 x 是一个计算结果,定义残差和前向误差
r=b−Ax,e=x−x.
由于 Ax=b,精确算术下有
Ae=r,e=A−1r.
对同一诱导范数,可以推出双边关系
κ(A)1∥b∥∥r∥≤∥x∥∥e∥≤κ(A)∥b∥∥r∥.
所以小的相对残差只有在条件数不过大时,才能保证小的相对前向误差。实验中的扰动解若拿回原系统检查,其残差正好是 −Δb;原始残差很小,而相对于原始解的误差可能被病态性放大。
7.2 把残差解释为后向误差
同一个计算结果精确满足
Ax=b−r.
因此,只允许右端项改变时,∥r∥/∥b∥ 是一个直接的范数相对后向误差:计算结果是邻近右端项 b−r 所对应的精确解。
若允许 A 与 b 同时逐项扰动,常用的范数后向误差还会按 ∥A∥∥x∥+∥b∥ 缩放。分量后向误差则逐项考虑数据尺度;当矩阵元素相差悬殊或含有结构性零元时,它可能比单一范数指标更有解释力。
计算残差本身也会舍入。若 Ax 与 b 很接近,两者相减可能丢失有效数字;需要高可信残差时,可以用更高精度累加内积,或使用带误差控制的专门实现。
8. 舍入误差与主元增长
8.1 后向稳定性的含义
一个线性求解算法若产生 x,并且可解释为邻近问题
(A+ΔA)x=b+Δb
的精确解,其中相对扰动与单位舍入误差同量级,就称其在相应扰动模型下后向稳定。后向稳定说明算法没有把输入改变很多;最终前向误差还要乘上问题的条件数才能估计。
对采用部分选主元的 Gauss 消元,经典误差分析给出形如
∥A∥∥ΔA∥≲p(n)ρ,u
的界。这里 u 是单位舍入误差,p(n) 是随维数适度增长的因子,ρ 是主元增长因子;符号 ≲ 省略了高阶项和依赖具体范数的常数。
8.2 主元增长因子
把消元过程中出现的所有系数记为 aij(k),定义
ρ=maxi,j∣aij∣maxi,j,k∣aij(k)∣.
增长因子衡量中间元素相对于输入最大元素放大了多少。即使最终结果规模适中,过大的中间量也会使绝对舍入误差增大。
部分选主元保证乘子不超过 1,但不能保证增长因子始终很小。对 n 阶矩阵有最坏情形上界
ρ≤2n−1,
并且存在达到该数量级的矩阵。实际问题中增长通常温和,这也是列主元消元广泛使用的原因;“通常稳定”仍不是对每个输入都无条件成立的定理。
矩阵缩放不良也会影响绝对阈值、溢出风险和误差估计。按行、列平衡尺度有时能改善计算表现,但它不会神奇地消除所有方向上的病态性,条件数必须针对缩放后的变量解释。
9. 迭代改进
9.1 基本步骤
已有分解和初始计算解 x(0) 后,迭代改进重复:
r(k)=b−Ax(k),
利用原来的分解近似求解
Ad(k)=r(k),
再更新
x(k+1)=x(k)+d(k).
不必重新分解 A,所以每轮主要增加一次残差计算和两次三角求解,成本为 O(n2)。
9.2 它能够改进什么
若残差和校正都在精确算术中完成,一步就会得到精确解;浮点实现只能近似这一理想过程。残差使用比因子分解和三角求解更高的精度时,通常更能保留被相消隐藏的信息,这构成混合精度迭代改进的基本思路。
迭代改进不是无条件补救。其收敛和可达到的精度取决于矩阵条件数、因子分解的后向误差、校正求解精度、残差计算精度以及更新时的舍入。若问题严重病态到输入精度已经不能确定解,迭代改进也无法恢复输入中不存在的信息。
停止时应检查校正量和重新计算的残差,并设置迭代上限。残差不再下降或校正量无法改变当前浮点数,说明继续使用同一精度通常没有收益。
10. 方法选择与常见误区
10.1 直接解法对照
| 矩阵类型 | 推荐分解或算法 | 主要分解成本 | 核心条件 |
|---|
| 一般稠密方阵 | 列主元 Gauss 消元,即 PA=LU | 约 2n3/3 | 主元搜索后不存在零主元 |
| 多个右端项、同一一般矩阵 | 保存 PA=LU,重复三角求解 | 分解一次;每个右端项 O(n2) | 与一般 LU 相同 |
| 实对称正定矩阵 | Cholesky 分解 A=LLT | 约 n3/3 | 对称且正定 |
| 满足无零修改主元条件的三对角矩阵 | 追赶法 | O(n) | 各步修改主元非零 |
表中的“直接”表示精确算术下经过有限步骤完成,不表示浮点结果必然精确,也不表示计算时间与维数无关。
10.2 常见误区
- “矩阵可逆,所以无需换行的消元一定成功。” 可逆矩阵仍可能出现零的中间主元;顺序主子式条件比可逆性更强。
- “选主元会改善矩阵条件数。” 行交换只改变计算次序,不改变原线性映射对数据扰动的固有敏感性。
- “残差接近零,所以解一定准确。” 前向误差界还包含条件数;病态系统可以同时具有小残差和明显解误差。
- “对称矩阵都能做 Cholesky 分解。” 还必须正定;不定矩阵需要其他分解策略。
- “三对角矩阵都能安全使用不选主元的追赶法。” 仍需保证修改主元非零,并考虑舍入稳定性。
- “求解线性系统应先算逆矩阵。” 实际计算通常直接分解并做三角求解;显式逆矩阵不是必要中间量。
- “部分选主元保证绝对稳定。” 它通常表现可靠,但误差界仍受主元增长、维数和工作精度影响。
11. 本篇要点
- 诱导矩阵范数把向量误差、矩阵作用和条件数放进同一套语言中;范数选择必须前后一致。
- Gauss 消元把一般系统化为三角系统,列主元策略通过换行控制消元乘子,并形成 PA=LU。
- 分解成本通常高于三角求解,因此多个右端项应复用同一分解;矩阵结构则可能把成本从立方量级降到平方或线性量级。
- Cholesky 分解只适用于对称正定矩阵,追赶法需要无零修改主元等条件。
- 条件数描述问题对数据扰动的敏感性,后向误差描述计算结果对应的邻近问题;小残差只有结合条件数才足以判断解误差。
- 部分选主元的舍入误差与主元增长有关;迭代改进可以复用已有分解,但不能恢复输入精度中已经丢失的信息。
下一篇将研究线性方程组的迭代解法,比较 Jacobi、Gauss–Seidel、SOR 与共轭梯度法,并用谱半径和矩阵范数判断迭代是否收敛。
参考资料
- Richard L. Burden、J. Douglas Faires、Annette M. Burden:《Numerical Analysis》,第 10 版,Cengage Learning,线性方程组的直接解法相关章节。
- Tobin A. Driscoll、Richard J. Braun:《Fundamentals of Numerical Computation》,线性方程组、矩阵范数与条件数相关章节。
- Gene H. Golub、Charles F. Van Loan:《Matrix Computations》,第 4 版,Johns Hopkins University Press,2013 年。
- Nicholas J. Higham:《Accuracy and Stability of Numerical Algorithms》,第 2 版,Society for Industrial and Applied Mathematics,2002 年。
- E. Anderson 等:《LAPACK Users’ Guide》,第 3 版,Society for Industrial and Applied Mathematics,1999 年。