1.3 线性方程组与秩
前两节我们建立了向量—变换的语言体系:向量描述空间中的对象,矩阵描述空间之间的映射。本节把这套语言应用到线性代数古老而实用的问题上——解方程组。线性方程组是数学本身的核心对象,也是几乎所有工程问题的最终落脚点:最小二乘拟合、有限元分析、PageRank 排名、神经网络反向传播,都在求解某个形式的
1.3.1 从方程到矩阵:建模与几何直觉
线性方程组的标准代数形式
一个含有
其中
矩阵表示法:A x = b
把上述方程组的系数提取为矩阵
其中
行图像:每个方程是一个超平面
行图像(Row Picture)从方程的视角看问题。每一个方程
以二维两个方程为例,两条直线的位置关系有三种:相交于一点(唯一解)、平行不相交(无解)、完全重合(无穷多解)。这三种几何情形分别对应代数上解的三种状态。行图像的直觉是:方程越多,约束越强,解空间越小。
列图像:寻找列向量的线性组合
列图像(Column Picture)从矩阵的视角看问题。把
也就是说,求解
列图像是后续理解列空间、秩、相容性的基础。它揭示了方程组有解的本质:
行视角 vs 列视角
行图像关注约束的交点,列图像关注向量的组合。这两种视角是互补的——行视角回答解在哪里,列视角回答解为什么存在或不存在。理解这两种视角的切换,是从算术解方程进入代数理解变换的关键一步。
齐次与非齐次的几何对比
当
当
几何交点的三种可能性
无论行视角还是列视角,方程组解的存在情况都有三种:
- 唯一解:所有超平面交于一点(行视角);
可由 的列向量唯一地线性表示(列视角)。 - 无解:超平面没有公共交点,如两条平行直线(行视角);
不在 的列空间中(列视角)。 - 无穷多解:超平面交于一条直线、一个平面或更高维子集(行视角);
在 的列空间中,但列向量线性相关,表示方式不唯一(列视角)。
这三种情况将在 1.3.3 节用秩这一统一概念严格刻画。
增广矩阵
把常数向量
增广矩阵的几何意义在于:把右侧向量也纳入消元过程的考察范围。比较
交互演示:行图像 vs 列图像
下面的演示用两种等价视角展示同一个 2×2 方程组
- 行图像:每个方程
是平面上的一条直线,两条直线的交点就是方程组的解(红色与蓝色直线相交于绿色交点) - 列图像:矩阵
的两个列向量 、 用箭头绘制,目标向量 $\mathbf{b} = (c_1, c_2) 用紫色加粗箭头标记。拖动 滑块调节线性组合 (绿色箭头),当其末端落在 上时, 就是方程组的解 - 双栏对比:左右并排同时显示行图像与列图像,直观看到两种视角的等价性
建议实验:
- 拖动
滑块,观察行图像中直线平移、列图像中目标向量 移动 - 把
调成 (如 ),观察 时直线平行、列向量共线——方程组失去唯一解
1.3.2 高斯消元法:核心求解算法
消元法的几何本质
高斯消元法的几何本质是:通过初等行变换把超平面摆正,使交点显式显示。每一行代表一个超平面,消元过程就是把这个超平面系统化简为阶梯形——上面的方程约束更多的变量,下面的方程约束更少的变量,直到最后一个方程只剩一个未知数。这种阶梯结构使得解可以从下往上逐个回代求出。
消元法不改变方程组的解集——这一点是关键。所有初等行变换都是可逆的,变换前后的方程组完全等价。这使得我们可以放心地化简,而不必担心丢失解或引入伪解。
初等行变换的三种类型
初等行变换(Elementary Row Operations)有三种:
- 交换两行(Row Swap):
。几何上交换两个超平面的顺序,不影响交点。 - 某行乘以非零常数(Row Scaling):
( )。几何上等价于把方程两边同乘非零数,超平面位置不变。 - 某行加上另一行的倍数(Row Addition):
。几何上把第 个超平面沿第 个超平面方向滑动,保持与其它超平面的交点不变。
这三种操作都不改变解集,且每一种都对应一个初等矩阵(Elementary Matrix)——左乘该矩阵即等价于执行该行变换。这一观察是后续矩阵分解 = 行变换序列思想的源头。
行阶梯形矩阵(REF)
经过一系列初等行变换后,矩阵可以化为行阶梯形(Row Echelon Form, REF),其特征为:
- 所有非零行都在零行之上
- 每个非零行的首非零元素(主元)的列标严格大于其上一行主元的列标
- 主元下方的所有元素都为零
REF 的阶梯形状使得方程组可以自下而上地回代求解。
主元的概念
主元(Pivot)是消元过程中每一行第一个非零元素。主元的几何意义是维持维度的支点——它对应一个被该方程独立约束的变量。主元的个数就是矩阵的秩,它度量了有效约束的数量。
如果消元过程中遇到某列在当前主元位置为零,且下方所有行该列也为零,那么这一列没有主元——对应的变量是自由变量(Free Variable),可以取任意值。自由变量的存在意味着方程组(如果相容)有无穷多解。
简化行阶梯形矩阵(RREF)
进一步消元,把每个主元上方的元素也化为零,并把主元本身化为 1,就得到简化行阶梯形(Reduced Row Echelon Form, RREF)。RREF 的特征为:
- 它是 REF
- 每个主元为 1
- 每个主元所在列的其它元素全为 0
RREF 的好处是可以直接读出解:主元列对应主变量(值由增广列给出),非主元列对应自由变量(可取任意值)。RREF 对每个矩阵是唯一的,这使得它可以作为矩阵的标准型使用。
高斯消元法的算法流程
高斯消元法(Gaussian Elimination)分两步:
前向消元(Forward Elimination):从第 1 列开始,逐列消去主元下方的所有元素。如果当前主元位置为零,则在下方寻找该列非零的行进行交换;如果整列下方全零,跳过该列继续下一列。前向消元结束时,矩阵化为 REF。
回代(Back Substitution):从最后一行开始,逐行向上求解。最后一行给出最后一个主变量的值,代入上一行求出下一个主变量,依此类推。
高斯-若尔当消元法
高斯-若尔当消元法(Gauss-Jordan Elimination)是高斯消元法的扩展——在前向消元后,继续进行后向消元,把每个主元上方的元素也消为零,并把主元化为 1,直接得到 RREF。这样就跳过了回代步骤,可以直接读出解。
高斯-若尔当消元法虽然每步操作更多,但流程统一、易于编程实现,是计算机代数系统中求解线性方程组的标准方法。
import numpy as np
# 示例:3x3 线性方程组
# 2x + y - z = 8
# -3x - y + 2z = -11
# -2x + y + 2z = -3
A = np.array([[2, 1, -1],
[-3, -1, 2],
[-2, 1, 2]])
b = np.array([8, -11, -3])
# 解法 1:np.linalg.solve(内部用 LAPACK 的 LU 分解)
x = np.linalg.solve(A, b)
print(f"解 x = {x}") # [2, 3, -1]
print(f"验证 A·x = {A @ x}") # 应等于 b
# 解法 2:用 RREF 手动求解(sympy 提供了 rref 函数)
from sympy import Matrix, Rational
M = Matrix([[2, 1, -1, 8],
[-3, -1, 2, -11],
[-2, 1, 2, -3]])
rref, pivot_cols = M.rref()
print(f"\n增广矩阵的 RREF:\n{rref}")
print(f"主元列: {pivot_cols}") # (0, 1, 2) 表示三列都是主元列
print(f"解: x1={rref[0,3]}, x2={rref[1,3]}, x3={rref[2,3]}")主元为零的处理策略
消元过程中如果遇到主元位置为零,需要在下方寻找该列非零的行进行行交换。这是一种正常的处理步骤,不影响最终结果。但如果某列从当前行到最后一行全为零,说明这一列没有主元,对应变量是自由变量。
消元失败的条件
消元失败的真正含义是发现方程组不相容。具体表现为:在增广矩阵的某一行出现形如
如果消元过程中没有出现矛盾行,但存在自由变量,那么方程组有无穷多解;如果没有自由变量且无矛盾行,则存在唯一解。
交互演示:高斯消元分步可视化
下面的演示把高斯消元法的完整过程分步可视化。左侧 3D 场景显示三个原始平面相交,右侧表格实时显示增广矩阵
操作流程:
- 选择预设示例:唯一解(三平面交于一点)、无穷解(三平面交于一条直线)、无解(出现矛盾行
) - 点击 下一步 逐步执行消元,每一步显示:
- 当前操作的行变换(如行 2 ← 行 2 - (-1.5) × 行 1)
- 增广矩阵的实时变化(主元位置绿色高亮,增广列黄色高亮)
- 3D 场景中被操作的平面加深高亮
- 唯一解情况下,最后一步回代求出
并在 3D 场景中用紫色球体标记交点
关键观察:
- 每消去一个主元下方的元素,相当于把对应平面摆正,使交点逐步显示
- 无穷解示例中,消元后会出现全零行(对应自由变量)
- 无解示例中,消元后会出现
形式的矛盾行——这就是 的直观体现
1.3.3 秩:解的存在性与唯一性的核心判据
秩的严格定义
矩阵
代数定义虽然严格,但不够直观。更几何化的定义是:秩是矩阵
行秩等于列秩定理
行秩等于列秩定理:矩阵的行秩与列秩总相等。这一定理虽然表述简单,但意义重要——它表明行视角与列视角在度量信息量时给出相同的答案。无论从方程的视角(行)还是从变量组合的视角(列)看,矩阵所承载的独立信息总量是相同的。
秩的取值范围
对于
秩为 0 当且仅当
满列秩与满行秩
满列秩(Full Column Rank):
满行秩(Full Row Rank):
满列秩 vs 满行秩的几何对比
满列秩 = 单射 = 输入不混淆 = 解若存在则唯一。满行秩 = 满射 = 输出全覆盖 = 解总存在。同时满足两者(即方阵满秩)= 双射 = 解总存在且唯一 = 矩阵可逆。这三种情形是线性代数核心的分类。
秩的几何判别力
从消元角度看,秩等于消元后主元的个数。每一个主元对应一个有效约束,主元总数就是矩阵实际提供的独立信息量。这是秩实用的计算方式——不必直接检查线性无关性,只需消元数主元即可。
克罗内克-卡佩利定理
克罗内克-卡佩利定理(Kronecker-Capelli Theorem):线性方程组
这一定理的几何含义清晰——
秩-零度定理
秩-零度定理(Rank-Nullity Theorem):对于
其中
这一定理的几何含义是:输入空间
交互演示:秩与维度塌缩
下面的演示用3D 立方体的变换直观展示秩的几何意义——变换后像空间的真实维度。3D 场景中灰色虚线立方体是原始单位立方体,被矩阵
4 个预设按钮(点击观察维度塌缩动画):
- 满秩 rank=3:立方体变为绿色平行六面体(体积
),变换可逆 - 秩 2:立方体被压成黄色平面(体积
,降一维),变换不可逆 - 秩 1:立方体被压成橙色直线(极度压缩,降二维)
- 秩 0:立方体塌缩为红色原点(零变换)
关键观察:
- 切换预设时立方体顶点用 lerp 动画平滑过渡,直观展示维度塌缩过程
- 右侧实时显示
、主元数量、像空间维度、零度 、 - 验证秩-零度定理:
恒成立 - 9 个滑块可任意调节矩阵元素,观察自定义变换的像空间维度
1.3.4 齐次线性方程组 Ax = 0:零空间解的结构
平凡解永远存在
齐次方程组
非平凡解的存在条件
非平凡解(Non-trivial Solution,即
即矩阵不满列秩。等价地说,存在自由变量。这一条件的几何含义是:
自由变量与主变量的划分
消元为 RREF 后,每一列要么是主元列(含主元),要么是自由列(不含主元)。主元列对应的变量称为主变量(Pivot Variables),其值由方程唯一确定;自由列对应的变量称为自由变量(Free Variables),可以取任意值。
自由变量的个数恰好等于零度:
基础解系的求解方法
零空间的基础解系(Fundamental Set of Solutions)是一组线性无关的解向量,它们的线性组合给出全部解。求解方法:
- 化
为 RREF - 对每个自由变量,令它取 1,其余自由变量取 0
- 回代求出主变量的值
- 得到一个基础解向量
如果有
齐次通解的通式
齐次方程组的通解为基础解系的线性组合:
其中
零空间的几何本质
齐次解集的几何本质是一个过原点的子空间——零空间
零空间的维度与可视化
零空间的维度等于零度:
在三维空间中可视化:
- 如果
(满秩),零度 ,零空间只含原点——一个 0 维的点 - 如果
,零度 ,零空间是一条过原点的直线 - 如果
,零度 ,零空间是一个过原点的平面 - 如果
(零矩阵),零度 ,零空间是整个
齐次解的几何退化
当
import numpy as np
from sympy import Matrix
# 示例:3x4 齐次方程组(必有非平凡解,因为 n > rank)
A = np.array([[1, 2, 3, 4],
[2, 4, 7, 9],
[1, 2, 3, 5]])
# 用 sympy 求 RREF 与零空间
M = Matrix(A)
rref, pivot_cols = M.rref()
print(f"RREF:\n{rref}")
print(f"主元列: {pivot_cols}") # 第 0, 2 列
print(f"秩 = {len(pivot_cols)}") # 2
print(f"零度 = {M.shape[1] - len(pivot_cols)}") # 4 - 2 = 2
# 零空间基础解系
null_space = M.nullspace()
print(f"\n零空间基础解系({len(null_space)} 个向量):")
for i, v in enumerate(null_space):
print(f" v{i+1} = {v.T}")
# 验证 A·v = 0
A_np = np.array(A, dtype=float)
for i, v in enumerate(null_space):
v_np = np.array(v, dtype=float).flatten()
print(f" A·v{i+1} = {A_np @ v_np}") # 应为零向量交互演示:零空间的可视化
下面的演示把零空间
4 个预设按钮:
- 满秩 rank=3:零空间仅原点(零度 = 0,只有平凡解)
- 秩 2(零度 = 1):零空间是绿色直线(过原点,沿基础解系
方向) - 秩 1(零度 = 2):零空间是绿色平面(过原点,由
张成) - 秩 0(零度 = 3):零空间是整个
(任意向量都是解)
关键交互:
- 拖动
滑块调节线性组合 ,黄色球体在零空间内移动 - 红色、蓝色箭头是基础解系向量
- 右侧实时验证
——结果应恒为零向量,证明 确实在零空间内 - 验证秩-零度定理:
恒成立
1.3.5 非齐次线性方程组 Ax = b:解的结构与仿射空间
相容与不相容的判定
非齐次方程组
- 相容(Consistent,有解):
- 不相容(Inconsistent,无解):
不相容的情形在消元中表现为出现矛盾行
相容时解的三种情况
在相容的前提下,根据秩与未知数个数
- 唯一解:
(满列秩,无自由变量) - 无穷多解:
(有自由变量,零空间非平凡) - (无解的情况已由不相容判定处理)
注意:当
非齐次通解的结构定理
结构定理:若
其中
这一公式的含义是:非齐次解集 = 特解 + 齐次解集。特解决定了偏移量,齐次解集决定了自由度。所有解都共享同一个齐次解集结构,只是平移了
特解的求法
特解
import numpy as np
from sympy import Matrix
# 示例:相容但有无穷多解的方程组
# x1 + 2x2 + 3x3 = 6
# 2x1 + 4x2 + 6x3 = 12 (第 2 行是第 1 行的 2 倍)
A = Matrix([[1, 2, 3],
[2, 4, 6]])
b = Matrix([6, 12])
# 增广矩阵
Ab = A.row_join(b)
rref, pivots = Ab.rref()
print(f"增广矩阵 RREF:\n{rref}")
print(f"主元列: {pivots}") # (0, 3) —— 第 0 列是主元,第 3 列是增广列
# 特解:自由变量 x2, x3 都设为 0
# RREF 第 1 行:x1 + 2x2 + 3x3 = 6 → x1 = 6
xp = Matrix([6, 0, 0])
print(f"\n特解 xp = {xp.T}")
print(f"验证 A·xp = {(A * xp).T}") # [6, 12]
# 齐次方程的零空间
null_space = A.nullspace()
print(f"\n零空间基础解系({len(null_space)} 个向量):")
for i, v in enumerate(null_space):
print(f" v{i+1} = {v.T}")
# 通解:xp + c1*v1 + c2*v2
print(f"\n通解: x = xp + c1·v1 + c2·v2")
print(f" = {xp.T} + c1·{null_space[0].T} + c2·{null_space[1].T}")非齐次解集的几何本质
非齐次解集的几何本质是仿射子空间(Affine Subspace)——即零空间这一线性子空间平移
仿射子空间与线性子空间的差别在于是否过原点:线性子空间必须包含原点,仿射子空间一般不包含原点(除非
解集不过原点的几何意义
非齐次解集不过原点,意味着它无法构成线性子空间——因为线性子空间必须包含零向量,而
尽管如此,仿射子空间仍然保留了许多平坦的几何性质:过任意两点的连线仍在其内,有明确的维度(等于零空间的维度),可以用一个点加一个方向子空间描述。这些性质使得仿射子空间成为几何与代数的桥梁。
唯一解时的退化
当
解集的几何分类
把解集视为
交互演示:仿射解集 = 特解 + 零空间
下面的演示把非齐次通解
3 个预设按钮:
- 唯一解:
, ,特解 ,零空间仅原点,解集退化为一个点 - 无穷多解:
, ,特解 ,零空间 轴,解集是沿 轴平移的紫色直线 - 无解:
, , 不在列空间中,
3D 场景中的关键元素:
- 金色箭头
:特解(满足 的一个解) - 蓝色箭头
:零空间向量(满足 ),拖动 滑块可调节其大小 - 绿色箭头
:通解(首尾相连动画展示加法过程) - 紫色半透明直线/平面:解集(零空间沿
平移得到的仿射子空间,不过原点) - 紫色小球阵:解集上的若干实例(离散采样)
关键观察:
- 紫色解集与蓝色零空间平行但不重合——解集不过原点(因为
不满足 ) - 拖动
滑块时,绿色通解箭头末端沿紫色解集移动 - 右侧实时验证
——结果应恒等于 - 无解情况下,3D 场景只显示零空间(蓝色),无紫色解集
1.3.6 秩的深度几何解读与可视化映射
行列式与秩的关系
对于方阵
即行列式非零当且仅当矩阵满秩。这一等价性把 1.2 节讨论的行列式 = 面积缩放因子与秩 = 像空间维度严格联系起来——行列式为零意味着面积被压为零,即维度发生了塌缩,也就是秩亏损。
秩的维度损失几何意义
矩阵
维度损失恰好等于零度,这是秩-零度定理的直接推论。被损失的维度被压缩为零向量——它们构成零空间。
二维平面变换中的秩
考虑
- rank = 2(满秩):平面被映射到平面。变换可逆,
。几何上,整个 被扭曲但仍覆盖 。 - rank = 1(欠秩):整个平面被压缩成一条过原点的直线。变换不可逆,
。零空间是另一条过原点的直线(所有被压到原点的向量)。 - rank = 0(零变换):所有向量被映射到原点。
是零矩阵。零空间是整个 。
三维空间中的秩
考虑
- rank = 3(满秩):立体映射到立体,变换可逆。
- rank = 2:立体被压成一个平面。一个维度的信息丢失——零空间是一条直线。
- rank = 1:立体被压成一条直线。两个维度的信息丢失——零空间是一个平面。
- rank = 0:所有向量被映射到原点。
行视角与列视角下的秩
从行视角看,秩等于有效方程的数量——消元后剩余的非零行数。如果原方程组有
从列视角看,秩等于列向量张成空间的真实维度。如果
这两种视角给出的秩数值相同(行秩 = 列秩定理),但揭示了不同的冗余——行冗余意味着方程多余,列冗余意味着变量多余。
解的判定流程图
综合本节所有结论,线性方程组
比较
与 - 若
→ 无解(不相容) - 若
→ 有解,继续下一步
- 若
比较
与 - 若
→ 唯一解 - 若
→ 无穷多解
- 若
这一流程把秩作为唯一判据,把所有情形归为三类。下面通过交互演示直观感受这一判定。
交互演示:秩的综合判定与三重视角
下面的演示用三重视角并排联动展示同一个 2×2 方程组,并用判定流程图实时显示解的情况。
三重视角:
- 视角 1 · 行图像:两条直线(红/蓝)的相交情况,绿色点标记唯一解
- 视角 2 · 列图像:列向量(红/蓝)张成的空间,紫色箭头是目标
,验证 是否在列空间中 - 视角 3 · 变换视角:单位正方形被矩阵
变换后的形状,rank=2 绿色平行四边形、rank=1 红色线段、rank=0 灰色点
判定流程图:
- 流程图根据
与 的关系自动判定 - 当前判定路径用绿色高亮,其余路径半透明
- 三种结果:无解(左路径)、唯一解(右上路径)、无穷多解(右下路径)
3 个预设按钮:
- 唯一解:
, , - 无穷多解:
, ,两行成比例 - 无解:
, ,增广矩阵秩更高
import numpy as np
# 秩的判定流程演示
def analyze_system(A, b):
"""分析线性方程组 A·x = b 的解的情况"""
A = np.array(A, dtype=float)
b = np.array(b, dtype=float)
m, n = A.shape
# 计算秩
rank_A = np.linalg.matrix_rank(A)
rank_Ab = np.linalg.matrix_rank(np.column_stack([A, b]))
print(f"矩阵 A ({m}x{n}):\n{A}")
print(f"向量 b: {b}")
print(f"rank(A) = {rank_A}")
print(f"rank([A|b]) = {rank_Ab}")
# 判定流程
if rank_A < rank_Ab:
print("→ 无解(不相容)")
return None
elif rank_A == n:
x = np.linalg.solve(A, b)
print(f"→ 唯一解: x = {x}")
return x
else:
print(f"→ 无穷多解(自由变量个数 = {n - rank_A})")
# 用最小范数解作为示例
x_min = np.linalg.pinv(A) @ b
print(f" 最小范数解: x = {x_min}")
return x_min
# 案例 1:唯一解
print("=== 案例 1:唯一解 ===")
analyze_system([[1, 1], [1, -1]], [3, 1])
# 案例 2:无解
print("\n=== 案例 2:无解 ===")
analyze_system([[1, 1], [2, 2]], [3, 5])
# 案例 3:无穷多解
print("\n=== 案例 3:无穷多解 ===")
analyze_system([[1, 1], [2, 2]], [3, 6])1.3.7 本节小结
从解方程到理解变换的认知跃迁
本节完成了从算术解方程到几何理解变换的认知跃迁。线性方程组
接下来 1.4 节将把视角从解方程提升到空间结构——系统讨论向量空间、四大基本子空间(列空间、零空间、行空间、左零空间),把本节的秩、零空间等概念纳入一个统一的几何框架。这一框架是线性代数的重要成果之一,也是理解 SVD、PCA 等高级方法的基础。
练习题
第 1 题 概念推导
设
参考答案
设
定义线性映射
由于
第 2 题 代码验证
利用本节的 <RankSummaryDemo> 交互组件,依次加载三个预设:唯一解(
参考答案
三组数据如下:唯一解情形
第 3 题 概念推导
求解方程组
参考答案
系数矩阵
特解:令自由变量
齐次基础解系:解
通解为
几何上,解集是
常见错误
错误 1 · 用行列式判定非方阵方程组的解
原因:方阵情形下
解决:统一使用秩判据:先比较
错误 2 · 混淆
原因:把相容性判据记反,写成
解决:明确增广矩阵秩只增不减这一性质:
错误 3 · 把非齐次解集当作线性子空间
原因:非齐次方程组
解决:明确非齐次解集 = 特解 + 齐次解集这一结构。齐次解集
错误 4 · 自由变量个数按行数
原因:把自由变量个数误记为
解决:区分两个量: