线性方程组与秩:有没有解,解有几个
WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
上一章把矩阵看成「捏空间」。这一章问更硬的一句:给定
和 ,方程 有没有解? 几何上是「直线 / 平面交不交」;代数上是「 能不能写成 的各列的线性组合」。学完应能读懂最小二乘为何要写成 ,以及「秩亏」为什么让训练炸掉。前置:线性代数直觉。
一、 三种结局
把两元方程看成平面上的直线
| 几何 | 代数 | 秩 |
|---|---|---|
| 两线交于一点 | 唯一解 | |
| 两线平行 | 无解 | |
| 两线重合 | 无穷多解 |

图解说明:左是唯一交点;中是平行无交;右把故事抬到三维(三张平面)。底栏那句话是列空间语言:列的线性组合能不能拼出
。
列空间
保姆级数字例(与 demo.py 三组直线相同)。 未知数
- 唯一解。
与 。两线斜率 $ -1$ 与 ,交于 。矩阵 - 无解。
与 。平行,永远差 。 ,但增广矩阵第二行变成 ,秩变成 。 - 无穷多解。
与 。第二行是第一行的两倍,同一条直线。 ,自由未知数一个:令 ,则 。
卡点。 「方程个数 = 未知数个数」既不保证有解,也不保证唯一。三张平行平面是三个方程两个……不对,三维里三张平面仍可能无交。真正起决定作用的是秩,不是「几个式子」。另一个卡点:浮点里几乎看不到「精确平行」,两条几乎平行的线会交出一个很远、对扰动极敏感的点——这就是病态。
逐步推导:三组直线怎样从秩读出唯一解 / 无解 / 无穷解(点击展开)
把直线
唯一。 两行
平行。
重合。
一般判据(Rouché–Capelli):

图解说明:左交于橙点
;中平行;右两条线画成一条(虚线叠在实线上)。
二、高斯消元在干什么
把第
三维教科书例子(demo 与 gauss.hpp 同一组):
demo.py 的 gauss_solve 与 gauss.hpp 写的是同一套循环。对照 numpy.linalg.solve 只为验算,不是再学一个黑盒。
最小二乘是「
卡点。 主元接近
逐步推导: 消元走到 ,以及正规方程从哪来(点击展开)
增广矩阵:
第一列主元
第二列选
回代:
相关矩阵掉一档。 demo 第二张
第二行 numerical_rank 数大于阈值的奇异值个数:浮点里「精确相关」几乎不出现,要用阈值。练习就是在数这个个数。
最小二乘。 若
令梯度为
三、秩、自由未知数、病态
- 满秩方阵:可逆,唯一解。
- 行线性相关(例如第二行是第一行的两倍):
,要么无解要么自由变量。 - 数值秩:奇异值大于阈值的个数。浮点里「精确相关」几乎不出现,要用阈值。练习就是在数这个个数。
- 条件数大:解对
的扰动过敏。上一章提过名字,这里会在消元里碰到「主元特别小」。
自由未知数个数
四、代码在做什么
Python 画三组直线,并对手写 gauss.hpp 印同一组解

编译:
cd docs/math/systems/code
python demo.py
g++ -std=c++17 demo.cpp -o systems_demoWindows 直接跑 systems_demo.exe。不要链 Eigen。
五、小结
| 概念 | 一句话 |
|---|---|
| 秩 | 独立列(或行)的个数 |
| 高斯消元 | 用主元清列,读出解或秩 |
| 增广矩阵 | 多看 |
| 正规方程 | |
| 下游 | 最小二乘、可观测性、特征值 |
下一章 特征值与二次型:不解
,改为找「只被拉伸的方向」。
📥 Code
| File | View | Download |
|---|---|---|
| demo.py | Open | Download |
| gauss.hpp | — | Download |
| demo.cpp | — | Download |
| exercise.py | Open | Download |
参考
- Strang, G. Introduction to Linear Algebra(列空间与消元)
- Trefethen & Bau, Numerical Linear Algebra(主元与条件数)