别以为切线只是"贴着曲线画上去的一条线"——那是中学视图里的皮毛。切线真正身份是一阶近似:把方程在一点附近做泰勒展开,线性部分单独成图,那张图就是切空间。这个视角立刻把"光滑"从视觉问题改写成代数问题:一阶近似有没有资格代表原曲线?判据一行——切空间维数对不对得上簇的维数。本节把判据造出来,然后当场拿全册的老朋友们开刀。
切空间:设 V 是 f(x₁,…,xₙ)=0 型超曲面,P 是 V 上一点。在 P 处展开 f,保留一次项得到的线性方程称为切方程,其零点集是 P 处的切空间 T_P V。梯度判据:P 光滑 ⟺ 梯度向量 (∂f/∂x₁,…,∂f/∂xₙ) 在 P 处非零。
以圆 f = x² + y² − 1 为例,在点 P=(1/√2, 1/√2) 处展开。常数项 f(P)=0(点在曲线上,自动成立),二次项是高阶小量,真正说话的是一次项:
∂f/∂x = 2x,∂f/∂y = 2y,在 P 处梯度为 (√2, √2)
切方程:√2·(x − 1/√2) + √2·(y − 1/√2) = 0,化简得 x + y = √2——一条斜率 −1 的直线,与图像上圆在该点的切线完全一致。梯度非零,P 光滑,切空间是一条直线,维数 1 = 圆的维数,判据通过。
三个观察值得记录。其一,切方程只依赖梯度,梯度是偏导数矩阵——光滑判定全程线性代数,不需要任何图像。其二,梯度向量恰好是切线的法向:切空间是梯度的零化核,"法向给了,切向就定了"。其三,常数项与二次项的缺席不是巧合:常数项保证点在簇上,二次项以上属于"弯曲信息",一阶近似看不见它们——第 4 章的重数正是藏在二次以上的层里,稍后回收这条伏笔。

超曲面之外,方程组的判据只多一步矩阵化。设 V 定义于方程组 f₁=…=f_r=0,在点 P 处把所有梯度排成雅可比矩阵 J(P),则:
P 是 V 的光滑点 ⟺ rank J(P) = n − dim V(n 是环境空间维数)
用三个例子把判据跑热。其一,十字线 xy=0 在原点:f=xy,梯度 (y, x) 在原点取 (0,0),奇异——两轴交叉处一阶近似彻底失灵。其二,尖点 y²=x³ 在原点:f=y²−x³,梯度 (−3x², 2y) 归零,奇异。其三,椭圆曲线 y²=x³−x 在 (1,0):梯度 (−3x²+1, 2y) 取 (−2, 0) ≠ 0,光滑,切方程 −2(x−1) = 0 即竖直线 x=1——竖直切线在仿射图里看着别扭,射影坐标下毫无特殊,又一次说明换卡与射影视角的解毒作用。
雅可比判据还有个隐藏福利:它对奇点的"数量"有天然的预算。光滑点构成开集,奇点集是剩余的代数闭子集,维数严格更低——对曲线而言就是有限个点。所以奇点永远稀少、可以逐个歼灭;这个"光滑开集 + 奇点有限"的工作格局贯穿曲线论与曲面论。
把判据落成三十行概念代码,任意平面曲线上的任意点都能判:
from math import isclose def grad(f_coeffs, x, y): """f_coeffs: 字典 {(a, b): c} 表示 c * x^a * y^b。 返回 f 在 (x, y) 处的偏导数值对。""" gx = sum(c * a * x**(a-1) * y**b for (a, b), c in f_coeffs.items() if a >= 1) gy = sum(c * b * x**a * y**(b-1) for (a, b), c in f_coeffs.items() if b >= 1) return gx, gy def is_smooth_at(f_coeffs, x, y): """平面曲线 f=0 在点 P 的光滑性:梯度非零 ⟺ 光滑。""" gx, gy = grad(f_coeffs, x, y) return not (isclose(gx, 0, abs_tol=1e-9) and isclose(gy, 0, abs_tol=1e-9)) cusp = {(2, 0): -1, (0, 2): 1} # y^2 - x^3? 注意: 这里 -x^3 需三次项 cusp = {(3, 0): -1, (0, 2): 1} # y^2 - x^3 print(is_smooth_at(cusp, 0, 0)) # False:原点奇异 print(is_smooth_at(cusp, 1, 1)) # True:(1,1) 在曲线上且光滑 circle = {(2, 0): 1, (0, 2): 1, (0, 0): -1} # x^2 + y^2 - 1 print(is_smooth_at(circle, 0.7071067811865476, 0.7071067811865476)) # True
注意判定前先确认点在曲线上(f(P)=0),判据只对簇上的点说话。三维以上的方程组版只需把梯度对换成雅可比矩阵、再补一行秩计算,思路不变。
把判据走成完整流程:双曲线 f = xy − 1 在点 (1, 1)。梯度 = (y, x) = (1, 1) 非零,光滑。切方程 1·(x−1) + 1·(y−1) = 0,即 x + y = 2——斜率 −1,与图像上双曲线在 (1,1) 处"外鼓"的方向一致。核对第 4 章口径:直线 x+y=2 代入曲线,消 y 得 x² − 2x + 1 = (x−1)²,二重根——切线的重数 2 特征再次对表。顺带可得法线(垂直于切线的直线):斜率 1,方程 y = x,它穿过原点——双曲线 xy=1 关于 y=x 对称(x、y 互换方程不变),法线方向恰是对称轴。一处小小的判据计算,串起了第 2 章(重数)、第 3 章(对称与自同构)与本节,这便是工具咬合的手感。
三个易错点。其一,梯度为零只是"嫌疑",对超曲面它确凿定罪;但对一般方程组,还要核对维数口径——rank 掉到 n−dim V 以下才是奇异,别把"行列式为零"当万能公式。其二,切空间可能"过大"而非"过小":十字线原点的切方程是 0=0,整个平面都是切空间,维数 2 > 簇维数 1——切空间塌缩与爆炸都是病,症状不同病灶相同。其三,光滑性是内蕴性质,与具体方程写法无关:同一个簇换个定义方程(乘个常数、加个幂),梯度数值全变,"是否为零"的判定结果不变——这正是判据配得上"几何"二字的原因。
本节在知识体系里的位置:显微镜开镜。下一节把标本逐个上镜:结点(两支切线)、尖点(重切线)、孤立点(实图孤岛),顺带把 xy=0 这类"假奇点"(可约而来)与"真奇点"(不可约自带)的身份差异讲透。