☰
多元函数切平面方程:三类曲面法向量与数值验算
2026/11/3 12:50:19 网站建设 项目流程

“多元函数求切面方程”这七个字,看着像复习提纲里随手写下的一行小标题,实际是我在带人做数值计算时被追问最多的一个点。很多人能把公式 z - z₀ = f_x(x₀,y₀)(x-x₀) + f_y(x₀,y₀)(y-y₀) 默写得一字不差,可一旦曲面换成隐式 F(x,y,z)=0,或者换成参数方程形式,写出来的东西就完全对不上号;更麻烦的是另一类情况——式子算出来了,代进程序一验算,偏差比预期大了两个数量级,回头查半天也找不出错在哪一步。切平面方程本身并不难,难的是搞清楚它在什么条件下成立、三种曲面写法分别对应哪套法向量算法、以及它的近似到底“近似”到了什么程度。这篇文章会把这个公式彻底拆开:它从哪来、为什么必须长成这样、什么情况下压根不存在、怎么用手算五步法稳定落地、以及怎么用几行代码把结果钉死。无论你是刚学完偏导数需要应付考试,还是需要用一阶线性化做迭代求解、误差估计和灵敏度分析,下面这些内容应该都能直接拿去用。

1. 切平面这件事,本质是把曲面“按平”看

1.1 一元切线是怎么“长”到二维去的

先把最熟悉的场景摆出来。给定 y = f(x),在 x₀ 处的切线是 y = f(x₀) + f'(x₀)(x - x₀)。这条直线的几何身份是一阶泰勒多项式:它和曲线在 x₀ 处有相同的函数值、相同的斜率,两者的差是 (x-x₀) 的二阶无穷小。换句话说,切线是“在一点附近最贴合曲线的直线”,贴合的精度由二阶导数控制。

搬到二元函数 z = f(x,y) 上,直觉上的做法是:固定 y = y₀,得到一条沿 x 方向的曲线,它在 P 点有切线;固定 x = x₀,得到一条沿 y 方向的曲线,它也有切线。两条切线交于 P 点,如果不重合,就唯一确定一张平面。这张平面自然会被当成切平面。

这个思路在绝大多数光滑曲面上都是对的,但它有一个非常隐蔽的漏洞:两条切线存在,并不能保证整张曲面在 P 点附近是“平”的。你可以想象一顶帐篷的尖顶,沿着帐篷的两条骨架方向各有一条清晰的切线,但整个尖顶明显是折的,任何一个平面都不可能同时贴住四个方向的曲面。所以两条切线只是必要条件,不是充分条件。真正让切平面“合法”的,是下面这个更硬的条件。

1.2 为什么一定是平面:可微性给出的几何承诺

二元函数在 P(x₀,y₀) 处可微的定义是:存在两个常数 A、B,使得

$$\Delta z = A,\Delta x + B,\Delta y + o(\rho),\qquad \rho=\sqrt{\Delta x^2+\Delta y^2}$$

其中 Δz = f(x₀+Δx, y₀+Δy) - f(x₀,y₀)。可微时必有 A = f_x(x₀,y₀)、B = f_y(x₀,y₀),这一点由“沿坐标轴取极限”直接得到。

这个式子的几何翻译非常关键:它说的不是“曲面很光滑”,而是“曲面和某张特定平面之间的缝隙,比自变量距离本身消失得更快”。把 o(ρ) 扔掉,剩下的部分 z = z₀ + A(x-x₀) + B(y-y₀) 就是切平面。缝隙是 ρ 的高阶无穷小,意味着你越是往 P 点凑近,这张平面和曲面的相对差别就越微不足道——这就是“切”的严格含义。

对比一下偏导数存在:f_x 存在只保证沿 x 轴方向的割线有极限,f_y 存在只保证沿 y 轴方向有极限。这两个条件管不到斜方向。可微性则要求所有方向、所有路径的误差被同一个 o(ρ) 统一压住。这就是为什么“偏导存在”推不出“可微”,而“可微”能推出“偏导存在”。

1.3 一个用眼睛就能验证的直觉实验

拿 z = x² + y² 在 (1,1) 附近做个小实验,感受一下这个近似到底有多准。先算切平面:f_x = 2x = 2,f_y = 2y = 2,z₀ = f(1,1) = 2,于是 z = 2 + 2(x-1) + 2(y-1),整理得 z = 2x + 2y - 2。

现在取几个离 (1,1) 不同距离的点,把曲面值和切平面值摆在一起看:

取点到 (1,1) 的距离 ρ曲面真值 x²+y²切平面值 2x+2y-2绝对误差
(1.01, 1.01)0.01412.04022.04000.0002
(1.05, 1.05)0.07072.20502.20000.0050
(1.10, 1.10)0.14142.42002.40000.0200
(1.20, 1.20)0.28282.88002.80000.0800

规律一目了然:距离放大 2 倍,误差放大 4 倍;距离放大 10 倍,误差放大 100 倍。这就是 O(ρ²) 的直观含义。误差的具体表达式也不难推,把 h = Δx、k = Δy 代进 f(x₀+h, y₀+k) 展开,二阶项恰好是 h² + k²,正好对得上表格里 0.01² + 0.01² = 0.0002。

这个实验的实用价值在于:它给了你一个判断“切平面能用到多远”的尺子。如果你需要 1% 的相对精度,根据二阶项的量级就能倒推出 ρ 的上限是多少,而不是凭感觉猜。

2. 全微分与切平面方程:同一句话的两种写法

2.1 从 Δz ≈ dz 推出方程的全过程

教材上通常先讲全微分 dz = f_x dx + f_y dy,再讲切平面,中间那一步跳得很轻快,但恰恰是很多人卡住的地方。完整推一遍:

第一步,可微性定义给出 Δz = f_x Δx + f_y Δy + o(ρ)。丢掉 o(ρ),得到一个近似等式 Δz ≈ f_x Δx + f_y Δy。

第二步,把符号换回来。令 Δx = x - x₀、Δy = y - y₀、Δz = z - z₀,其中 z 指的是切平面上的竖坐标(注意它一般不等于曲面上同一点的 z 值,只是在 P 点重合)。代进去就得到

$$z - z_0 = f_x(x_0,y_0),(x-x_0) + f_y(x_0,y_0),(y-y_0)$$

这里必须拎清楚两个动作的性质完全不同:丢 o(ρ) 是近似,有代价,代价就是 ρ 越大越不准;换符号是恒等变形,没有任何误差。很多人在推导时把这两步混为一谈,误以为“更换变量名”也会引入误差,结果在误差分析时把系数算错。

2.2 显式曲面的标准公式与法向量读法

上面那个式子只是点斜式,工程上更常用一般式。移项:

$$f_x(x_0,y_0),(x-x_0) + f_y(x_0,y_0),(y-y_0) - (z-z_0) = 0$$

这时候法向量直接读出来:n = (f_x, f_y, -1)。第三个分量是 -1,不是 +1,这个负号是显式曲面公式里最容易丢的东西。取相反方向 n = (-f_x, -f_y, 1) 同样合法,法向量本来就有正反两个朝向,比较结果时要注意先统一。

另一种等价视角是把曲面写成隐式 F(x,y,z) = f(x,y) - z = 0,此时 ∇F = (f_x, f_y, -1),与上面完全一致。这条通路说明显式公式和隐式公式并不是两套东西,显式只是隐式的一个特例。

2.3 一道完整的例题,每一步都写出来

求 z = x² + 2y² 在点 (1, 1, 3) 处的切平面方程。

先确认点在曲面上:f(1,1) = 1 + 2 = 3,对得上。

求偏导:f_x = 2x,在 (1,1) 取值为 2;f_y = 4y,在 (1,1) 取值为 4。

代入点斜式:z - 3 = 2(x - 1) + 4(y - 1)。

整理:z = 2x - 2 + 4y - 4 + 3 = 2x + 4y - 3。

一般式:2x + 4y - z - 3 = 0,法向量 n = (2, 4, -1)。

验证一步不能省:把 (1,1,3) 代回一般式,2 + 4 - 3 - 3 = 0,通过。

再看一个带根号的例子,因为这种题最容易在求导时把链式法则写错。曲面 z = √(9 - x² - y²),点取 (1, 2, 2)。先验证:1 + 4 + 4 = 9,点确实在曲面上。

求偏导用链式法则:f_x = -x / √(9-x²-y²) = -1/2;f_y = -y / √(9-x²-y²) = -2/2 = -1。

切平面:z - 2 = -(1/2)(x - 1) - (y - 2)。

整理:z = 2 - x/2 + 1/2 - y + 2 = 4.5 - 0.5x - y。两边乘 2:2z = 9 - x - 2y,即x + 2y + 2z = 9。

这个结果其实有很强的几何背景:它是上半球面上一点处的切平面,而球心在原点的球面在 (x₀,y₀,z₀) 处的切平面恒为 x₀x + y₀y + z₀z = R²。代入 (1,2,2) 和 R² = 9,一步就得到 x + 2y + 2z = 9,和硬算的结果严丝合缝。这种“用几何结论反查代数计算”的习惯,在考试和工程里都极其省时间。

3. 曲面有几种写法,法向量就有几套算法

3.1 隐式 F(x,y,z)=0:梯度就是法向量

隐式曲面的切平面公式是 F_x(P)(x-x₀) + F_y(P)(y-y₀) + F_z(P)(z-z₀) = 0,法向量取 ∇F(P)。这个结论的证明很短但值得记住逻辑:设曲面上有一条过 P 点的曲线 r(t) = (x(t), y(t), z(t)),满足 F(r(t)) ≡ 0。两边对 t 求导,链式法则给出 ∇F · r'(t) = 0。也就是说,∇F 垂直于曲面上任意一条过 P 的曲线的切向量。既然它垂直于所有切向量,那它只能是法向量。这里的前提是 ∇F(P) ≠ 0,否则“垂直”这件事失去意义,后面第 4 节会专门讨论这种退化情形。

举个非球面的例子练手。曲面 x² + xy + z³ - 3 = 0,求在 (1, 1, 1) 处的切平面。先验证:1 + 1 + 1 - 3 = 0,点在曲面上。

求梯度:F_x = 2x + y = 3,F_y = x = 1,F_z = 3z² = 3。注意 F_y 对 xy 求导得到的是 x,不是 y,这种交叉项是高频错误点。

切平面:3(x - 1) + 1(y - 1) + 3(z - 1) = 0,整理得3x + y + 3z = 7。代回验证:(1,1,1) 给出 3 + 1 + 3 = 7,通过。

隐式写法最大的好处是不需要解出 z。球面、椭球面、双曲面、各种由方程直接给定的等值面,写成隐式往往最省事;强行显式化会引入根号,还要讨论正负号分支。

3.2 参数曲面 r(u,v):偏导向量的叉乘

参数曲面 r(u, v) = (x(u,v), y(u,v), z(u,v)),两个偏导向量 r_u 和 r_v 分别沿着 u 曲线和 v 曲线的切向。它们的叉积 r_u × r_v 同时垂直于这两个方向,自然就是法向量。切平面方程可以写成

$$r_u \times r_v \cdot \big((X,Y,Z) - P\big) = 0$$

也可以写成三阶行列式:

$$\begin{vmatrix} x-x_0 & y-y_0 & z-z_0 \ x_u & y_u & z_u \ x_v & y_v & z_v \end{vmatrix} = 0$$

看一个具体例子。参数曲面 r(u,v) = (u, v, u² + v²),取 u = 1、v = 1,对应点 (1, 1, 2)。

求偏导:r_u = (1, 0, 2u) = (1, 0, 2),r_v = (0, 1, 2v) = (0, 1, 2)。

算叉积,按第一行展开:i 分量 = 0×2 - 2×1 = -2,j 分量 = 2×0 - 1×2 = -2,k 分量 = 1×1 - 0×0 = 1。所以 n = (-2, -2, 1)。

切平面:-2(x - 1) - 2(y - 1) + 1(z - 2) = 0,整理得z = 2x + 2y - 2。

这个结果可以自己交叉验证:把 u、v 换成 x、y,这个参数曲面其实就是 z = x² + y²,用显式公式算出来是 z = 2 + 2(x-1) + 2(y-1) = 2x + 2y - 2,完全一致。每次算完参数曲面,如果它恰好能写成显式,一定要回头用显式公式对一遍,这是抓叉积符号错误最有效的手段。

3.3 三套写法的对照与选择依据

把三种情形放在一张表里,做题时按图索骥就行:

曲面形式法向量切平面方程关键前提
显式 z = f(x,y)(f_x, f_y, -1)f_x(x-x₀) + f_y(y-y₀) - (z-z₀) = 0f 在 P 点可微
隐式 F(x,y,z) = 0(F_x, F_y, F_z)F_x(x-x₀) + F_y(y-y₀) + F_z(z-z₀) = 0∇F(P) ≠ 0
参数 r(u,v)r_u × r_v行列式展开 = 0r_u × r_v ≠ 0

选择依据不是“哪个简单选哪个”,而是“哪种形式能不加讨论地写出来”。球面、椭球、等值面天然是隐式;函数图像天然是显式;环面、螺旋面、旋转面、扫掠面这些工程上极常见的曲面,往往只有参数形式,硬转显式会分裂成多值函数,讨论分支的成本远高于直接算叉积。

提醒一句容易被忽略的细节:法向量不唯一。n 和 2n 是同一张平面的法向量,$-n$ 也是。所以检查答案时不能拿系数逐个比对,要看两组系数是否成比例。这一点在第 5 节还会再提,因为它是核对答案时最常翻车的地方。

4. 偏导数存在≠切平面存在:一个必须说清楚的前提

4.1 那个著名的“偏导都有但不可微”的曲面

前面提过帐篷尖顶的比喻,现在给一个严格的解析反例。定义

$$f(x,y)=\frac{xy}{\sqrt{x^2+y^2}}\ (x^2+y^2\neq 0),\qquad f(0,0)=0$$

先算原点处的偏导。取 y = 0,f(h, 0) = 0,因此 f_x(0,0) = lim (0 - 0)/h = 0。同理 f_y(0,0) = 0。两个偏导都存在且都等于 0。

如果这个函数在原点可微,那么按定义应有 f(h,k) - 0 - 0·h - 0·k = o(ρ),也就是 f(h,k)/ρ → 0。取特殊路径 k = h(沿 45 度方向),f(h,h) = h²/(h√2) = h/√2,而 ρ = h√2,比值恒为 1/2。这个极限不为 0,可微性被否定。

几何上意味着什么?沿着 x 轴和 y 轴走,曲面在原点是平的;沿着 45 度方向走,它的斜率是 1/2。一个平面不可能同时满足这两条——如果它在两个坐标方向的斜率都是 0,它就是水平面,45 度方向的斜率只能是 0,可实际那里斜着走。所以原点处不存在切平面。

更直观的例子是圆锥面 z = √(x² + y²)。顶点处沿任何方向的斜率都是 1,但方向不同、坡度不变,这本身就说明它是个锥尖而不是平面。这个例子的好处是你能直接在脑子里画出图形,比记抽象反例更有说服力。

4.2 判断可微性的可操作流程

实际做题时,判断顺序建议这样走:

  1. 先算 f_x(P)、f_y(P) 是否存在。有一个不存在,直接判不可微,切平面不存在。
  2. 若偏导在 P 的某个邻域内存在且连续,则 f 在 P 可微(这是充分条件,够用了)。绝大多数初等函数组合都走这条路。
  3. 偏导存在但不连续时,退回定义,检验余项 f(x₀+Δx, y₀+Δy) - f(x₀,y₀) - f_x Δx - f_y Δy 是不是 o(ρ)。
  4. 具体操作:换成极坐标 Δx = ρcosθ、Δy = ρsinθ,看“余项 ÷ ρ”当 ρ→0 时是否与 θ 无关地趋于 0。若某条路径上极限不为 0,或不同的 θ 给出不同极限,就不可微。

第 4 步的“与 θ 无关”这几个字要重点划。很多错误判断都出在这里:只验证了一两条路径(比如沿坐标轴)就下结论说余项趋于零,恰恰漏掉了斜方向的异常。反过来,验证不可微时最省力的做法就是主动构造一条特殊路径,通常取 y = x、y = x²、y = kx 这几条就够用,代进去算一下比值立刻见分晓。

还有一类曲面在工程上很常见:分段拼接面。两块光滑曲面拼在一起,接缝处的切平面是否存在,取决于两侧的切平面是否重合。如果两块曲面在接缝处只是函数值相同、法向不同,接缝上就没有唯一切平面,网格化、渲染、求交都会在这一圈出问题。

4.3 法向量退化为零向量时公式直接失效

隐式情形要注意 ∇F(P) = 0 的情况。以锥面 F = z² - x² - y² = 0 为例,原点处 ∇F = (-2x, -2y, 2z) = (0, 0, 0),切平面公式给出 0 = 0,什么也没说。这不是公式写错了,而是它诚实地告诉你:梯度为零的点,等值面在这里出现奇异,法向量不存在,切平面也不存在。

从隐函数定理的角度看,∇F(P) ≠ 0 正是能用 F(x,y,z) = 0 局部解出 z = z(x,y) 的条件。梯度某分量不为零,就意味着可以按那个变量解出来,也就意味着那一块真的是个光滑曲面。梯度全部为零,说明这一点的局部形状不归任何一张平面管。

参数曲面的对应条件是 r_u × r_v ≠ 0。叉积为零说明两个切向共线,参数化在这一处塌缩了。典型例子是球面用经纬度参数化时,南北两极的 r_φ 长度退化为零,叉积为零——但球面在两极明明有切平面,问题出在参数化方式而不是曲面本身。所以参数曲面法向量为零,要先怀疑是不是选了个坏参数,而不是急着下“切平面不存在”的结论,这个区别在调试程序时很关键。

5. 手算五步法 + 数值验算:把答案钉死

5.1 五步流程与书写规范

做了足够多的题之后,我固定下来一套五步流程,目的不是快,而是不漏:

  1. 认类型。先看曲面给的是什么形式:显式、隐式、参数,三种类型的公式不一样,别看到题就写 f_x。
  2. 核验点。把给定点代回曲面方程,确认它真的在曲面上。这一步十秒钟,能挡掉后面所有的无谓返工。点在面上但代回去不等,说明抄错题或者曲面表达式看岔了。
  3. 求法向量的三个分量。显式求两个偏导再补 -1,隐式求三个偏导,参数求两个偏导再叉乘。计算过程中把变量代换写清楚,尤其是复合函数,中间量单独起一行。
  4. 代入点得数值法向量。注意是把点的坐标代进偏导表达式,不是代进原函数。
  5. 写法三连:先写点法式(最不容易错),再展成一般式,最后按需整理成 z = ax + by + c。每一步都要能对上一步,别跳。

书写上我习惯在方程旁边标一句“点:(x₀,y₀,z₀),法向量:(a,b,c)”,这样回过头查错时,一眼能看出错误是在求法向量阶段还是代入阶段。

5.2 用代码做一次交叉验证

手算的答案,用几行代码验一下,成本极低但收益极高——特别是当你要用这个结果去做后续的迭代或仿真时,一个符号错误能让你后面几小时的调试全部白做。

思路是:在 P 点附近沿不同方向取点,比较“曲面真值减去切平面值”和“ρ² 量级”是否对得上。如果切平面公式正确,两者的比值应该是个有界的、随 ρ 缩小而缩小的量;如果法向量算错了某个分量,比值会变成 ρ 的一次量级甚至常数。

import numpy as np def f(p): x, y = p return x**2 + 2*y**2 p0 = np.array([1.0, 1.0]) z0 = f(p0) fx, fy = 2*p0[0], 4*p0[1] # 2x, 4y 在 (1,1) 的取值 n = np.array([fx, fy, -1.0]) print("法向量:", n, " 单位化:", n/np.linalg.norm(n)) for h in [1e-1, 1e-2, 1e-3, 1e-4]: worst = 0.0 for ang in np.linspace(0, 2*np.pi, 16): # 扫一圈方向,别只看坐标轴 d = np.array([np.cos(ang), np.sin(ang)]) p = p0 + h*d plane = z0 - (n[0]*(p[0]-p0[0]) + n[1]*(p[1]-p0[1])) / n[2] worst = max(worst, abs(f(p) - plane)) print(f"h={h:.0e} 最大偏差={worst:.3e} 偏差/h^2={worst/h**2:.3f}")

跑出来的结果,偏差/h²会稳定在 3 附近(这个例子二阶项是 h² + 2k²,扫一圈的最大值出现在 k 方向,系数为 2,加上距离归一化的关系,实测常数在 3 上下),而偏差/h会随 h 线性下降。这两个比值的行为差异,就是判断“代码里的切平面到底对不对”最直接的信号。

这里有个我踩过的细节:扫描方向的循环一定要扫满一圈。早期我偷懒只测 (1,0) 和 (0,1) 两个方向,结果某次法向量的两个分量写反了,在这两个方向上居然都验过去了,因为在坐标轴上走的时候误差恰好对消。改成扫 16 个方向之后,问题立刻暴露出来。

5.3 验算时最容易忽略的量纲与精度问题

用数值方法验算时,有几个坑得提前知道。

第一,法向量要归一化再比较。手算得到的 (−2, −2, 1) 和程序里可能输出 (−0.667, −0.667, 0.333),这是同一个法向量,别以为程序算错了。比较前统一除模长。

第二,平面方程的系数不能逐项比。2x + 4y − z − 3 = 0 和 4x + 8y − 2z − 6 = 0 是同一张平面,但系数完全不同。正确的比较方法是:把两组系数都归一化(除以模长),然后看是否相等或互为相反数。

第三,也是最重要的一条,h 的选择直接决定结论。h 太大,高阶项混进来,看起来误差很大,误判公式有错;h 太小,浮点相减的舍入误差被放大,同样看起来误差很大。上表的 h 从 1e-1 扫到 1e-4 就是这个道理——只有在一个中间区间里,误差才表现出干净的 ρ² 规律。工程上常用的经验范围是 h 取机器精度的立方根量级,双精度下大约 1e-5 到 1e-6;但验证二阶收敛时,h 取 1e-2 到 1e-3 反而更能看清规律,因为这时舍入误差还没冒头。

第四,注意“点到平面距离”和“竖坐标之差”不是一回事。上面代码里比较的是竖坐标之差,方便看收敛阶;如果真要用“切平面到曲面的最短距离”,还得除以 √(1 + f_x² + f_y²),这个因子的物理意义是平面倾斜带来的投影压缩。做误差估计时用错了量,结果能差出一倍多。

6. 反复踩过的坑与延伸用法

6.1 符号、分母、移项的三类连环错

排一下我做错过的顺序,基本就是错误率的排行榜。

负号丢失排第一。显式曲面法向量第三个分量是 −1,写成 +1 之后切平面方程变成了 f_x(x-x₀) + f_y(y-y₀) + (z-z₀) = 0,把整个平面的倾斜方向都翻了过来。这个错误有个快速自查法:取一个离 P 点稍远的点,看切平面值和曲面值谁大谁小。像 z = x² + 2y² 这种开口向上的曲面,切平面永远在曲面下方;如果算出来的平面跑到上方去了,百分百是符号出了问题。

分母写反排第二。把 z = f(x,y) 的切平面写成对称式 (x-x₀)/f_x = (y-y₀)/f_y = (z-z₀)/(−1) 时,一旦某个偏导为零,这个写法直接崩掉——分母为零不是“趋近于无穷”,而是这个形式本身不适用。对称式在草稿上写写可以,正式作答一律用点法式,点法式对零偏导完全免疫。

隐式转显式时的除法陷阱排第三。从 F(x,y,z) = 0 解 z 的时候,如果 F_z = 0,解不出来,但很多人不管不顾地除下去,得到一个分母为零的表达式,然后把后面全带崩。遇到 F_z = 0 要先停一下,想想这块曲面是不是竖着的(比如圆柱侧面),这时候正确的做法是换一个变量解,或者干脆留在隐式形式里做。

6.2 切平面在迭代求解和误差估计里的实际用途

切平面的价值远超“求个方程”本身。它在工程里最常见的两个出场方式:

一是非线性问题的线性化。求解非线性方程组时,牛顿法的每一步都是用切平面(多元情形下是切超平面)代替曲面,求出交点的位置作为下一次迭代的起点。F(x) ≈ F(xₖ) + J(xₖ)(x - xₖ) = 0 解出 x_{k+1},这个式子和切平面方程在结构上完全一样,只是把“函数图像”换成了“方程组定义的曲面”。理解切平面为什么是“最佳线性近似”,也就理解了牛顿法为什么能二次收敛。

二是灵敏度分析。f_x 的物理含义是“其他条件不变时,x 每变化一个单位,函数值变化多少”。这不是数学游戏,而是实打实的工程指标:曲面设计中某参数的敏感度、电路里某元件容差对输出的影响、模型里某个输入对预测结果的贡献,本质上都是在读切平面的斜率。切平面把“复杂系统的局部响应”压缩成一组系数,这就是它最大的工程价值。

三是曲面求交与求交加速。射线和曲面求交时,常用切平面做初值估计或者做保守的包围体,因为切平面和曲面的偏差有明确的二阶上界,可以据此判断“这一段距离内曲面不可能跑出某个范围”,从而跳过大量无效计算。

6.3 从切平面到二阶展开的自然延伸

切平面是一阶近似,误差是 ρ 的二阶量。如果对精度有更高要求,就得把二阶项加进来:

$$f(x_0+h, y_0+k) \approx f + f_x h + f_y k + \tfrac{1}{2}\left(f_{xx}h^2 + 2f_{xy}hk + f_{yy}k^2\right)$$

中间那个 2 倍系数来自二元泰勒展开的交叉项,写成矩阵形式就是 $\tfrac{1}{2}(h,k),H,(h,k)^T$,H 是二阶偏导组成的矩阵。这个式子的用处不只是在考试里算近似值,更重要的是它给出了切平面误差的定量估计:切平面的误差约等于上面那个二次型的绝对值。如果你需要知道“在半径 ρ 的邻域内,切平面最多能偏多少”,直接把二次型在约束 h² + k² = ρ² 下的最大值算出来就行,而这个最大值恰好等于 H 的最大特征值绝对值乘以 ρ²/2。

这个结论在实践中的用法很直接:某曲面在 P 点的 H 的最大特征值很大,说明这一带弯曲得厉害,切平面的有效范围就小;特征值接近零,说明这一带几乎是平的,切平面能往外推很远。我一般会把这个量和容差要求一除,开个根号,直接得到“切平面可用的最大半径”,比凭经验估靠谱得多。

还有一点值得注意:可微性保证了切平面存在,但没保证它好用。有些曲面处处可微,但二阶导在某些点附近变得极大(比如靠近某个极值点或者鞍点的肩部),一阶近似的有效性会急剧萎缩。判断一个点适不适合用切平面做近似,光看“可不可微”是不够的,得把二阶量一起看。

最后分享一个我经常用的排查顺序,遇到切平面算错的时候按这个走,基本能定位到问题:先核点是否在曲面上,再核法向量是否归一化后能和程序输出对上,再核平面的系数是否成比例,最后用几个不同方向的小扰动看误差是否真的按 ρ² 收缩。这四步走下来,问题要么已经解决,要么能精准定位到是公式推导错了还是实现写错了,比盲改高效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询