1. 课程导入与问题驱动
在数值线性代数中,求解线性方程组 Ax = b 是最基础也最常见的任务。很多同学初学时会有一种直觉:只要矩阵 A 可逆,用高斯消元或 LU 分解求出 x 就万事大吉。然而在实际计算中,即使算法完全正确、程序毫无 bug,得到的解也可能与真实解相差甚远。造成这种偏差的根源,往往不是算法本身,而是问题本身的“敏感性”——这正是条件数要刻画的对象。
先看一个具体的例子。考虑如下 2×2 线性系统(示例数据,用于说明现象):
A = [ 1.000 1.000 ]
[ 1.000 1.001 ]
b = [ 2.000 ]
[ 2.001 ]
它的精确解是 x = [1, 1]ᵀ。现在假设右端项 b 因为测量误差或浮点舍入,第二个分量从 2.001 变成 2.002,即扰动 Δb = [0, 0.001]ᵀ。重新求解可得 x ≈ [0, 2]ᵀ。也就是说,b 的相对变化约为 0.05%,而解 x 的相对变化却高达 50% 左右。这种“输入微小扰动引起输出剧烈变化”的现象,就是病态(ill-conditioned)问题的典型表现。
为什么会这样?观察矩阵 A 的两行:它们几乎相同,只差 0.001。这意味着 A 接近奇异,两个方程提供的信息高度冗余。几何上,两个方程对应平面上两条几乎平行的直线,它们的交点对直线位置的微小移动极其敏感。条件数正是把这种“接近奇异”的程度量化的工具:它衡量的是解对输入扰动的最大放大倍数。
上图左侧把“接近奇异”翻译成几何语言:两条直线几乎平行,交点对任何一条线的微小平移都高度敏感;右侧则给出条件数的核心作用——它是输入相对误差到解相对误差的放大系数。理解这张图,就抓住了本课程的主线。
条件数到底刻画什么
对可逆矩阵 A,条件数定义为 κ(A) = ‖A‖ · ‖A⁻¹‖(常用 2-范数)。它有三个值得记住的性质:其一,κ(A) ≥ 1,等号在正交矩阵(含单位矩阵)处取得,这类问题最“稳”;其二,κ(A) 与所选范数有关,但不同范数下的条件数只差一个与维数相关的常数因子,量级判断一致;其三,条件数是问题本身的属性,与用什么算法求解无关。算法只能决定“算得准不准”,而条件数决定“问题允不允许算得准”。
这一点对工程实践至关重要。若 κ(A) ≈ 10³,双精度约 16 位有效数字,求解后大约还剩 13 位可信;若 κ(A) ≈ 10¹²,则只剩 4 位左右可信;若 κ(A) 接近 10¹⁶,结果可能连一位有效数字都保不住。因此,在动手求解之前先估计条件数,是判断“这个结果能不能信”的第一道关口。
本课程要解决的问题与学习路径
围绕条件数,本课程将回答四个层层递进的问题:是什么——条件数的定义、几何与代数含义;怎么算——如何估计或计算条件数,包括 1-范数、∞-范数、2-范数(奇异值)以及实用的条件数估计器;怎么用——在求解 Ax=b 时如何结合 LU 分解、迭代精化、预处理等手段提升数值稳定性;怎么判——面对一个具体结果,如何依据条件数、残差与后向误差判断解的可信度。
学习路径上,建议按“现象 → 定义 → 度量 → 算法 → 实践 → 复盘”的顺序推进:先用病态实例建立直觉,再严格定义条件数并推导误差上界,接着掌握不同范数下的计算与估计方法,然后进入稳定求解技术(如部分主元、迭代精化、预处理共轭梯度),最后通过案例把“估计条件数—选择算法—验证残差”串成完整工作流。每一章都会配以可复现的示例参数与判断依据,帮助你把概念落到操作上。