课程/M04/齐次方程与零空间:哪些方向被压成零
M04 · 线性方程组核心约 30 分钟

4.3 齐次方程与零空间:哪些方向被压成零

本节位置:模块 4 · 线性方程组 | 前置:4.2 | 预计:30 分钟

一句话:零空间是「被矩阵压成零的全部方向」,它的维数告诉你解的自由度从哪来。

0. 场景引入

一个 6 节点、8 根杆的模板支撑架,一端铰支、一端滚动,共 3 个支座约束;剩下 个自由位移。浇筑前工程师要确认一件事:这 9 个方向都被杆件约束住了吗?

把每根杆的轴向刚度组装成 的刚度矩阵 。8 根杆最多提供 8 个独立约束,所以 的秩最多 8——至少有 1 个方向,整个架子可以动,而所有杆件都不产生应变。这个方向就是零空间里的一个机构(mechanism)。

后果很具体:浇筑时混凝土重 12 t,若机构方向恰好是竖向,模板会下沉 30 mm,楼板超厚、保护层不足,返工 12 万元;而补一根斜撑只要 800 元。问题是:机构方向到底是哪个?8 根杆里有没有一根是白放的?

问题:零空间里能有多少个独立方向?它和「杆件数」「自由度数」是什么关系?读完本节,你应该能回答三件事:

  1. 为什么齐次方程 的解集一定是子空间?
  2. 零度 在结构里对应什么,为什么不能直接用「杆数减自由度数」?
  3. 数值上最小的奇异值小到什么程度,才该判成机构?

1. 直觉

1.1 被压扁的方向

把矩阵 想成一台投影仪:它把 投到低维屏幕上。屏幕上没被照到的方向,就是零空间——那些方向上的向量输出全是零。

flowchart LR subgraph IN["输入空间 R^n"] N["零空间 N(A)
整块压成一点"] R["其余方向"] end OUT["屏幕:col(A)
r 维"] N -->|A| Z(("0")) R -->|A| OUT

1.2 齐次解集一定过原点

永远成立;解集还对加法与数乘封闭:、。这正是子空间的定义。对比 4.2 的非齐次解集 :它是平移过的子空间,一般不过原点。

💡 一句话直觉:零空间 = 矩阵「看不见」的方向的集合;维数越大,被压掉的信息越多。

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

里的 不是「没有位移」,而是不产生任何杆件应变的位移模式。杆件只感受长度变化;如果整个架子能沿某个方向滑出去而每根杆的长度不变,杆件就使不上劲。

数学对象桁架里的对应物
矩阵 杆件刚度按节点组装
零空间 所有「杆件不伸长」的位移模式,即机构
零度 机构个数
秩 真正起作用的独立约束数
基础解系每个机构的形状

量级直觉:9 个自由位移、8 根杆,零度至少是 。数值上 通常是 量级(舍入误差),补一根斜撑后升到 左右——从「精确为零」到「正常刚度」,只需要一根杆。

1.4 这个类比在哪里失效

第一,这是小变形、线弹性的 。大变形后刚度随位移变,机构可能被几何硬化(张拉膜、悬索);反过来,受压杆件失稳(屈曲)不是零空间问题,是特征值问题。

第二, 奇异有两种:精确机构,和数值近奇异( 很大但没有精确零空间)。真实结构有节点板、螺栓、次构件,计算模型一简化就会造出「假机构」。

第三,理想铰接、杆件只受轴力是模型假设;实物节点有转动刚度,机构可能被摩擦和节点刚度挡住——但那只意味着它「暂时没动」,不意味着安全。

2. 定义

2.1 齐次方程

「齐次(homogeneous)」指右端为零。它一定有平凡解(trivial solution);我们关心的是非零解。

2.2 零空间

它是 的子空间(不是 ),维数叫零度(nullity)。

2.3 基础解系

零空间的一组基叫基础解系(fundamental system of solutions):线性无关的 ,使 。齐次通解即 。

2.4 秩–零度定理(rank–nullity theorem)

是列数(未知数个数)。这就是 4.2 里「自由变量个数 」的来源;Strang 把它与 一起称为线性代数的基本定理。

3. 为什么这样定义

为什么不直接说「解就是零向量」?因为非零解携带关键信息:它说明列向量线性相关。若存在 使 ,那么 的列线性相关、映射不单射、方阵不可逆。

反过来,零空间只有零向量,说明列线性无关、映射单射、方阵可逆。一个集合同时刻画了三件事。

为什么零空间是「通解的积木」?因为任意两个解的差都在 里。拿到 的一组基,就能把任何一个非齐次解沿零空间方向移动,生成全部解。求 因此被拆成两半:消元找特解,解齐次方程找基。

3.1 反事实:用「杆数减自由度数」当零度

结构工程里常听到一句话:杆件比自由度多,就不会有机构。把它写成公式就是 (自由度减杆数)。用矩阵算一遍就知道它错在哪。

四行、三列。秩是 2(后两行是前两行的组合),所以真实零度是 ,零空间由 张成。按「行数减秩」算,零度是 ;按「列数减行数」算,是 。三个答案:1、2、−1。

放回桁架:8 根杆、9 个自由度, 碰巧对;但如果再加一根不增加独立约束的杆(与另一根共线、端点已被其它杆锁死),杆数变 9、秩仍是 8,按 得 ,就漏掉了仍然存在的机构。换一个「行数减秩」的算法 :8 根杆时得 ,也错;有两根冗余杆时得 ,而真实零度还是 1。

正确的关系只有一条:零度 ,秩要算,不能数。

4. 性质与推导

4.1 维数公式的证明思路

把 化成阶梯形:主元列有 个,对应 个被定住的未知数;剩下 列没有主元,对应自由变量。每个自由变量取 1、其余取 0,回代就得到零空间的一个基向量。它们线性无关(每个向量在一个自由坐标上是 1、其它自由坐标是 0),且张成整个零空间。所以 。

4.2 零空间与行空间正交

对任意 ,有 ,即 对每一行成立。所以

这与第 3.7 节的四个基本子空间是同一件事的两面。

4.3 方阵可逆的等价条件

对 ,以下等价: 可逆;;;(第 5.1 节);列线性无关。

只要 里有一个非零向量,逆就不存在——那个方向被压成零,无法还原。

4.4 和非齐次解的关系

若 是 的解,则全部解是 。零空间越大,解集越大; 就是解集的维数。

5. 例子

5.1 手算: 的零空间

先看秩:,与 相同,所以 ,。

解 :、。令 ,则 、,所以

验算: ✓ 取 得 ,也在零空间里;基础解系只有一个向量,零空间却有无穷多个向量。NumPy 复核:np.linalg.svd(A) 的最小奇异值为 0(数值上约 ),对应右奇异向量与 平行(可差一个符号)。数值秩与「多小才算零」的判读见 Trefethen & Bau。

5.2 对照:4.2 的系统零空间是 2 维

4.2 的 秩为 2,所以 ,基是 与 ——正是通解里那两个自由方向。两篇文档说的是同一件事。

5.3 场景:列相关的判定

三个向量 、、 是否线性无关?按列排成上面的 ,求 得 ,非零,于是

三者线性相关。零空间的一个非零向量,直接给出了相关系数组合。

5.4 场景闭环:9 个自由位移、8 根杆

输入:8 根杆的 与节点坐标,组装出 ,fp64 共 B。荷载 由 12 t 混凝土分配到 6 个节点,约 N(按 估)。

计算:对 做特征分解, 次乘法,微秒级。最小的特征值是 ,对应特征向量就是机构形状;检查它的竖向分量,若与重力方向夹角小于 30°,就是危险机构。

输出:一个决策——在这个方向补一根斜撑。补完后重新组装 , 从 升到 ,机构消失;若想留冗余,可以再加一根,代价还是 800 元。

成本:一根斜撑 800 元、安装 2 小时;返工 12 万元、工期 5 天。计算成本可以忽略——这一步的价值全在「算不算」而不是「算多快」。

失败条件:

  • 假机构: 被当成零,多补一根撑,白花 800 元。兜底:用相对阈值(如 ),并对照节点简图人工确认。
  • 真机构被滤掉:阈值取得太松, 被当成零,架子照塌。兜底:同时检查 与荷载方向上的柔度。
  • 荷载不在列空间: 无解,意味着这个荷载下没有静力平衡——不是「解不出来」,是「站不住」。这时补撑也未必够,要改结构布置。

6. 常见误区

  1. 误区:零空间就是零向量。纠正:零空间是子空间,至少含零向量;只有满列秩时才退化成 。
  2. 误区:基础解系唯一。纠正:零空间的基不唯一, 与 都是 的基;唯一确定的是维数 。
  3. 误区: 与左零空间是一回事。纠正:,左零空间 ,维数分别是 与 。
  4. 误区:行变换保持列空间。纠正:行变换保持解集(求 合法),但改变列空间;判断 要用原矩阵。
  5. 误区:方阵有非零零空间,说明所有方程都无解。纠正:只说明对某些 无解、对另一些有无穷多解。

7. 概念网络

8. 通往大模型:零空间、秩亏与 LoRA

出现位置:线性层的秩亏、表示坍缩(representation collapse)、LoRA 更新的作用范围。

形状:LoRA 把权重更新写成 ,其中 、,(常见 或 ,)。

为什么需要:,所以 的零空间维数至少是 。取 ,至少有 个方向上的输入经过这个更新后输出不变。这就是「LoRA 只改一个低维子空间」的精确含义:大部分方向根本没被动过,所以不容易灾难性遗忘;同时容量上限也在此——需要改的方向若不在那个 维子空间里,就学不到。

可检验结论:np.linalg.matrix_rank(B @ A) <= r 恒成立;把 做 SVD,非零奇异值最多 个,其余全为 0。若某层原本就秩亏,它的零空间方向上梯度长期接近零,这部分容量相当于「死掉」。

import numpy as np
rng = np.random.default_rng(0)
D, r = 64, 4
B, A = rng.normal(size=(D, r)), rng.normal(size=(r, D))
dW = B @ A
print(np.linalg.matrix_rank(dW), np.linalg.svd(dW, compute_uv=False)[:6])
z = rng.normal(size=D)
z -= dW.T @ np.linalg.lstsq(dW.T, z, rcond=None)[0]   # 投影到零空间
print(np.linalg.norm(dW @ z))                          # ≈ 0

如果这一步算错,工程上看到什么现象:把近零奇异值当零(或反过来),LoRA 更新会多删/多留一个方向。用户侧不一定看到报错,而是「某些 prompt 忽然完全不响应」或「一个无关的改写让整段输出跑偏」。这类现象很难归因,因为零空间方向本来就不产生可见输出——它只在换一个输入时才露头。

9. 练习

  1. 概念:为什么齐次方程的解集一定是子空间,而非齐次解集一般不是?
  2. 计算:求 的秩、零空间的一组基与维数。
  3. 计算:求 的零空间,并用它写出 的通解。
  4. 概念:若 且 ,零空间维数是多少? 对任意 都有解吗?
  5. 开放:一个 的权重矩阵如果秩只有 512,对模型意味着什么?给出两个可测的后果。
参考答案
  1. 齐次解集对加法、数乘封闭且含零向量,满足子空间定义;非齐次解集不含零向量(除非 ),两个解相加得 ,不封闭。
  2. 第二行是第一行的 2 倍,第一、三行不成比例,,维数 。令 :由 与 相减得 ,。基为 。
  3. 、,令 :。取 得特解 ,通解 。
  4. 。 行满秩,列空间是整个 ,所以对任意 都有解,且每个 对应一个 2 维解集。
  5. 意味着 4096 个输入方向中约 3584 个被压掉。后果:(a) 有效容量下降,只能用低维子空间区分输入;(b) 这些方向梯度接近零,训练难以恢复;(c) 输出对某些输入差异不敏感,表现为坍缩或同质化。可用有效秩(奇异值谱的熵)量化。

10. 一页速记

  • ,是 的子空间,一定含零向量。
  • 物理意义 / 现实对应:零空间 = 不产生任何输出的输入方向;桁架里是机构,网络里是看不见的流量重分配,模型里是被压掉的表征方向。
  • :自由变量个数就是零度。
  • 基础解系是零空间的一组基,写成 个向量,不唯一。
  • ;方阵 可逆。
  • 非零解 列线性相关;非齐次通解 。

11. 参考文献与致谢

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

  • 斯特朗(Gilbert Strang, 1993):The Fundamental Theorem of Linear Algebra。四个基本子空间的正交关系 与维数公式 ,构成本页第 2.4 节秩–零度定理的矩阵版。Amer. Math. Monthly 100(9), 848–855
  • 特雷费森与鲍(Lloyd N. Trefethen & David Bau, III, 1997):Numerical Linear Algebra。用 SVD 讨论数值秩与近零奇异值,解释了第 5.1 节里「最小奇异值约为 而不是精确的 0」该怎么读。SIAM

下一篇 → 4.4 最小二乘与正规方程

返回 M04 导览去练习场

随堂测 · 5 题

数值难度 1第 1 / 5 题
设 , 是多少?

源文件:04-线性方程组/03-齐次方程与零空间.md

输入关键词开始搜索