想象你是一家面包房的学徒。师父递给你一只烤好的面包,和一本配方表 A:表里记录着每种原料在每道工序中的使用比例,成品面包的重量和口感指标写成向量 b。你的任务是反推出每种原料的实际用量 x——在数学上,这就是解线性方程组 Ax = b。 听起来很简单,但师父补了一句:“我的秤不太准,面包数据也可能偏了一点点。”这时你会发现,有些配方特别“皮实”,原料多一克少一克,面包照样松软;有些配方却“娇贵”得吓人,水多一滴,成品就从金黄的山丘塌成一张死面饼。这种“娇贵程度”,数学上叫条件数。 更麻烦的是,计算机里的数字也有自己的“秤误差”——浮点舍入。配方本身娇贵,加上计算机的误差,算出来的原料用量可能和真实情况相差十万八千里。这就是数值稳定性问题。本文就用这条“厨房故事”线,带你搞懂:条件数到底如何度量误差放大?怎么识破病态矩阵?又该怎么让计算稳如磐石?

岗位关联

对 AI 从业者来说,条件数与数值稳定性是“数字可靠性”的照妖镜——不理解它,你可能会在不知不觉中信任一堆“看起来合理实则离谱”的计算结果。

目录
  1. 可视化演示
  2. 条件数定义:配方的“娇贵指数”
  3. 几何意义:揉面垫上的椭圆
  4. 病态判定:别被行列式骗了
  5. 误差传播:手抖一下,解会跑多远
  6. 数值稳定性:厨师的三大对策
  7. Hilbert 矩阵:数值分析界的“魔鬼配方”
  8. 最小二乘问题:别用正规方程“自杀”
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示矩阵条件数对误差放大的影响:低条件数矩阵输入扰动小幅度传播,高条件数病态矩阵微扰导致输出剧烈偏移。切换模式查看Hilbert矩阵条件数随阶数增长与正则化改善效果。

本节配有交互动效(进入视口后自动加载,约 3KB)。

误差放大效应 低κ矩阵扰动小幅传播 κ=‖A‖·‖A⁻¹‖ 高κ矩阵微扰导致输出剧烈偏移

条件数定义:配方的“娇贵指数”

面包房的学徒接过配方表 A 和成品数据 b,开始反推原料 x。他首先需要回答一个问题:称量误差经过配方 A 之后会被放大多少?这就要用到一把“厨师尺子”——范数。范数专门丈量向量或矩阵的“总规模”,就像你用最长的毛刺来判断一块木板是否平整。

矩阵 A 的范数 ‖A‖ 回答的是“输入一个单位误差,输出最多被放大多少倍”;逆矩阵 A⁻¹ 对应反向操作——从成品反推原料时,误差又会被放大多少倍。两者相乘,就是这个配方的“总娇贵指数”,也就是条件数。它刻画了线性方程组 Ax = b 对输入数据微小扰动的敏感程度。

回到厨房:条件数等于 1 的配方最理想,相当于一个均匀模具,面团怎么压都保持比例;条件数 100 的配方已经有点“小脾气”,而条件数 10⁶ 的配方就是传说中的“手一抖就翻车”。理解了这个指标,下一步要看它在揉面垫上长什么样。

κ(A)=∥A∥⋅∥A−1∥\displaystyle \kappa(A) = \|A\| \cdot \|A^{-1}\|
条件数 = 矩阵范数 × 逆矩阵范数。它永远不小于 1,越小越“皮实”,越大越“娇贵”。
  1. κ(kappa)希腊字母,条件数的通用记号,读作“卡帕”。
    κ\kappa
  2. 矩阵 A配方矩阵,描述原料向量 x 到成品向量 b 的线性映射关系。
    AA
  3. 矩阵范数 ‖A‖衡量 A 作为“变换器”时,输入单位误差后输出误差的最大放大倍数。
    ∥A∥\|A\|
  4. 逆矩阵 A⁻¹从成品反推原料的逆向操作,对应“反推配方”的过程。
    A−1A^{-1}
  5. 逆矩阵范数 ‖A⁻¹‖反推过程中,成品数据误差被再次放大的最大倍数。
    ∥A−1∥\|A^{-1}\|
  6. 乘积正向放大与反向放大相乘,就是误差“一去一回”的总放大倍数,即条件数。
    ∥A∥⋅∥A−1∥\|A\| \cdot \|A^{-1}\|

几何意义:揉面垫上的椭圆

把配方表 A 想象成揉面垫上的两只手:左手捏住面团左边,右手捏住右边,朝相反方向拉。原本圆形的小面团被拉成了椭圆。拉得越狠、椭圆越扁,你就越难判断面团原本的圆心在哪里——这恰恰对应了“娇贵配方”的本质:误差方向一多,解就开始“漂移”。

在数学上,椭圆的半长轴长度由最大奇异值 σ_max 决定,半短轴由最小奇异值 σ_min 决定。圆面团经过 A 的映射,就变成以这两个奇异值为半轴的椭圆。而 2-范数条件数,恰好等于长轴与短轴的比值:

下次在结果里看到“条件数 10⁸”,你可以想象一个比面条还细的椭圆:任何一点微小的方向偏差,都会被拉成长轴上的一次大迁徙。几何直觉告诉我们,病态的本质不是“某个方向缩得太小”,而是“方向之间差异太大”。

κ2(A)=σmax⁡σmin⁡\displaystyle \kappa_2(A) = \frac{\sigma_{\max}}{\sigma_{\min}}
2-范数条件数 = 椭圆长轴 ÷ 短轴。比值越接近 1,椭圆越接近圆,问题越良态。
  1. κ₂下标 2 表示使用 2-范数(欧几里得范数)定义的条件数,工程中最常用。
    κ2(A)\kappa_2(A)
  2. 最大奇异值 σ_max矩阵 A 的最大奇异值,对应椭圆最长半轴,决定面团被拉得最长的方向。
    σmax⁡\sigma_{\max}
  3. 最小奇异值 σ_min矩阵 A 的最小奇异值,对应椭圆最短半轴,决定面团被压缩得最狠的方向。
    σmin⁡\sigma_{\min}
  4. 比值长轴除以短轴,数值越大说明两个方向的伸缩差异越悬殊。
    σmax⁡σmin⁡\frac{\sigma_{\max}}{\sigma_{\min}}

病态判定:别被行列式骗了

判断面团是不是“魔鬼配方”,很多新手会先摸行列式——“行列式接近 0 是不是就病态?”这就像凭面团重量判断它好不好揉:一公斤的死面疙瘩和一公斤的松软面团,重量完全相同,手感天差地别。

行列式 det(A) 度量的是“体积缩放”,条件数度量的却是“方向拉伸差异”。行列式小不代表方向差异大,行列式大也不代表方向差异小。例如对角阵 diag(0.1, 0.1),行列式只有 0.01,但条件数等于 1,完全良态;而对角阵 diag(10⁸, 10⁻⁸),行列式为 1,条件数却高达 10¹⁶,是极度病态。

对于正规矩阵,可以用特征值快速估量:特征值是配方沿各“本征方向”的伸缩倍率,最大与最小特征值模之比可以当作条件数的参考:

真正稳妥的判定方式是计算奇异值比值,或者直接做“扰动实验”:在配方数据上轻轻戳一下,加一个 10⁻⁸ 的微小改动,看反推出来的原料量是否失控。像后面要登场的 Hilbert 矩阵,扰动实验一秒钟就会现出原形。

κ2(A)=max⁡i∣λi∣min⁡i∣λi∣\displaystyle \kappa_2(A) = \frac{\max_i |\lambda_i|}{\min_i |\lambda_i|}
对正规矩阵,2-范数条件数 = 特征值模之比;对一般矩阵,特征值可能给出错误信号,还是要看奇异值。
  1. 特征值 λ_i矩阵 A 的第 i 个特征值,表示某个本征方向上的伸缩倍率。
    λi\lambda_i
  2. max|λ_i|所有特征值模长中最大的那个,对应最剧烈的伸缩方向。
    max⁡i∣λi∣\max_i |\lambda_i|
  3. min|λ_i|模长最小的特征值,对应伸缩最缓和的方向。
    min⁡i∣λi∣\min_i |\lambda_i|
  4. 比值最大与最小伸缩率之比,比值越大,方向差异越悬殊。
    max⁡i∣λi∣min⁡i∣λi∣\frac{\max_i |\lambda_i|}{\min_i |\lambda_i|}

误差传播:手抖一下,解会跑多远

师父称面粉时手抖了,成品数据 b 出现了相对误差。你反推出来的配方 x 会偏多远?这正是条件数真正重要的地方——它不是一个抽象课本指标,而是误差传播的“放大镜倍数”。

经典扰动分析给出一个漂亮的不等式:解的相对误差不超过输入相对误差乘以条件数。这是一个“上界”,描述最坏情况下误差被放大多少:

读这个不等式有两个实用结论。第一,想让解更准,优先降低输入误差;第二,如果条件数高得吓人,拼命提高输入精度也杯水车薪——10⁻¹⁶ 的机器精度乘以 10¹³ 的条件数,依然是 10⁻³ 的误差,在需要 10⁻⁶ 精度的场景下照样翻车。配方娇贵程度和木匠手艺是两码事:师父的手再稳,也架不住面团一碰就散。

∥δx∥∥x∥≤κ(A)⋅∥δb∥∥b∥\displaystyle \frac{\|\delta x\|}{\|x\|} \le \kappa(A) \cdot \frac{\|\delta b\|}{\|b\|}
右端的输入误差每大一点、条件数每大一点,左端解的误差都可能被同步放大。
  1. 误差向量 δx解的误差向量,即计算出的原料用量与真实值之差。
    δx\delta x
  2. 扰动向量 δb成品数据的误差向量,即师父称料的偏差。
    δb\delta b
  3. 解的相对误差 ‖δx‖/‖x‖衡量反推配方结果相对于真实配方的离谱程度。
    ∥δx∥∥x∥\frac{\|\delta x\|}{\|x\|}
  4. 条件数 κ(A)放大系数,决定误差被放大的倍数。
    κ(A)\kappa(A)
  5. 输入的相对误差 ‖δb‖/‖b‖衡量原始成品数据本身的靠谱程度。
    ∥δb∥∥b∥\frac{\|\delta b\|}{\|b\|}

数值稳定性:厨师的三大对策

前厅的面包师傅们总结出三大对策。第一个是“按大头算”——主元选取。高斯消元时每一步都挑绝对值最大的元素当主元,避免拿一个接近 0 的小数当分母,把舍入误差瞬间放大。这就像揉面时先处理最强势的那块面团,而不是从边角料下手。

第二个对策是“统一量纲”——预处理。有些配方面粉按吨记、酵母按毫克记,数值跨度巨大。先对矩阵做行与列的缩放平衡,让各方向数值处于同一量级,条件数往往立刻下降几个数量级。第三个对策是“撒安定剂”——正则化,给求解过程加一条约束,明确禁止解出现疯狂的极端值。最常用的是 Tikhonov 正则化(机器学习里叫岭回归):

注意,正则化是用一点点系统性偏差换取对剧烈震荡的免疫,并不是“越大越好”。这三大对策就像厨师的三样法宝:挑大块、称好量、撒安定剂。但真正病到骨子里的矩阵,比如接下来这位“魔鬼配方”,还得特别警惕。

x^=arg⁡min⁡x(∥Ax−b∥22+λ∥x∥22)\displaystyle \hat{x} = \arg\min_x \left( \|Ax - b\|_2^2 + \lambda \|x\|_2^2 \right)
在拟合误差平方和之外,加上 λ × 解平方和的惩罚项,λ 控制“拟合优先”还是“稳定优先”。
  1. 拟合误差项 ‖Ax - b‖₂²衡量当前配方还原成品的好坏,越小越贴合数据。
    ∥Ax−b∥22\|Ax - b\|_2^2
  2. 正则化系数 λ安定剂用量,λ > 0,控制惩罚的强弱。
    λ\lambda
  3. 解的总规模惩罚 ‖x‖₂²解向量各分量的平方和,直接惩罚“过大的原料用量”。
    ∥x∥22\|x\|_2^2
  4. argmin在所有可能的 x 中,寻找使整体目标最小的那一个。
    arg⁡min⁡x\arg\min_x
  5. 整体权衡拟合误差加惩罚项,λ 大则解更平稳但略有偏差,λ 小则拟合优先。
    min⁡x(∥Ax−b∥22+λ∥x∥22)\min_x \left( \|Ax - b\|_2^2 + \lambda \|x\|_2^2 \right)

Hilbert 矩阵:数值分析界的“魔鬼配方”

在数值分析的传说里,有一味“看起来人畜无害,用起来当场翻车”的矩阵:Hilbert 矩阵。它的元素很简单——第 i 行第 j 列的值是 1/(i+j-1),就像一张越往右下数字越小、相当有规律的表格。

但规律的表象下藏着无法无天的病态。Hilbert 矩阵的条件数随阶数 n 呈指数级增长(约 e^{3.5n})。n=5 时约 4.8×10⁵,n=10 时已经逼近 1.6×10¹³——这大约等于双精度浮点机器精度的倒数:

做个数值实验感受一下:令 x 是全 1 向量,算出 b = Hx,再给 b 加上 10⁻⁸ 的微小扰动重新求解。n=3 时解还算正常,n=8 时解开始离谱,n=10 时解的有效数字完全丢失,输出一个“面目全非”的向量。Hilbert 矩阵并非数学游戏——它在最小二乘多项式拟合、积分方程离散化中会自然现身。当你的数据矩阵有“递减的平滑结构”时,别急着欢呼,先算一下条件数。

Hij=1i+j−1\displaystyle H_{ij} = \frac{1}{i + j - 1}
Hilbert 矩阵的定义:元素随行号和列号之和的倒数递减。阶数稍大就极度病态。
  1. 元素 H_ijHilbert 矩阵第 i 行、第 j 列的元素。
    HijH_{ij}
  2. 分母 i + j - 1分母随行号与列号之和增大而增大。
    i+j−1i + j - 1
  3. 取值规则元素值等于分母倒数,越靠右下越小,看似光滑无害。
    1i+j−1\frac{1}{i + j - 1}

最小二乘问题:别用正规方程“自杀”

终于回到工作台。你面前不是一份精确的配方表,而是一大堆带噪声的实验记录 (A, b),方程 Ax = b 根本无解。你只求“最不坏”的原料搭配,让误差平方和最小——这就是最小二乘问题。

教科书推导训练你写出正规方程:对 A^T A 求解。它在数学上等价于最小二乘解,但数值上是“自杀式”操作——它会把条件数平方化。原本条件数 10⁵ 的矩阵,一平方变成 10¹⁰,误差放大能力直接翻倍:

更稳的路线是 QR 分解与奇异值分解。QR 分解通过正交变换保持条件数不放大;SVD 更进一步,可以根据奇异值大小直接削掉那些极小的方向,相当于自动正则化。这就是为什么 numpy 的 lstsq、scipy 以及 sklearn 的线性回归底层都绕开了正规方程。数学上等价的公式,数值上可能天差地别——配方再漂亮,也得看它在真实称量误差面前撑不撑得住。

ATAx=ATb\displaystyle A^T A x = A^T b
正规方程是最小二乘的数学投影结果,但直接求解会显著劣化条件数。
  1. 转置 A^T把配方表的行列互换,数学上是“翻转视角”。
    ATA^T
  2. Gram 矩阵 A^T A转置乘以原矩阵,它的条件数等于 κ(A)²。
    ATAA^T A
  3. 右端 A^T b把成品数据投影到 A 的列空间中。
    ATbA^T b
  4. 求解表达式正规方程的解在数学上确实是最小二乘解,但数值稳定性更差。
    x=(ATA)−1ATbx = (A^T A)^{-1} A^T b

AI 应用场景

机器学习中的岭回归(Ridge Regression)

阶段:模型训练

解决的问题:特征高度共线时,设计矩阵条件数极大,普通最小二乘解方差爆炸。传统做法是手动删特征,容易丢失信息;正则化(即 Tikhonov 正则化)给损失函数加 L2 惩罚,压低系数范数,解既稳定又保留全部特征。

具体案例:某房产数据集有面积、卧室数、装修评分等 12 个特征,其中三个特征相关性超过 0.98,设计矩阵条件数约 10⁷。直接用正规方程训练线性回归,测试集 R² 为负;换成 sklearn 的 RidgeCV 自动选 λ 后,方差被抑制,R² 回升到 0.72。

视觉定位中的单应矩阵估计

阶段:特征匹配与几何变换求解

解决的问题:直接线性变换求解单应矩阵 H 时,需解线性方程组 Ah = 0。当特征点共线或集中在狭窄区域时,A 病态,几像素的坐标抖动会造成单应矩阵大幅漂移。对坐标做零均值、单位方差归一化,可显著降低条件数。

具体案例:无人机视觉定位中,地面地标点几乎排成一条直线,cond(A) ≈ 10⁹,位姿估计漂移严重。工程师先对 2D 特征点做归一化预处理,再调用 cv2.findHomography 求解,条件数降至 10³,重投影误差从 12 像素降到 0.8 像素。

有限元仿真中的预条件共轭梯度

阶段:数值求解器优化

解决的问题:大尺度有限元刚度矩阵条件数随网格细化快速增长,共轭梯度法收敛极慢。用 Jacobi 或不完全 Cholesky 预处理(相当于“统一原料量纲”),有效条件数大幅下降。

具体案例:汽车碰撞仿真中,100 万自由度刚度阵条件数约 10⁹,无预处理迭代 3000 次不满足容差;施加对角缩放预处理后,条件数降至 10⁵,迭代 380 次收敛,总耗时减少近 8 倍。

Python 演示

python50 行
import numpy as np def hilbert_matrix(n):    return np.array([[1.0 / (i + j - 1) for j in range(1, n + 1)]                     for i in range(1, n + 1)]) def cond_report(A, name):    kappa = np.linalg.cond(A)    print(f"{name} 条件数 = {kappa:.3e}")    return kappa def noise_solve(A, b, eps=1e-8):    rng = np.random.default_rng(1)    b_noisy = b + rng.normal(0, eps, size=b.shape)    x0 = np.linalg.solve(A, b)    x1 = np.linalg.solve(A, b_noisy)    return np.linalg.norm(x1 - x0) / (np.linalg.norm(x0) + 1e-300) def lstsq_methods(A, b):    ata = A.T @ A    atb = A.T @ b    try:        x_normal = np.linalg.solve(ata, atb)    except np.linalg.LinAlgError:        x_normal = np.full(A.shape[1], np.nan)    x_lstsq, _, _, _ = np.linalg.lstsq(A, b, rcond=None)    return x_normal, x_lstsq def main():    print("=== Hilbert 矩阵病态演示 ===")    for n in (3, 5, 8, 10):        H = hilbert_matrix(n)        kappa = cond_report(H, f"Hilbert({n})")        x_true = np.ones(n)        b = H @ x_true        rel = noise_solve(H, b)        print(f"    b 加 1e-8 扰动 -> 解相对误差 {rel:.3e}")     print("\n=== 最小二乘: 正规方程 vs lstsq(SVD) ===")    A = np.array([[1.0, 1.0],                  [1.0, 1.0000001],                  [1.0, 1.0000002]])    b = np.array([1.0, 2.0, 3.0])    cond_report(A, "观测矩阵 A")    x_normal, x_lstsq = lstsq_methods(A, b)    print("正规方程解:", x_normal)    print("lstsq 解  :", x_lstsq) if __name__ == "__main__":    main()
目的:用 Hilbert 矩阵演示条件数爆炸,并对比“正规方程”与“SVD 分解”两种最小二乘求解方式的数值稳定性。
  1. return np.array([[1.0 / (i + j - 1) ...]])按公式逐格生成 Hilbert 矩阵,分母随行列号递增。
  2. kappa = np.linalg.cond(A)用 numpy 内置 SVD 计算 2-范数条件数,一行拿到“娇贵指数”。
  3. b_noisy = b + rng.normal(0, eps, size=b.shape)给右端向量加高斯噪声,模拟“师父手抖”。
  4. x1 = np.linalg.solve(A, b_noisy)用扰动后的 b 重新求解,对比解的变化幅度。
  5. ata = A.T @ A构造正规方程中的 Gram 矩阵,这一步已经悄悄把条件数平方。
  6. x_normal = np.linalg.solve(ata, atb)直接解正规方程,结果可能离谱到报错。
  7. x_lstsq, _, _, _ = np.linalg.lstsq(A, b, rcond=None)走 SVD 路线的最小二乘求解器,数值稳定。
  8. if __name__ == "__main__":提供可执行入口,代码既可被 import 也可直接运行。

常见误区

误区矩阵的行列式接近 0 就一定是病态矩阵。所以我只需要检查 det(A) 是否很小,就能判断方程靠不靠谱。

正解行列式度量的是矩阵整体的体积缩放,条件数度量的却是各方向伸缩的差异。对角阵 diag(0.1, 0.1) 行列式只有 0.01,但条件数等于 1,非常良态;对角阵 diag(10⁸, 10⁻⁸) 行列式为 1,条件数却高达 10¹⁶。判断病态要看奇异值之比或直接做扰动实验,而不是看行列式。

为何常见:线性代数课本常以行列式为零定义奇异,新手容易把“近乎奇异”和“病态”画等号,忽略了两者本质不同。

误区数值不稳定是因为浮点精度不够,那我换 float128、甚至任意精度库,问题不就解决了吗?

正解提高精度只能降低舍入噪声,但条件数放大的是问题本身的数学敏感性。病态矩阵即便用无限精度手算,b 上的原始测量误差依然会被放大 κ 倍。正确思路是降低条件数——预处理、正则化、改用稳定算法。高精度计算只能把“称量误差”变小,却治不了配方的“娇贵病”。

为何常见:初学编程时总被告知浮点有舍入误差,于是一旦结果不对就怀疑精度,而忽略了误差真正的放大器可能是算法或问题本身。

误区最小二乘问题最自然的方法是推导出正规方程 A^T A x = A^T b,然后直接用 numpy.linalg.solve 求解,公式都写在书本上了。

正解正规方程把条件数从 κ(A) 变成 κ(A)²。当 A 本身条件数已经很大时,平方后误差被放大到难以接受。更稳的是 QR 分解和 SVD,条件数基本保持 κ(A),SVD 还能截断小奇异值实现隐式正则化。numpy 的 lstsq 底层正是 SVD 路线。公式等价不代表数值等价。

为何常见:教科书从正规方程引入最小二乘,推导最简洁,学生们便把它当作默认实现,忽略了数值上更优的替代方案。

误区既然病态矩阵会导致解的剧烈震荡,那把 λ 设得特别大,加很多正则化,解就一定又稳又准。

正解λ 过大会把解强行拉向零,引入系统性偏差,就像面包加了太多安定剂反而没了味道。正则化本质是用小偏差换大方差降低。实际中 λ 要由交叉验证或 L 曲线法选择,目标是偏差与方差的平衡点。

为何常见:新人看到正则化能压制震荡,容易把它当成“越大越安全”的补丁,忽略了它在拟合精度上的代价。

面试题

Q1. 条件数 κ(A) 的定义是什么?

单选题 · easy

  • A.矩阵的非零特征值个数
  • B.矩阵行列式的绝对值
  • C.范数乘逆矩阵范数的积← 正确答案
  • D.最大的那个奇异值

答案:C。条件数是“输入误差被放大的最大倍数”,定义为 ‖A‖·‖A⁻¹‖。选项 A 描述的是秩,B 是行列式(与病态无必然联系),D 只是最大奇异值,没有考虑最小奇异值。条件数永远不小于 1。

Q2. 下列哪个矩阵的条件数最小?

单选题 · easy

  • A.单位矩阵 [[1,0],[0,1]]← 正确答案
  • B.对角阵 diag(10, 0.1)
  • C.Hilbert 二阶矩阵
  • D.对角阵 diag(1, 10)

答案:A。单位矩阵的所有奇异值都等于 1,条件数 = 1,是“最皮实”的矩阵。选项 B 条件数约为 100,C 二阶 Hilbert 条件数约为 19.28,D 条件数为 10。条件数最小值为 1,任何矩阵都无法低于它。

Q3. 当右端向量 b 的相对误差为 ε 时,解 x 的相对误差上界最接近哪个?

单选题 · mid

  • A.恰好等于输入误差 ε
  • B.约为 κ(A)·ε← 正确答案
  • C.等于 ε/κ(A)
  • D.与输入误差没有关系

答案:B。扰动分析不等式给出 ‖δx‖/‖x‖ ≤ κ(A)·‖δb‖/‖b‖。条件数就是误差放大倍数。A 忽略了放大过程,C 把放大和缩小搞反了,D 显然错误。注意这是“上界”,实际误差可能更小。

Q4. 关于“行列式接近 0”与病态矩阵的关系,正确的是?

单选题 · mid

  • A.det 接近 0 必病态
  • B.det 很大必良态
  • C.要结合条件数判断← 正确答案
  • D.det=0 就一定良态

答案:C。det 反映整体缩放比例,条件数反映方向间差异。对角阵 diag(0.1, 0.1) det 很小但条件数 = 1;diag(10⁸, 10⁻⁸) det = 1 但条件数高达 10¹⁶。唯一例外是 det = 0 时矩阵奇异,问题无唯一解,因此“结合条件数判断”最准确。

Q5. 单位圆在矩阵 A 的映射下变成椭圆,下列哪些说法正确?

多选题 · mid

  • A.椭圆长轴长度为 σ_max← 正确答案
  • B.椭圆短轴长度为 σ_min← 正确答案
  • C.椭圆越扁条件数越大← 正确答案
  • D.椭圆面积恒等于 π

答案:ABC。单位圆在 A 下变椭圆,两个半轴长正好是奇异值 σ_max 和 σ_min,长短轴之比就是条件数,所以 A、B、C 都对。椭圆面积 = πσ_maxσ_min = π|det(A)|,只有 A 是正交矩阵时才等于 π,D 错在“恒等”。

Q6. 已知 2×2 矩阵 A 的特征值为 λ₁=100,λ₂=0.01,判断其病态程度最稳妥的说法是?

单选题 · mid

  • A.良态,特征值都非零
  • B.病态,条件数约 10⁴
  • C.特征值不能直接判定← 正确答案
  • D.良态,行列式为 1

答案:C。特征值模之比只对正规矩阵成立。题干没有说明 A 是否正规,非正规矩阵的特征值可能“撒谎”,所以最严谨的说法是“不能直接判定”。要下结论得算奇异值或做扰动实验。

Q7. 下列哪些做法有助于改善数值稳定性?

多选题 · mid

  • A.高斯消元时选取列主元← 正确答案
  • B.矩阵做对角缩放预处理← 正确答案
  • C.加入 Tikhonov 正则化← 正确答案
  • D.改用 float16 浮点类型

答案:ABC。列主元避免除以小量的舍入爆炸;对角缩放统一量纲降低条件数;Tikhonov 正则化抑制剧烈震荡。float16 精度比 float64 更差,舍入噪声更大,会加剧数值不稳定,D 错误。

Q8. Hilbert 矩阵的条件数随阶数 n 大致如何变化?

单选题 · hard

  • A.与阶数线性增长
  • B.随阶数指数增长← 正确答案
  • C.条件数保持常数
  • D.随阶数对数增长

答案:B。Hilbert 矩阵条件数约为 e^{3.5n},呈指数级增长。n=5 时约 4.8×10⁵,n=10 时约 1.6×10¹³。它是数值分析课上最经典的病态反例,线性或对数增长的说法都远远低估了它的威力。

Q9. 关于最小二乘问题的求解,说法正确的是?

多选题 · hard

  • A.正规方程会把条件数平方← 正确答案
  • B.QR 分解通常更稳定← 正确答案
  • C.SVD 可截断小奇异值← 正确答案
  • D.高精度下无任何问题

答案:ABC。正规方程构造 Gram 矩阵,条件数从 κ(A) 变为 κ(A)²;QR 分解通过正交变换保持条件数不放大;SVD 截断小奇异值相当于隐式正则化。D 错,因为高精度只能降低舍入噪声,无法治愈病态矩阵本身的放大效应。

Q10. 条件数 κ(A)=1 意味着什么?

单选题 · easy

  • A.说明 A 一定是零矩阵
  • B.说明所有奇异值相等← 正确答案
  • C.说明 A 是单位矩阵
  • D.说明方程一定无解

答案:B。κ₂(A)=σ_max/σ_min=1 推出所有奇异值相等。这类矩阵包括正交矩阵、等距缩放矩阵等多种情况,不一定是单位阵。零矩阵不可逆,条件数无定义;条件数 = 1 是“最良态”的标志,与无解无关。