课程/M04/解的存在性与通解结构:特解加零空间
M04 · 线性方程组核心约 40 分钟

4.2 解的存在性与通解结构:特解加零空间

本节位置:模块 4 · 线性方程组 | 前置:3.7 四个基本子空间、4.1 | 预计:40 分钟

一句话:先比较两个秩判断「有没有解」,再用自由变量写出「所有解长什么样」。

0. 场景引入

运营商的核心网每 5 分钟从 12 条骨干链路读一次计数,想还原 40 条 OD(origin–destination)流各有多大。路由表告诉你哪些 OD 流经过哪条链路,于是

12 个方程、40 个未知数,秩最多 12,至少有 28 个自由方向。可观测的只有 12 个组合,你却要决定「下个月给哪条链路扩一个 10G 口」:扩错一条,8 万元设备费白花,拥塞还在。40 条流里可能只有 3 条是大象流,可这 3 条恰恰是链路计数最看不清的。

更现实的是,链路计数有约 0.5% 的采样误差。一条 8 Gbps 的链路,0.5% 就是 40 Mbps;当两条链路之和本该等于第三条时,这 40 Mbps 会让等式差一点点—— 不在列空间里,方程无解。

于是运维脚本每天都会遇到两种结局:解不唯一,或者直接报错。

问题:多出来的 28 个自由度到底是什么?无解时又该拿什么代替答案?读完本节,你应该能回答三件事:

  1. 怎样用两个秩,一次判断「无解 / 唯一 / 无穷多」?
  2. 无穷多解时,通解里的「特解」和「零空间」各自负责什么?
  3. 为什么「随便挑一个解」在工程上会骗人?

1. 直觉

1.1 消元 = 换一组更好看的约束

高斯消元(Gaussian elimination)做行变换:把方程加减乘除,得到等价但更简单的方程组。它不改变解集,只改变观察角度。目标是阶梯形(row echelon form):每行第一个非零元(主元,pivot)逐行右移。

1.2 主元列与自由列

行说明
1120-40主元
200131主元
300000没有新信息

有主元的未知数被方程「定住」;、 两列没有主元,对应自由变量(free variable),可以任取。

💡 一句话直觉:解 = 一个特解 + 所有「不改变输出」的方向的组合。前者负责命中 ,后者解释为什么有无穷多解。

通解结构:特解加零空间方向仍落在解集上

图: 的解集是一条直线; 是其中一个特解,沿零空间方向 移动仍留在解集上。

1.3 它在现实世界里对应什么

把消元想成一台会计合并报表的机器。40 条 OD 流是 40 个明细科目,12 条链路是 12 张汇总表:每张表只告诉你「经过我的科目之和」。消元做的事,是把 12 张汇总表重新组合成 12 个彼此独立的口径;剩下的 28 个方向,是汇总表永远看不到的明细分配。

数学对象网络层析里的对应物
未知数 40 条 OD 流的速率
第 行第 条链路上有哪些 OD 流经过(0/1)
主元列能被计数唯一确定的流量组合
自由变量无论怎么改都不影响任何链路计数的重分配
通解 所有与这 12 个计数一致的流量矩阵

量级直觉:28 个自由方向,如果每个只取「有/无」两种极端,就有 种流量矩阵与同一份计数相容。你以为在做测量,其实是在做欠定反演。

1.4 这个类比在哪里失效

流量必须非负,按包计数还是整数。线性解集里绝大多数点带负分量,物理上根本不存在;最小范数解也可能给出负流量。

第二,路由矩阵 不是常数:ECMP 按五元组哈希,同一对 OD 的包会走不同链路, 随流量分布变。

第三,5 分钟计数不是同一瞬间的快照,各链路采样时刻有偏移,这本身就是 的另一个来源。

2. 定义

2.1 增广矩阵(augmented matrix)

把右端 当作最后一列,就得到增广矩阵 。这样行变换能同时作用在系数与右端上,不会漏项。

2.2 秩

是列空间维数,也等于阶梯形中主元的个数; 是增广矩阵的秩。

2.3 秩判据(Rouché–Capelli)

这条判据以 Rouché 与 Capelli 的名字流传;它的现代矩阵语言处理见 Horn 与 Johnson。

设 、 为未知数个数:

条件解的情况自由变量个数
无解—
唯一解
无穷多解

2.4 通解

若 是任一特解(particular solution),则全部解为 ,其中 。记作 ,一个 维的仿射子空间。

3. 为什么这样定义

为什么用「两个秩是否相等」判定存在性?因为行变换把 与 化成阶梯形:出现 ()就是「」的矛盾,它让增广矩阵恰好多一个主元,增广秩比系数秩大 1。反之没有这种行,就能从下往上回代,一定解得出。

为什么通解写成「特解 + 零空间」?因为 是线性的:任意两个解的差满足 ,落在零空间里。所以所有解彼此只差一个零空间向量;自由度 就是零空间维数(4.3 证明)。

3.1 反事实:把自由变量全部置零

欠定时最省事的「选解」办法是:让自由变量取 0,只解主元。听上去无害——它确实给出一个精确解。看一个手算例子:

一个方程、两个未知数,、。置零 得 ;置零 得 ;取两分量相等得 。三个都满足方程,范数分别是 、、。

如果这是两条 OD 流,报给扩容决策的就是「1 Gbps 全走 A」还是「各 500 Mbps」——同一份计数,三个答案,差别是 100%。

再看不那么平凡的例子:5.1 的 系统里,特解 的范数是 1,而把自由变量取成 得到的 范数是 。两者都精确满足方程,但一个把所有流量压到第 3 条 OD 流上,另一个让第 1 条流变成负数。真正的最小范数解是 ,范数约 ——它哪个都不是(按 SVD 计算)。

所以「特解任选」不是自由,是责任:选解规则必须由工程先验给出——最小范数、非负、稀疏,各对应一种业务假设。

4. 性质与推导

4.1 行变换保持解集

三种行变换都是左乘一个可逆矩阵 ,于是 。解集不变,但 的列空间会变——所以不能拿行变换后的矩阵去研究列空间。这是最容易踩的坑之一。

4.2 唯一性与解集结构

若 ,每列都有主元,没有自由变量,回代时每个未知数都被唯一确定。若 ,取自由变量 与 得到两个不同解,故不唯一。

对任意 都是解;反之任一解 都满足 。互相包含,所以解集恰好是 。

这条结论把工作拆成两半:找一个特解(消元 + 回代),再找零空间的一组基(4.3)。若两个秩不等,方程无解,秩判据到此为止;4.4 会把目标换成最小化 。

5. 例子

5.1 手算: 系统的通解

消元。 用第一行消去下面两行的 :。再令 ,并用 消去 中的 :。阶梯形为

数秩。 主元在第 1、3 列,,增广秩也是 2,,故有无穷多解,自由变量 、。

写通解。 回代得 、:

验算。 ;两个方向向量 、 都满足 。NumPy 复核:np.linalg.matrix_rank(A) == 2;lstsq 返回的是解集中范数最小的点(与 相差一个零空间向量)。

5.2 同一系数、矛盾右端

把第三式右端从 4 改成 5:,再减 得 。出现 ,无解。此时 、增广秩 :多出来的一列无法被系数列表示。

5.3 场景:当链路计数自己不自洽

先看一个 4 条链路、2 条 OD 流的最小例子。路由关系是

实测(单位 Gbps)。由 得 ,由 得 ,两者差 0.030 Gbps Mbps。系数秩是 2,增广秩是 3——出现 的矛盾行,无解。

这不是路由模型写错了,而是采样误差。真实网络里 12 条链路的计数永远不可能严格自洽;工程上的下一步不是找「精确解」,而是承认它无解,改用 4.4 的最小二乘,并把残差 当作「这份计数有多脏」的指标。

5.4 场景闭环:12 条链路、40 条 OD 流、5 分钟

输入:路由矩阵 ,每条 OD 流平均经过 3.5 条链路,非零元约 140 个。用 CSR 稀疏存储, kB;计数向量 是 96 B。每 5 分钟来一次,一天 288 次。

计算:对 做一次消元/QR,约 FLOP;回代与零空间基再乘一个常数。按 1 GFLOP/s 估,单次不到 10 μs——算力从来不是瓶颈。

输出:一个特解 、零空间的一组基(28 个方向)、残差 。决策是「扩哪条链路」,但报告里必须同时写清:这个结论依赖哪条选解规则。

成本:每次 10 μs,一年 10 万次也只有 1 s 的计算量。真正的成本是决策风险:28 维自由度里,任何一条 OD 流都能在不改变 12 个计数的前提下被改掉;单靠计数无法定位大象流(elephant flow)。

失败条件:

  • 最小范数把流量摊平: 会把每条 OD 流都分到一点,真正 2 Gbps 的大象流被报成 300 Mbps。兜底:加 sFlow/NetFlow 采样,或用稀疏/非负先验。
  • 负流量:线性解允许 ,物理上不存在。兜底:改用非负最小二乘,并检查解的可行性。
  • 过期:链路权重、ECMP 哈希一变, 整张作废。兜底:拓扑变更后立即重算 ,并在残差突增时告警。

6. 常见误区

  1. 误区: 就有唯一解。纠正:还必须先满足两个秩相等。例如 、:,但增广秩为 3,无解。
  2. 误区:自由变量个数是 。纠正:是 ,自由变量来自没有主元的列,列数由 决定。
  3. 误区:行变换会改变列空间,所以不能用来解方程。纠正:行变换保持解集,这正是消元合法的原因;它只改变列空间。
  4. 误区:通解里的特解唯一。纠正:特解任选,不同特解差一个零空间向量;作为集合的通解唯一,写法不唯一。
  5. 误区:无解时没有任何信息可用。纠正:可以问哪个 让残差最小(4.4),也可以问至少满足哪几个方程。

7. 概念网络

8. 通往大模型:微调中的「解不唯一」

出现位置:约束式微调、模型编辑、把一批输入输出对「装进」权重。

形状:设要修改的权重是 (),约束来自 个样本:,其中 、。每一行是独立的 元方程组,未知数 个、方程 个。

为什么需要:当 时 ,按秩判据这是无穷多解,解集维数 。满足全部约束的权重有整整一个 维(取 )的仿射族。训练停在哪一点取决于初始化、优化器和正则;不同点对旧任务的影响可能完全不同。

可检验结论:任取两个满足 的权重 ,差 满足 ,即每一行都落在 的左零空间里。沿这个方向改权重,对这批约束的输出没有任何影响——这正是「零空间方向」在大模型里的物理含义,也是 4.3 与 4.5 的连接点。

import numpy as np
rng = np.random.default_rng(0)
D, K = 32, 4
H = rng.normal(size=(D, K)); Y = rng.normal(size=(D, K))
W1 = np.linalg.lstsq(H.T, Y.T, rcond=None)[0].T   # 最小范数解
Z = rng.normal(size=(D, D))
Z -= Z @ H @ np.linalg.pinv(H)                    # 投影到左零空间
W2 = W1 + 0.1 * Z
print(np.linalg.norm(W1 @ H - Y), np.linalg.norm(W2 @ H - Y))  # 都满足约束

如果这一步算错,工程上看到什么现象:把「两个秩相等」误读成「有唯一解」,脚本会对欠定系统直接调用 solve,要么报奇异矩阵,要么返回一个带负流量的解;再或者用 pinv 的默认阈值,把近相关的两条链路当成独立约束,扩容建议一天一个样。运维侧看到的不是「数学错了」,而是「同一张网,昨天的报告说扩 A,今天说扩 B」。

9. 练习

  1. 概念:为什么「增广秩更大」等价于「无解」?用阶梯形里的 行解释。
  2. 计算:解 、、,写出通解与自由变量个数。
  3. 计算:判断 、、 是否有解;若有,求通解。
  4. 计算:、,求秩与通解。
  5. 开放:两个微调结果在 100 条评测样本上表现完全一样,能否断定是同一个模型?用本节语言回答。
参考答案
  1. 该行在系数部分无主元、在增广部分有主元,故增广秩比系数秩恰好多 1,对应方程 ,无解。反之无此行则可回代求解。
  2. 第二式是第一式的 2 倍,冗余;由第三式 ,代入第一式得 。,一个自由变量。取 :。
  3. 消元:、,相减得 ,无解(系数秩 2,增广秩 3)。
  4. 三行成比例,; 与列同方向,有解。,通解 。
  5. 不能。评测只覆盖部分方向(就像只有 个约束),两个模型可能只差一个「在这些样本上输出为零」的零空间方向,换输入就会分叉。要判断异同,需要更多方向的探针,或直接比较权重差。

10. 一页速记

  • 先把 化成阶梯形,数主元。
  • 物理意义 / 现实对应:通解是一族「与所有可观测计数一致」的流量分配;特解是代表,零空间是看不见的重分配。
  • 有解 。
  • 有解后: 唯一; 无穷多,自由度 。
  • 通解 ,特解任选,零空间补自由度。
  • 行变换保解集、不保列空间。

11. 参考文献与致谢

这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。

  • 霍恩与约翰逊(Roger A. Horn & Charles R. Johnson, 2012):Matrix Analysis(2nd ed.)。把相容性判据()与通解 放进同一套矩阵语言,第 2.3–2.4 节的写法与之一致。Cambridge University Press
  • 格卡尔(Joseph F. Grcar, 2011):How ordinary elimination became Gaussian elimination。考据「普通消元」如何被归到高斯名下——消元法本身早于高斯,1809 年《天体运动论》的传播才让这个名字定型,第 1.1 节沿用这个叫法。Historia Mathematica 38(2), 163–218

下一篇 → 4.3 齐次方程与零空间

返回 M04 导览去练习场

随堂测 · 6 题

单选难度 1第 1 / 6 题
秩判据(Rouché–Capelli)说的是什么?

源文件:04-线性方程组/02-解的存在性与通解.md

输入关键词开始搜索