CCG 02-09:环面调和形式与代码验证

本页只解决一个问题

非平凡拓扑怎样在调和 1-形式和矩阵零空间中出现?

本页是原长篇讲义的单概念版本。第一次阅读只追踪本页定义的对象;看见未掌握的前置符号时,先沿链接退回,不要跳过定义硬背结论。

开始前

16. 例子:环面上的调和 1-形式

把平面按周期(1,0),(0,1)(1,0),(0,1) 商掉得到平坦环面。两个常数 1-形式

ω1=dx,ω2=dy\omega_1=dx, \qquad \omega_2=dy

都满足

dωi=0,δωi=0.d\omega_i=0, \qquad \delta\omega_i=0.

但它们不是全局恰当形式:若dx=dfdx=df,则沿xx 周期积分应为 0,实际上

∮adx=1.\oint_a dx=1.

它们构成H1(T2)H^1(T^2) 的基。组合

ω=dx+i dy=dz\omega=dx+i\,dy=dz

是一个全纯 1-形式,这条线索会在黎曼面章节继续发展。

17. Python:验证离散复形

import numpy as np


def verify_complex(B1, B2, atol=1e-12):
    defect = B1 @ B2
    max_abs = 0.0 if defect.nnz == 0 else np.abs(defect.data).max()
    if max_abs > atol:
        raise ValueError(f"boundary of boundary is not zero: {max_abs}")
    return max_abs


def exact_projection(d0, star1, omega, anchor=0):
    # 解 d0^T star1 d0 f = d0^T star1 omega。
    # 删除一个自由度消除常数零空间。
    from scipy.sparse.linalg import spsolve

    L = d0.T @ star1 @ d0
    rhs = d0.T @ star1 @ omega
    keep = np.arange(L.shape[0]) != anchor
    f = np.zeros(L.shape[0])
    f[keep] = spsolve(L[keep][:, keep].tocsr(), rhs[keep])
    return d0 @ f, f

生产实现还需要处理:

  • 有边界时的 absolute/relative boundary condition;
  • obtuse triangle 导致的负 dual length;
  • 多连通域的多个常数零空间;
  • 迭代求解器与预条件器;
  • 数值秩和拓扑零空间的区分。

读完必须能回答

  1. 不看公式,用自己的话回答开头的核心问题。
  2. 指出本页最重要公式中每个符号的类型:标量、向量、矩阵、映射还是集合。
  3. 找出定理成立所需的假设,并举一个删除某条假设后可能失败的例子。
  4. 对最小例子手算一遍;若本页含代码,再比较手算与程序输出。

前后课程

上一课:离散外微分与离散 Hodge 星 | 返回模块目录