参考讲义:代数拓扑从曲面分类到同调算法
自动关联目录:代数拓扑:从曲面分类到同调算法
本页是集中复习用的长篇参考,不是零基础入口。第一次学习请从 模块 1:曲面拓扑短课 开始;该模块已将本页拆成 11 个单概念页面。
本章目标
拓扑研究连续形变下不变的性质。共形几何还会研究角度、度量和曲率,但在此之前必须先回答:曲面有几个连通分支?有没有边界?有多少个洞?一条闭曲线能不能缩成一点?
本章学完后,你应当能够:
- 用图册的语言定义二维流形与带边界流形;
- 用基本群区分圆盘、圆柱、球面和环面;
- 从三角网格组装链复形;
- 计算 Betti 数;
- 用 Euler–Poincaré 公式检查网格拓扑;
- 理解为什么高亏格曲面参数化前必须切出同调基或基本群生成元。
1. 拓扑空间与连续映射
1.1 为什么不能只依赖三维坐标
同一个抽象曲面可以有完全不同的三维形状。橡皮圆环可以被挤压、拉长,但只要不撕裂、不粘合,它仍然是一个环面。拓扑结构只记录“哪些点彼此邻近”,不记录边长和角度。
严格地说,一个拓扑空间是集合 加上一族开集,满足:
- ;
- 任意多个开集的并仍是开集;
- 有限多个开集的交仍是开集。
连续映射 的定义是: 中每个开集 的原像 在 中也是开集。
这个定义看起来抽象,却比“画出来没有跳跃”更可靠,因为曲面可能没有全局坐标,也可能嵌入高维空间。
1.2 同胚与拓扑不变量
若连续双射 的逆映射也连续,则 是同胚,记为。同胚保持:
- 连通分支数;
- 边界分支数;
- 可定向性;
- 亏格;
- 基本群与同调群。
它不保持长度、面积、角度或曲率。因此:圆盘与任意单连通平面区域同胚,但一般不等距。
2. 流形、坐标图与图册
2.1 二维流形
一个 Hausdorff、第二可数的拓扑空间 称为二维拓扑流形,如果每个点 都有邻域 与 的一个开集 同胚:
称为坐标图,多个坐标图覆盖 就得到图册。
flowchart LR
U[曲面上的邻域 U] -->|坐标图 phi| V[平面开集 V]
W[另一邻域 W] -->|坐标图 psi| Z[平面开集 Z]
V -->|过渡函数 psi o phi^-1| Z若过渡函数 都是,图册定义了光滑结构, 就是光滑流形。之后的切向量、微分形式和曲率都依赖这个光滑结构。
2.2 带边界流形
边界点的邻域不像完整圆盘,而像半平面
能映到 的点组成。对三角网格:
- 内部边邻接两个三角形;
- 边界边只邻接一个三角形;
- 闭曲面没有边界边。
2.3 可定向性
若能连续地为整张曲面选择法向方向,曲面可定向。等价地,可以让所有三角形朝向一致:共享边在两个相邻面中的方向相反。
球面、环面可定向;Möbius 带和 Klein 瓶不可定向。本专题主要讨论紧致、连通、可定向曲面,因为复结构和黎曼面理论天然携带定向。
3. 商空间:从多边形制造曲面
把正方形相对边识别,可以构造圆柱或环面。商空间写成,其中等价关系 指定哪些点被视为同一点。
| 边识别 | 得到的空间 |
|---|---|
| 左右边同向粘合 | 圆柱 |
| 左右边反向粘合 | Möbius 带 |
| 左右、上下都同向粘合 | 环面 |
| 适当反向粘合 | Klein 瓶 |
环面可写成
这不仅是拓扑构造,也是之后“周期参数域”的来源:平面上的函数满足,便可下降为环面上的函数。
4. 同伦与基本群
4.1 路径和闭路
路径是连续映射。若,它是以 为基点的闭路。
两条路径 同伦,是指存在连续映射
使、,并在端点固定的版本中保持。
直觉上,同伦允许曲线在曲面上连续滑动,但不能跨过洞或离开曲面。
4.2 基本群
所有以 为基点的闭路同伦类组成基本群
群运算是路径首尾拼接;单位元是常值路径;逆元是反向走原路径。
| 空间 | 基本群 | 解释 |
|---|---|---|
| 圆盘 | 任意闭路可缩成一点 | |
| 球面 | 球面单连通 | |
| 圆 | 整数记录绕行次数 | |
| 圆柱 | 绕轴方向不能缩掉 | |
| 环面 | 两个独立周期 | |
| 亏格 闭曲面 | 见下式 | 有 个生成元和一个关系 |
亏格 的闭可定向曲面有表示
其中交换子。环面的情形 给出,即。
4.3 单连通与切缝
若 路径连通且,称 单连通。平面参数化经常希望把曲面切成单连通域,因为:
- 闭 1-形式在单连通域上可积分为单值函数;
- 调和共轭不再受周期阻碍;
- 局部参数可以拼成全局参数。
高亏格曲面上沿 切开,会得到一个基本多边形。其边界词为
5. 覆盖空间与通用覆盖
5.1 定义
映射 是覆盖映射,如果每个 有邻域,使得
且每个限制 都是同胚。
例子:
实线是圆的通用覆盖。圆上的绕行一次在实线上变成从 到 的路径;闭路的绕数转化为覆盖空间中的端点差。
5.2 路径提升
给定 上路径 和起点上方的一个点,存在唯一提升路径 满足
闭路提升后是否仍闭合,编码了它的同伦类。通用覆盖单连通,其 deck transformation 群与 同构。
这在共形几何中极其重要:
- 球面型曲面的通用覆盖是;
- 平坦型曲面的通用覆盖是;
- 双曲型曲面的通用覆盖是单位圆盘。
这已经预示了一致化定理的三种标准几何。
6. 单纯复形:把曲面变成有限组合对象
6.1 单纯形
-单纯形是 个仿射无关点的凸包:
- 0-单纯形:顶点;
- 1-单纯形:边;
- 2-单纯形:三角形;
- 3-单纯形:四面体。
单纯复形 是一组单纯形,满足:
- 每个单纯形的所有面仍在 中;
- 任意两个单纯形的交要么为空,要么是两者的共同面。
三角网格就是二维单纯复形的几何实现。
6.2 定向
有序顶点 给出定向。交换两个顶点会反向:
三角形 的边界是
边的边界是
直接计算可得
这就是“边界的边界为空”。它不是口号,而是整个同调理论成立的代数条件。
7. 链群、循环、边界和同调群
7.1 链复形
取系数域 或。 是所有定向-单纯形的形式线性组合。边界算子组成
由于,有
定义:
同调群是
它把“闭合”但“不是更高维对象边界”的结构保留下来。
7.2 几何意义
- :连通分支;
- :独立的一维洞;
- :封闭的二维壳。
取域系数时,Betti 数为
对紧致连通可定向曲面:
| 曲面 | |
|---|---|
| 圆盘 | |
| 圆柱 | |
| 球面 | |
| 环面 | |
| 亏格 闭曲面 |
7.3 为什么同调比基本群容易计算
基本群通常非交换,而 是其交换化:
同调只需线性代数:构造边界矩阵并求秩或零空间。代价是它忘掉了闭路的非交换拼接顺序。
8. 边界矩阵与 Betti 数算法
给定顶点、边、面编号,矩阵 表示,矩阵 表示。
对边, 的对应列在行 为、行 为。对面, 的对应列包含其三条有向边的系数。
维数公式给出
所以二维复形满足
8.1 一个单三角形
顶点,边按 定向,面。则
检查:
,,所以
与圆盘一致。
8.2 Python 组装
import numpy as np
from scipy.sparse import coo_matrix
def oriented_edges(faces):
edge_set = set()
for i, j, k in faces:
edge_set.update({tuple(sorted((i, j))),
tuple(sorted((j, k))),
tuple(sorted((k, i)))})
edges = sorted(edge_set)
return edges, {edge: idx for idx, edge in enumerate(edges)}
def boundary_matrices(vertex_count, faces):
edges, edge_id = oriented_edges(faces)
# B1: C1 -> C0,每条全局边按小编号到大编号定向。
rows1, cols1, vals1 = [], [], []
for col, (i, j) in enumerate(edges):
rows1 += [i, j]
cols1 += [col, col]
vals1 += [-1.0, 1.0]
B1 = coo_matrix(
(vals1, (rows1, cols1)),
shape=(vertex_count, len(edges)),
).tocsr()
# B2: C2 -> C1。局部边 [i,j],[j,k],[k,i] 与全局方向比较符号。
rows2, cols2, vals2 = [], [], []
for face_id, (i, j, k) in enumerate(faces):
for a, b in [(i, j), (j, k), (k, i)]:
edge = tuple(sorted((a, b)))
sign = 1.0 if (a, b) == edge else -1.0
rows2.append(edge_id[edge])
cols2.append(face_id)
vals2.append(sign)
B2 = coo_matrix(
(vals2, (rows2, cols2)),
shape=(len(edges), len(faces)),
).tocsr()
return edges, B1, B2
def betti_numbers(vertex_count, faces, tol=1e-10):
edges, B1, B2 = boundary_matrices(vertex_count, faces)
rank1 = np.linalg.matrix_rank(B1.toarray(), tol=tol)
rank2 = np.linalg.matrix_rank(B2.toarray(), tol=tol)
return (
vertex_count - rank1,
len(edges) - rank1 - rank2,
len(faces) - rank2,
)这段实现为了教学把稀疏矩阵转为稠密矩阵求秩,只适用于小网格。大网格通常使用:
- 上的稀疏消元;
- Smith normal form(整数同调与挠元);
- persistent homology 的列约化;
- tree-cotree decomposition 构造曲面同调基。
9. Euler–Poincaré 公式
链复形的交错维数等于同调群的交错维数:
9.1 证明思路
由秩-零化度定理
而
对 交错求和,中间的像空间维数两两抵消,剩下
9.2 曲面分类公式
紧致、连通、可定向、亏格为、边界分支数为 的曲面满足
所以已知网格 和边界分支数,可解出
若右边不是非负整数,通常说明:
- 网格非流形;
- 面朝向或边计数错误;
- 有多个连通分支但仍套用了连通公式;
- 存在未清理的退化面或重复面。
10. 上同调:为什么要研究“沿边积分的量”
同调研究链;上同调研究作用在链上的线性函数。-上链属于
余边界算子 是边界算子的对偶:
在矩阵表示下,如果 表示,则普通内积下 由 表示。
一个离散 1-形式给每条有向边赋值。它可以表示:
- 标量函数的差分;
- 速度场沿边的线积分;
- 纹理坐标增量;
- 环面参数域的周期。
若每个三角形边界上的和为 0,形式闭合:
若存在顶点函数 使,形式恰当。恰当一定闭合,但在有洞的曲面上闭合不一定恰当。商空间
正是“无法写成全局势函数梯度”的周期信息。
11. 与参数化算法的直接关系
11.1 圆盘
。任何闭 1-形式都是恰当的,可以积分得到单值函数。这使调和共轭和全局参数相对直接。
11.2 环面
。存在两条独立周期。一个闭 1-形式沿基本循环的积分可能非零,因此积分会在通用覆盖 上成为单值函数,但回到环面时只在模周期意义下单值。
11.3 高亏格曲面
亏格 的闭可定向曲面有
这解释了为什么需要 个调和 1-形式来构造全纯微分基,也解释了为什么高亏格参数化天然带有周期矩阵。
12. 网格拓扑预检代码
from collections import Counter, defaultdict, deque
def topology_report(vertex_count, faces):
edge_count = Counter()
adjacency = defaultdict(set)
for i, j, k in faces:
for a, b in [(i, j), (j, k), (k, i)]:
edge = tuple(sorted((a, b)))
edge_count[edge] += 1
adjacency[a].add(b)
adjacency[b].add(a)
boundary_edges = [e for e, count in edge_count.items() if count == 1]
non_manifold_edges = [e for e, count in edge_count.items() if count > 2]
visited = set()
components = 0
for start in range(vertex_count):
if start in visited:
continue
components += 1
queue = deque([start])
visited.add(start)
while queue:
i = queue.popleft()
for j in adjacency[i]:
if j not in visited:
visited.add(j)
queue.append(j)
V, E, F = vertex_count, len(edge_count), len(faces)
return {
"V": V,
"E": E,
"F": F,
"euler_characteristic": V - E + F,
"connected_components": components,
"boundary_edge_count": len(boundary_edges),
"non_manifold_edges": non_manifold_edges,
}注意:只数边界边不能得到边界分支数。还要在边界子图上追踪连通环,并验证每个边界顶点的边界度为 2。
13. 定理、算法与假设的对应
| 理论结论 | 算法用途 | 必须检查的假设 |
|---|---|---|
| 曲面分类定理 | 根据 推断亏格 | 紧致、连通、可定向、二维流形 |
| 验证边界矩阵和面朝向 | 全局定向一致 | |
| 用线性代数找独立洞 | 会丢失非交换信息 | |
| 通用覆盖单连通 | 在覆盖空间构造全局坐标 | 需记录 deck transformation |
| Euler–Poincaré | 快速网格完整性检查 | 单纯复形计数正确 |
14. 习题
计算题
- 用一个正方形加对角线构成圆盘网格,手写 并验证。
- 对四面体表面计算 和。
- 一个连通可定向网格有,无边界。求亏格。
- 同一网格若有,检查这些数字是否可能对应流形。
证明题
- 证明同伦是路径集合上的等价关系。
- 用秩-零化度定理证明 Euler–Poincaré 公式。
- 解释为什么恰当 1-形式必然闭合,即。
- 证明树中的任意两个顶点之间只有一条简单路径,并说明这为何可用于选取切缝。
实现题
- 实现边界环提取,输出每条边界的顶点顺序。
- 在 上实现高斯消元,计算小网格的 Betti 数。
- 构造一个环面三角网格,验证。
- 故意删除一个三角形,观察 如何变化。
15. 本章结论
这一章建立了后续计算共形几何的骨架:
下一篇将把链与上链升级为微分形式,并证明 Hodge 分解如何从每个上同调类中选出唯一的调和代表:微分拓扑与 Hodge 分解。