Skip to content

1.3 线性方程组与秩 ​

前两节我们建立了向量—变换的语言体系:向量描述空间中的对象,矩阵描述空间之间的映射。本节把这套语言应用到线性代数古老而实用的问题上——解方程组。线性方程组是数学本身的核心对象,也是几乎所有工程问题的最终落脚点:最小二乘拟合、有限元分析、PageRank 排名、神经网络反向传播,都在求解某个形式的 Ax=b。本节的中心目标,是把解方程这一算术操作提升为对变换结构的几何理解——而连接这两者的关键概念,就是秩(Rank)。

1.3.1 从方程到矩阵:建模与几何直觉 ​

线性方程组的标准代数形式 ​

一个含有 m 个方程、n 个未知数的线性方程组的标准形式为:

{a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋮am1x1+am2x2+⋯+amnxn=bm

其中 aij 是第 i 个方程中第 j 个未知数 xj 的系数,bi 是第 i 个方程的常数项。线性意味着每个方程中未知数只以一次方的形式出现,且彼此之间没有相乘、没有复合函数。这种简单是其强大的根源——线性结构使得方程组可以被矩阵语言精确刻画,进而利用矩阵理论的全部工具。

矩阵表示法:A x = b ​

把上述方程组的系数提取为矩阵 A∈Rm×n,未知数排成向量 x∈Rn,常数项排成向量 b∈Rm,整个方程组就浓缩为一个矩阵方程:

Ax=b

其中 A=[aij],x=(x1,x2,…,xn)T,b=(b1,b2,…,bm)T。这种表示简洁,更重要的是它把方程组与线性变换统一了起来——求解 Ax=b 等价于寻找一个输入向量 x,使得 A 把它映射到 b。这一翻译是本节所有几何直觉的起点。

行图像:每个方程是一个超平面 ​

行图像(Row Picture)从方程的视角看问题。每一个方程 ai1x1+ai2x2+⋯+ainxn=bi 在 Rn 中定义一个超平面(Hyperplane)——在二维空间中是一条直线,在三维空间中是一个平面,在高维空间中是 n−1 维的平坦子集。方程组的解就是所有这些超平面的公共交点。

以二维两个方程为例,两条直线的位置关系有三种:相交于一点(唯一解)、平行不相交(无解)、完全重合(无穷多解)。这三种几何情形分别对应代数上解的三种状态。行图像的直觉是:方程越多,约束越强,解空间越小。

列图像:寻找列向量的线性组合 ​

列图像(Column Picture)从矩阵的视角看问题。把 A 按列分块为 A=[a1,a2,…,an],则 Ax=b 展开为:

x1a1+x2a2+⋯+xnan=b

也就是说,求解 Ax=b 等价于寻找 A 的各列向量的线性组合,使其等于 b。这一视角把解方程重新解读为** b 是否能被 A 的列向量张成**——如果可以,方程组有解;如果不可以,方程组无解。

列图像是后续理解列空间、秩、相容性的基础。它揭示了方程组有解的本质:b 必须落在 A 的列空间中。

行视角 vs 列视角

行图像关注约束的交点,列图像关注向量的组合。这两种视角是互补的——行视角回答解在哪里,列视角回答解为什么存在或不存在。理解这两种视角的切换,是从算术解方程进入代数理解变换的关键一步。

齐次与非齐次的几何对比 ​

当 b=0 时,方程组 Ax=0 称为齐次方程组(Homogeneous System)。齐次方程组永远有解——至少零向量 x=0 是一个解,称为平凡解(Trivial Solution)。几何上,齐次方程组的解集始终是一个过原点的子空间(零空间)。

当 b≠0 时,方程组 Ax=b 称为非齐次方程组(Non-homogeneous System)。非齐次方程组的解集不过原点,是一个偏移过的子空间——如果 xp 是一个特解,那么所有解都具有 xp+xh 的形式,其中 xh 是对应齐次方程组的解。这种偏移子空间在几何上称为仿射子空间(Affine Subspace),是后续讨论非齐次解结构的核心。

几何交点的三种可能性 ​

无论行视角还是列视角,方程组解的存在情况都有三种:

  1. 唯一解:所有超平面交于一点(行视角);b 可由 A 的列向量唯一地线性表示(列视角)。
  2. 无解:超平面没有公共交点,如两条平行直线(行视角);b 不在 A 的列空间中(列视角)。
  3. 无穷多解:超平面交于一条直线、一个平面或更高维子集(行视角);b 在 A 的列空间中,但列向量线性相关,表示方式不唯一(列视角)。

这三种情况将在 1.3.3 节用秩这一统一概念严格刻画。

增广矩阵 ​

把常数向量 b 作为第 n+1 列并入系数矩阵 A,得到增广矩阵(Augmented Matrix):

[A∣b]=[a11⋯a1n|b1⋮⋱⋮|⋮am1⋯amn|bm]

增广矩阵的几何意义在于:把右侧向量也纳入消元过程的考察范围。比较 A 的秩与 [A∣b] 的秩,就能判定方程组是否相容——这是后续克罗内克-卡佩利定理的核心思想。

交互演示:行图像 vs 列图像 ​

下面的演示用两种等价视角展示同一个 2×2 方程组 Ax=b。顶部按钮切换三种模式:

  1. 行图像:每个方程 aix+biy=ci 是平面上的一条直线,两条直线的交点就是方程组的解(红色与蓝色直线相交于绿色交点)
  2. 列图像:矩阵 A 的两个列向量 a1=(a1,a2)、a2=(b1,b2) 用箭头绘制,目标向量 $\mathbf{b} = (c_1, c_2) 用紫色加粗箭头标记。拖动 x,y 滑块调节线性组合 x⋅a1+y⋅a2(绿色箭头),当其末端落在 b 上时,(x,y) 就是方程组的解
  3. 双栏对比:左右并排同时显示行图像与列图像,直观看到两种视角的等价性

建议实验:

  • 拖动 c1,c2 滑块,观察行图像中直线平移、列图像中目标向量 b 移动
  • 把 a1,b1,a2,b2 调成 a1b2=a2b1(如 a1=1,b1=2,a2=2,b2=4),观察 det(A)=0 时直线平行、列向量共线——方程组失去唯一解

1.3.2 高斯消元法:核心求解算法 ​

消元法的几何本质 ​

高斯消元法的几何本质是:通过初等行变换把超平面摆正,使交点显式显示。每一行代表一个超平面,消元过程就是把这个超平面系统化简为阶梯形——上面的方程约束更多的变量,下面的方程约束更少的变量,直到最后一个方程只剩一个未知数。这种阶梯结构使得解可以从下往上逐个回代求出。

消元法不改变方程组的解集——这一点是关键。所有初等行变换都是可逆的,变换前后的方程组完全等价。这使得我们可以放心地化简,而不必担心丢失解或引入伪解。

初等行变换的三种类型 ​

初等行变换(Elementary Row Operations)有三种:

  1. 交换两行(Row Swap):Ri↔Rj。几何上交换两个超平面的顺序,不影响交点。
  2. 某行乘以非零常数(Row Scaling):Ri→kRi(k≠0)。几何上等价于把方程两边同乘非零数,超平面位置不变。
  3. 某行加上另一行的倍数(Row Addition):Ri→Ri+kRj。几何上把第 i 个超平面沿第 j 个超平面方向滑动,保持与其它超平面的交点不变。

这三种操作都不改变解集,且每一种都对应一个初等矩阵(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。这样就跳过了回代步骤,可以直接读出解。

高斯-若尔当消元法虽然每步操作更多,但流程统一、易于编程实现,是计算机代数系统中求解线性方程组的标准方法。

python
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]}")

主元为零的处理策略 ​

消元过程中如果遇到主元位置为零,需要在下方寻找该列非零的行进行行交换。这是一种正常的处理步骤,不影响最终结果。但如果某列从当前行到最后一行全为零,说明这一列没有主元,对应变量是自由变量。

消元失败的条件 ​

消元失败的真正含义是发现方程组不相容。具体表现为:在增广矩阵的某一行出现形如 [00⋯0∣c](c≠0)的矛盾行——它对应方程 0=c,显然无解。这种情况下,矩阵 A 的秩小于增广矩阵 [A∣b] 的秩,方程组无解。

如果消元过程中没有出现矛盾行,但存在自由变量,那么方程组有无穷多解;如果没有自由变量且无矛盾行,则存在唯一解。

交互演示:高斯消元分步可视化 ​

下面的演示把高斯消元法的完整过程分步可视化。左侧 3D 场景显示三个原始平面相交,右侧表格实时显示增广矩阵 [A∣b] 的状态。

操作流程:

  1. 选择预设示例:唯一解(三平面交于一点)、无穷解(三平面交于一条直线)、无解(出现矛盾行 0=1)
  2. 点击 下一步 逐步执行消元,每一步显示:
    • 当前操作的行变换(如行 2 ← 行 2 - (-1.5) × 行 1)
    • 增广矩阵的实时变化(主元位置绿色高亮,增广列黄色高亮)
    • 3D 场景中被操作的平面加深高亮
  3. 唯一解情况下,最后一步回代求出 x,y,z 并在 3D 场景中用紫色球体标记交点

关键观察:

  • 每消去一个主元下方的元素,相当于把对应平面摆正,使交点逐步显示
  • 无穷解示例中,消元后会出现全零行(对应自由变量)
  • 无解示例中,消元后会出现 [000∣1] 形式的矛盾行——这就是 rank(A)<rank([A∣b]) 的直观体现

1.3.3 秩:解的存在性与唯一性的核心判据 ​

秩的严格定义 ​

矩阵 A 的秩(Rank)定义为它线性无关列向量的最大数目。等价地,秩也是线性无关行向量的最大数目。这一等价性(行秩 = 列秩)是线性代数的重要定理之一。

代数定义虽然严格,但不够直观。更几何化的定义是:秩是矩阵 A 所代表的线性变换的像空间(列空间)的维度。如果把 A 看作 Rn→Rm 的映射,那么像空间 Im(A)={Ax:x∈Rn} 是 Rm 中的一个子空间,其维度就是 rank(A)。

行秩等于列秩定理 ​

行秩等于列秩定理:矩阵的行秩与列秩总相等。这一定理虽然表述简单,但意义重要——它表明行视角与列视角在度量信息量时给出相同的答案。无论从方程的视角(行)还是从变量组合的视角(列)看,矩阵所承载的独立信息总量是相同的。

秩的取值范围 ​

对于 A∈Rm×n,秩满足:

0≤rank(A)≤min(m,n)

秩为 0 当且仅当 A 是零矩阵。秩等于 min(m,n) 时称为满秩(Full Rank)。

满列秩与满行秩 ​

满列秩(Full Column Rank):rank(A)=n(要求 m≥n)。此时 A 的所有列线性无关,映射 A:Rn→Rm 是单射——不同的输入对应不同的输出。从方程组角度,没有自由变量,如果方程组有解则唯一。但解未必存在——b 必须落在 A 的列空间中。

满行秩(Full Row Rank):rank(A)=m(要求 n≥m)。此时 A 的所有行线性无关,映射 A:Rn→Rm 是满射——Rm 中的每个向量都是某个 x 的像。从方程组角度,对任意 b 都有解。但解未必唯一——可能有自由变量。

满列秩 vs 满行秩的几何对比

满列秩 = 单射 = 输入不混淆 = 解若存在则唯一。满行秩 = 满射 = 输出全覆盖 = 解总存在。同时满足两者(即方阵满秩)= 双射 = 解总存在且唯一 = 矩阵可逆。这三种情形是线性代数核心的分类。

秩的几何判别力 ​

从消元角度看,秩等于消元后主元的个数。每一个主元对应一个有效约束,主元总数就是矩阵实际提供的独立信息量。这是秩实用的计算方式——不必直接检查线性无关性,只需消元数主元即可。

克罗内克-卡佩利定理 ​

克罗内克-卡佩利定理(Kronecker-Capelli Theorem):线性方程组 Ax=b 有解(相容)的充要条件是:

rank(A)=rank([A∣b])

这一定理的几何含义清晰——rank(A) 是 A 的列空间维度,rank([A∣b]) 是把 b 并入后列空间的维度。如果两者相等,说明 b 已经在 A 的列空间中,方程组有解;如果 b 让列空间维度增加,说明 b 不在原列空间中,方程组无解。

秩-零度定理 ​

秩-零度定理(Rank-Nullity Theorem):对于 A∈Rm×n,

rank(A)+nullity(A)=n

其中 nullity(A) 是零空间 Null(A)={x:Ax=0} 的维度,称为零度(Nullity)。

这一定理的几何含义是:输入空间 Rn 的维度 n,被分成两部分——一部分被 A 压扁为零(零空间,维度 nullity),另一部分被 A 保留为非零像(像空间,维度 rank)。两者之和等于输入总维度。零度恰好等于自由变量的个数,这把代数(自由变量)与几何(零空间维度)严格对应起来。

交互演示:秩与维度塌缩 ​

下面的演示用3D 立方体的变换直观展示秩的几何意义——变换后像空间的真实维度。3D 场景中灰色虚线立方体是原始单位立方体,被矩阵 A 作用后变为彩色形状,颜色由 rank 决定。

4 个预设按钮(点击观察维度塌缩动画):

  1. 满秩 rank=3:立方体变为绿色平行六面体(体积 =|det(A)|≠0),变换可逆
  2. 秩 2:立方体被压成黄色平面(体积 =0,降一维),变换不可逆
  3. 秩 1:立方体被压成橙色直线(极度压缩,降二维)
  4. 秩 0:立方体塌缩为红色原点(零变换)

关键观察:

  • 切换预设时立方体顶点用 lerp 动画平滑过渡,直观展示维度塌缩过程
  • 右侧实时显示 rank(A)、主元数量、像空间维度、零度 nullity=3−rank、det(A)
  • 验证秩-零度定理:rank+nullity=3 恒成立
  • 9 个滑块可任意调节矩阵元素,观察自定义变换的像空间维度

1.3.4 齐次线性方程组 Ax = 0:零空间解的结构 ​

平凡解永远存在 ​

齐次方程组 Ax=0 永远有解——零向量 x=0 始终满足方程,称为平凡解(Trivial Solution)。这意味着齐次方程组永远相容,无需讨论是否有解的问题,只需讨论是否有非零解。

非平凡解的存在条件 ​

非平凡解(Non-trivial Solution,即 x≠0 的解)存在的充要条件是:

rank(A)<n

即矩阵不满列秩。等价地说,存在自由变量。这一条件的几何含义是:A 把 Rn 压缩到更低维的像空间,必然有非零向量被压为零——这些向量构成零空间。

自由变量与主变量的划分 ​

消元为 RREF 后,每一列要么是主元列(含主元),要么是自由列(不含主元)。主元列对应的变量称为主变量(Pivot Variables),其值由方程唯一确定;自由列对应的变量称为自由变量(Free Variables),可以取任意值。

自由变量的个数恰好等于零度:nullity(A)=n−rank(A)。这一对应把代数(自由变量计数)与几何(零空间维度)统一起来。

基础解系的求解方法 ​

零空间的基础解系(Fundamental Set of Solutions)是一组线性无关的解向量,它们的线性组合给出全部解。求解方法:

  1. 化 A 为 RREF
  2. 对每个自由变量,令它取 1,其余自由变量取 0
  3. 回代求出主变量的值
  4. 得到一个基础解向量

如果有 k=n−rank(A) 个自由变量,就得到 k 个基础解向量 v1,v2,…,vk。

齐次通解的通式 ​

齐次方程组的通解为基础解系的线性组合:

x=c1v1+c2v2+⋯+ckvk

其中 c1,c2,…,ck 为任意常数。每个 vi 是一个基础解向量,k=nullity(A)。

零空间的几何本质 ​

齐次解集的几何本质是一个过原点的子空间——零空间 Null(A)。它是 Rn 的子空间,因为:零向量在其中(平凡解);如果 x 在其中,则 kx 也在其中(齐次性);如果 x,y 都在其中,则 x+y 也在其中(可加性)。这三条性质合起来是子空间的定义。

零空间的维度与可视化 ​

零空间的维度等于零度:dim⁡(Null(A))=nullity(A)=n−rank(A)。

在三维空间中可视化:

  • 如果 rank(A)=3(满秩),零度 =0,零空间只含原点——一个 0 维的点
  • 如果 rank(A)=2,零度 =1,零空间是一条过原点的直线
  • 如果 rank(A)=1,零度 =2,零空间是一个过原点的平面
  • 如果 rank(A)=0(零矩阵),零度 =3,零空间是整个 R3

齐次解的几何退化 ​

当 rank(A)=n(满列秩)时,零空间仅包含原点——变换 A 是单射,不同的输入对应不同的输出,没有任何非零向量被压为零。这是信息无损的情形,是可逆性的几何基础。

python
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}")  # 应为零向量

交互演示:零空间的可视化 ​

下面的演示把零空间 Null(A)={x:Ax=0} 在 3D 场景中直接绘制出来。绿色子空间就是零空间,形状随 rank(A) 变化。

4 个预设按钮:

  1. 满秩 rank=3:零空间仅原点(零度 = 0,只有平凡解)
  2. 秩 2(零度 = 1):零空间是绿色直线(过原点,沿基础解系 v1 方向)
  3. 秩 1(零度 = 2):零空间是绿色平面(过原点,由 v1,v2 张成)
  4. 秩 0(零度 = 3):零空间是整个 R3(任意向量都是解)

关键交互:

  • 拖动 c1,c2 滑块调节线性组合 x=c1v1+c2v2,黄色球体在零空间内移动
  • 红色、蓝色箭头是基础解系向量 v1,v2
  • 右侧实时验证 Ax=0——结果应恒为零向量,证明 x 确实在零空间内
  • 验证秩-零度定理:rank+nullity=3 恒成立

1.3.5 非齐次线性方程组 Ax = b:解的结构与仿射空间 ​

相容与不相容的判定 ​

非齐次方程组 Ax=b 的相容性(是否有解)由克罗内克-卡佩利定理判定:

  • 相容(Consistent,有解):rank(A)=rank([A∣b])
  • 不相容(Inconsistent,无解):rank(A)<rank([A∣b])

不相容的情形在消元中表现为出现矛盾行 [00⋯0∣c](c≠0),对应方程 0=c。

相容时解的三种情况 ​

在相容的前提下,根据秩与未知数个数 n 的关系,解有三种情况:

  1. 唯一解:rank(A)=rank([A∣b])=n(满列秩,无自由变量)
  2. 无穷多解:rank(A)=rank([A∣b])<n(有自由变量,零空间非平凡)
  3. (无解的情况已由不相容判定处理)

注意:当 m<n(方程数少于未知数)且相容时,必有 rank(A)≤m<n,因此必有无穷多解——欠定方程组不可能有唯一解。

非齐次通解的结构定理 ​

结构定理:若 Ax=b 相容,xp 是它的一个特解(Particular Solution,任意一个满足方程的解),则通解为:

x=xp+xh

其中 xh 是对应齐次方程组 Ax=0 的通解。

这一公式的含义是:非齐次解集 = 特解 + 齐次解集。特解决定了偏移量,齐次解集决定了自由度。所有解都共享同一个齐次解集结构,只是平移了 xp 这么多。

特解的求法 ​

特解 xp 的求法:把增广矩阵 [A∣b] 化为 RREF,将所有自由变量设为 0,解出主变量的值。这样得到的 xp 是一个简单的特解。

python
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)——即零空间这一线性子空间平移 xp 后得到的集合。形式化地:

{x:Ax=b}=xp+Null(A)={xp+v:v∈Null(A)}

仿射子空间与线性子空间的差别在于是否过原点:线性子空间必须包含原点,仿射子空间一般不包含原点(除非 xp=0,即 b=0 的齐次情形)。

解集不过原点的几何意义 ​

非齐次解集不过原点,意味着它无法构成线性子空间——因为线性子空间必须包含零向量,而 x=0 不满足 Ax=b(当 b≠0)。这是非齐次与齐次的本质区别。

尽管如此,仿射子空间仍然保留了许多平坦的几何性质:过任意两点的连线仍在其内,有明确的维度(等于零空间的维度),可以用一个点加一个方向子空间描述。这些性质使得仿射子空间成为几何与代数的桥梁。

唯一解时的退化 ​

当 rank(A)=n(满列秩)且方程组相容时,零空间只含原点(nullity=0),通解 x=xp+0=xp 退化为一个孤立点。这是 0 维的仿射子空间——一个点。几何上,所有超平面交于唯一点,没有自由度。

解集的几何分类

把解集视为 Rn 中的几何对象,可以统一分类:无解 = 空集(0 维空);唯一解 = 一个点(0 维仿射空间);无穷多解 = k 维仿射子空间(k=n−rank(A)>0)。这三种情形的判据完全由秩决定——这就是秩作为解方程核心判据的全部意义。

交互演示:仿射解集 = 特解 + 零空间 ​

下面的演示把非齐次通解 x=xp+xh 的结构在 3D 场景中完整可视化。

3 个预设按钮:

  1. 唯一解:A=I,b=(1,1,1),特解 xp=(1,1,1),零空间仅原点,解集退化为一个点
  2. 无穷多解:A=diag(1,1,0),b=(1,2,0),特解 xp=(1,2,0),零空间 =z 轴,解集是沿 z 轴平移的紫色直线
  3. 无解:A=diag(1,1,0),b=(1,2,3),b 不在列空间中,rank(A)<rank([A∣b])

3D 场景中的关键元素:

  • 金色箭头 xp:特解(满足 Axp=b 的一个解)
  • 蓝色箭头 xh:零空间向量(满足 Axh=0),拖动 c 滑块可调节其大小
  • 绿色箭头 x=xp+xh:通解(首尾相连动画展示加法过程)
  • 紫色半透明直线/平面:解集(零空间沿 xp 平移得到的仿射子空间,不过原点)
  • 紫色小球阵:解集上的若干实例(离散采样)

关键观察:

  • 紫色解集与蓝色零空间平行但不重合——解集不过原点(因为 x=0 不满足 Ax=b)
  • 拖动 c 滑块时,绿色通解箭头末端沿紫色解集移动
  • 右侧实时验证 Ax=b——结果应恒等于 b
  • 无解情况下,3D 场景只显示零空间(蓝色),无紫色解集

1.3.6 秩的深度几何解读与可视化映射 ​

行列式与秩的关系 ​

对于方阵 A∈Rn×n,行列式与秩有严格的等价关系:

det(A)≠0⟺rank(A)=n

即行列式非零当且仅当矩阵满秩。这一等价性把 1.2 节讨论的行列式 = 面积缩放因子与秩 = 像空间维度严格联系起来——行列式为零意味着面积被压为零,即维度发生了塌缩,也就是秩亏损。

秩的维度损失几何意义 ​

矩阵 A∈Rm×n 把 Rn 映射到 Rm。输入空间维度为 n,输出像空间维度为 rank(A),因此维度损失为:

维度损失=n−rank(A)=nullity(A)

维度损失恰好等于零度,这是秩-零度定理的直接推论。被损失的维度被压缩为零向量——它们构成零空间。

二维平面变换中的秩 ​

考虑 A∈R2×2(二维到二维的变换):

  • rank = 2(满秩):平面被映射到平面。变换可逆,det(A)≠0。几何上,整个 R2 被扭曲但仍覆盖 R2。
  • rank = 1(欠秩):整个平面被压缩成一条过原点的直线。变换不可逆,det(A)=0。零空间是另一条过原点的直线(所有被压到原点的向量)。
  • rank = 0(零变换):所有向量被映射到原点。A 是零矩阵。零空间是整个 R2。

三维空间中的秩 ​

考虑 A∈R3×3(三维到三维的变换):

  • rank = 3(满秩):立体映射到立体,变换可逆。
  • rank = 2:立体被压成一个平面。一个维度的信息丢失——零空间是一条直线。
  • rank = 1:立体被压成一条直线。两个维度的信息丢失——零空间是一个平面。
  • rank = 0:所有向量被映射到原点。

行视角与列视角下的秩 ​

从行视角看,秩等于有效方程的数量——消元后剩余的非零行数。如果原方程组有 m 个方程但秩只有 r<m,说明有 m−r 个方程是冗余的(可由其它方程线性表示),不提供新的约束信息。

从列视角看,秩等于列向量张成空间的真实维度。如果 A 有 n 列但秩只有 r<n,说明有 n−r 列是冗余的(可由其它列线性表示),不增加新的方向。

这两种视角给出的秩数值相同(行秩 = 列秩定理),但揭示了不同的冗余——行冗余意味着方程多余,列冗余意味着变量多余。

解的判定流程图 ​

综合本节所有结论,线性方程组 Ax=b 的解可以由以下流程判定:

  1. 比较 rank(A) 与 rank([A∣b])

    • 若 rank(A)<rank([A∣b]) → 无解(不相容)
    • 若 rank(A)=rank([A∣b]) → 有解,继续下一步
  2. 比较 rank(A) 与 n

    • 若 rank(A)=n → 唯一解
    • 若 rank(A)<n → 无穷多解

这一流程把秩作为唯一判据,把所有情形归为三类。下面通过交互演示直观感受这一判定。

交互演示:秩的综合判定与三重视角 ​

下面的演示用三重视角并排联动展示同一个 2×2 方程组,并用判定流程图实时显示解的情况。

三重视角:

  1. 视角 1 · 行图像:两条直线(红/蓝)的相交情况,绿色点标记唯一解
  2. 视角 2 · 列图像:列向量(红/蓝)张成的空间,紫色箭头是目标 b,验证 b 是否在列空间中
  3. 视角 3 · 变换视角:单位正方形被矩阵 A 变换后的形状,rank=2 绿色平行四边形、rank=1 红色线段、rank=0 灰色点

判定流程图:

  • 流程图根据 rank(A) 与 rank([A∣b]) 的关系自动判定
  • 当前判定路径用绿色高亮,其余路径半透明
  • 三种结果:无解(左路径)、唯一解(右上路径)、无穷多解(右下路径)

3 个预设按钮:

  1. 唯一解:A=[211−1],b=(3,0),det(A)=−3≠0
  2. 无穷多解:A=[1224],b=(3,6),两行成比例
  3. 无解:A=[1224],b=(3,7),增广矩阵秩更高
python
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 本节小结 ​

从解方程到理解变换的认知跃迁

本节完成了从算术解方程到几何理解变换的认知跃迁。线性方程组 Ax=b 可以理解为寻找被 A 映射到 b 的输入向量这一几何问题。连接代数与几何的核心概念是秩——它度量了变换的像空间维度,决定了方程组是否有解、解是否唯一。克罗内克-卡佩利定理与秩-零度定理合在一起,给出了一个完整的判定框架:用 rank(A) 与 rank([A∣b]) 判定相容性,用 rank(A) 与 n 判定唯一性。这一框架适用于手工解方程,也是后续学习最小二乘、SVD、广义逆的理论基础。

接下来 1.4 节将把视角从解方程提升到空间结构——系统讨论向量空间、四大基本子空间(列空间、零空间、行空间、左零空间),把本节的秩、零空间等概念纳入一个统一的几何框架。这一框架是线性代数的重要成果之一,也是理解 SVD、PCA 等高级方法的基础。

练习题 ​

第 1 题 概念推导 ​

设 A∈Rm×n。证明秩-零度定理 rank(A)+nullity(A)=n,其中 nullity(A)=dim⁡(Null(A))。提示:从 A 的列向量中选出一组极大线性无关列,构造从 Rn 到列空间的同构。

参考答案

设 rank(A)=r,A 的列空间有一组基 {ai1,…,air}(r 个线性无关列)。把 A 按列分块为 A=[A1∣A2],其中 A1∈Rm×r 由这 r 个基列构成,A2∈Rm×(n−r) 由其余列构成。由于 A2 的每一列都能被 A1 的列线性表出,存在矩阵 C∈Rr×(n−r) 使 A2=A1C。

定义线性映射 T:Rn→Rm,T(x)=Ax。Null(A)=ker⁡T。把 x∈Rn 分块为 [x1x2](x1∈Rr,x2∈Rn−r),则

Ax=A1x1+A2x2=A1(x1+Cx2).

由于 A1 列满秩,A1z=0 当且仅当 z=0。故 Ax=0 当且仅当 x1+Cx2=0,即 x1=−Cx2。x2∈Rn−r 可任取,每组 x2 唯一确定一组 x1,故 Null(A) 与 Rn−r 同构,nullity(A)=n−r。代入即得 rank(A)+nullity(A)=r+(n−r)=n。

第 2 题 代码验证 ​

利用本节的 <RankSummaryDemo> 交互组件,依次加载三个预设:唯一解(A=[211−1],b=(3,0))、无穷多解(A=[1224],b=(3,6))、无解(A=[1224],b=(3,7))。记录每组的 rank(A)、rank([A∣b])、n,对照判定流程图验证三类情形的判据。

参考答案

三组数据如下:唯一解情形 rank(A)=2,rank([A∣b])=2,n=2,满足 rank(A)=rank([A∣b])=n,判定为唯一解,行图像中两直线交于一点,列图像中 b 落在列空间内。无穷多解情形 rank(A)=1,rank([A∣b])=1,n=2,满足 rank(A)=rank([A∣b])<n,判定为无穷多解,行图像中两直线重合,自由变量个数为 n−rank(A)=1。无解情形 rank(A)=1,rank([A∣b])=2,满足 rank(A)<rank([A∣b]),判定为无解,行图像中两直线平行不相交,b 脱离列空间。三组数据完整覆盖判定流程的三条路径。

第 3 题 概念推导 ​

求解方程组 {x1+2x2+3x3=62x1+4x2+6x3=12,写出通解形式 x=xp+c1v1+c2v2,并从仿射子空间角度说明解集的几何形状与维度。

参考答案

系数矩阵 A=[123246],第二行是第一行的 2 倍,rank(A)=1,nullity(A)=3−1=2。rank([A∣b])=1(b=(6,12)T 也满足同样的比例关系),方程组相容且有无穷多解。

特解:令自由变量 x2=x3=0,由 x1+2⋅0+3⋅0=6 得 x1=6,故 xp=(6,0,0)T。

齐次基础解系:解 x1+2x2+3x3=0。令 (x2,x3)=(1,0) 得 v1=(−2,1,0)T;令 (x2,x3)=(0,1) 得 v2=(−3,0,1)T。

通解为 x=(6,0,0)T+c1(−2,1,0)T+c2(−3,0,1)T,c1,c2∈R。

几何上,解集是 R3 中一个二维仿射子空间(平面),由零空间(过原点、由 v1,v2 张成的平面)沿 xp 平移得到,不过原点。该平面与零空间平面平行,维度等于 nullity(A)=2。

常见错误 ​

错误 1 · 用行列式判定非方阵方程组的解

原因:方阵情形下 det(A)≠0 是唯一解的判据,初学时容易把这条规则套用到 m×n(m≠n)矩阵上。非方阵没有行列式定义,套用会直接失效;即便对方阵,det(A)≠0 也只能判定唯一解,无法区分无解与无穷多解。

解决:统一使用秩判据:先比较 rank(A) 与 rank([A∣b]) 判定相容性,再比较 rank(A) 与 n 判定唯一性。秩判据适用于任意 m×n 矩阵,覆盖全部三种情形。

错误 2 · 混淆 rank(A) 与 rank([A∣b]) 的判定角色

原因:把相容性判据记反,写成 rank(A)>rank([A∣b]) 时无解。增广矩阵的秩只会大于或等于系数矩阵的秩(增广矩阵包含 A 的所有列,秩不会减少),不可能出现 rank(A)>rank([A∣b])。

解决:明确增广矩阵秩只增不减这一性质:rank([A∣b])≥rank(A) 恒成立。相容要求两者相等,无解对应增广矩阵秩更高(b 引入了新的独立方向,脱离列空间)。

错误 3 · 把非齐次解集当作线性子空间

原因:非齐次方程组 Ax=b(b≠0)的解集是仿射子空间,不过原点,对加法与数乘不封闭。初学时容易把它当作线性子空间处理,例如试图求解集的基或验证零向量是否在解集中。

解决:明确非齐次解集 = 特解 + 齐次解集这一结构。齐次解集 Null(A) 才是线性子空间,有基(零空间基础解系);非齐次解集是零空间沿特解方向平移得到的仿射子空间,不过原点(除非 b=0),讨论基时务必回到齐次情形。

错误 4 · 自由变量个数按行数 m 计算

原因:把自由变量个数误记为 m−rank(A)(方程数减秩),实际应为 n−rank(A)(未知数减秩)。这一错误源于混淆冗余方程数与自由变量数。

解决:区分两个量:m−rank(A) 是冗余方程数(行视角,被其他方程线性表示的方程数),n−rank(A) 是自由变量数(列视角,等于零度)。自由变量数由未知数 n 与秩共同决定,与方程数 m 无直接关系。