ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

空间曲线切线与法平面:参数式、两曲面交线及叉乘求法

空间曲线切线与法平面:参数式、两曲面交线及叉乘求法 很多人第一次接触空间曲线的切线和法平面心里都觉得这题不难参数方程求个导代进公式就完事了。真到动手的时候才发现卡人的地方从来不是公式本身而是三个更隐蔽的环节——一是搞不清切线和法平面这对搭档到底谁垂直于谁二是曲线不是参数方程给的而是写成两张曲面相交的形式那一堆偏导数往哪儿放三是辛辛苦苦算出来的方向向量分母里出现了 0不知道该怎么落笔。我自己当年在草稿纸上反复画箭头、把法平面的法向量误当成切向量白白绕了大半天。这篇内容就是把这套东西从头捋一遍空间曲线在一点处的切线怎么定、法平面怎么定参数式和两曲面交线式两条路各自的推导逻辑与实操细节外加几道典型题的完整手算过程和自检方法。不管你是正在啃高数下册的学生还是在做机械刀具路径、动画曲线插值的工程同学只要涉及给一条三维曲线求它在某点沿哪个方向走这里面的思路都能直接用。下面我不会只甩公式会把每个公式为什么长这样讲清楚方便你以后忘了还能自己推回来。1. 切线、法平面、切平面、法线先把四样东西的位置摆正1.1 空间曲线在一点处没有法线只有法平面平面上的曲线大家在中学就熟过一点有唯一的切线切线转 90 度有唯一的法线。一升到三维直觉就容易出错。空间曲线在一点处的切线依然唯一方向由切向量决定但垂直于切线的直线在三维里有无穷多条——它们全都躺在同一个平面里。这个平面就是法平面。换个说法法平面是过该点、且与切线垂直的唯一平面。所以空间曲线在一点处的完整信息是一条切线 一张法平面而不是切线 法线。我当年做题时习惯性写法线方程写到一半发现无从下手本质就是把二维的直觉硬套到三维上了。这里有个很好用的记忆法切的东西降一维法的东西升一维。曲面二维对象对应切平面二维 法线一维曲线一维对象对应切线一维 法平面二维。维度上是对称的想通这一点公式就不会再张冠李戴。1.2 一张表把曲线和曲面的切与法对齐把常见情形整理成表做题时对号入座比死记公式靠谱得多。下面这张表里的 X、Y、Z 表示动点坐标小写 x、y、z 表示定点或曲线自身的坐标——这个大小写约定后面还会专门强调。对象给定方式切的方程法的方程关键向量平面曲线y f(x)y − y₀ f′(x₀)(x − x₀)x − x₀ f′(x₀)(y − y₀) 0斜率 f′(x₀)空间曲线参数式 r(t)(X−x₀)/x′₀ (Y−y₀)/y′₀ (Z−z₀)/z′₀x′₀(X−x₀)y′₀(Y−y₀)z′₀(Z−z₀)0T r′(t₀)空间曲线两曲面 F0, G0同上方向用 T同上法向量用 TT ∇F × ∇G曲面F(x,y,z) 0F_x(X−x₀)F_y(Y−y₀)F_z(Z−z₀)0(X−x₀)/F_x (Y−y₀)/F_y (Z−z₀)/F_zn ∇F表格最后两行放在一起看特别容易记住曲面和曲线用的居然是同一个向量只是它一个当法向量用一个当切向量用。曲面上的 ∇F 垂直于曲面所以它是法向量撑起切平面曲线上的 T 沿着曲线所以它是切向量撑起法平面。理清这一层很多公式记混的问题会自然消失。1.3 动点用大写、定点用小写这不是讲究而是防错写切线方程的时候我强烈建议养成一个习惯曲线自身的坐标用小写 x、y、z方程里的流动点用大写 X、Y、Z。原因很实际——切线方程本质上是满足这个比例关系的所有 (X, Y, Z) 构成的集合如果你把动点也写成小写那么在同一个式子里 x 既表示定点横坐标又表示变量抄错一个符号整题就废了。我改卷子时见到的低级错误里这个至少能排进前三。再补一个细节切线的比例式写法 (X−x₀)/A (Y−y₀)/B (Z−z₀)/C 里分母 (A, B, C) 就是方向向量分子是动点减定点。顺序不能反写成 (x₀−X)/A 就等于把方向向量整体反号虽然直线还是那条直线但和标准答案对不上容易在步骤分上吃亏。2. 参数式曲线切向量就是速度向量公式一步到位2.1 割线取极限方向向量为什么恰好是 r′(t₀)先把切线的定义补全后面所有公式都是从这个定义推出来的。设曲线 C 由参数方程 r(t) (x(t), y(t), z(t)) 给出t 在某个区间上连续变化且在 t₀ 处可导。在曲线上取定点 P₀ r(t₀) 和一个邻近点 P r(t₀ h)连接两点的割线方向是 r(t₀h) − r(t₀)。让 h 趋于 0割线绕 P₀ 旋转并趋向一个极限位置这个极限位置就是切线。关键在于分子这一项可以用一阶泰勒展开近似r(t₀h) − r(t₀) ≈ h·r′(t₀)。于是割线方向 ≈ h·r′(t₀)把 h 这个正的或负的标量因子约掉方向上不影响极限方向就是r′(t₀)。这里有个隐含前提r′(t₀) 不能是零向量。如果三个分量导数全为零这个推导就退化成了0 ≈ h·0什么信息都拿不到——这就是后面要专门讲的奇异点问题。物理上这个结论更好理解把 t 看成时间r(t) 就是质点轨迹r′(t₀) 就是瞬时速度向量速度方向天然就是轨迹的切线方向。所以切向量不是求出来的它本来就是曲线的速度。这个视角在实际工程里特别有用比如做机器人末端轨迹规划时速度矢量的方向就是切线方向直接读出来了。2.2 切线方程与法平面方程的落笔格式含分母为零的处理方向向量 T r′(t₀) (x′(t₀), y′(t₀), z′(t₀)) 拿到手两条方程立刻能写。切线是对称式比例方程(X − x₀) / x′(t₀) (Y − y₀) / y′(t₀) (Z − z₀) / z′(t₀)法平面则是过 P₀、以 T 为法向量的平面x′(t₀)(X − x₀) y′(t₀)(Y − y₀) z′(t₀)(Z − z₀) 0注意两者的关系法平面的系数和切线的分母是同一组数。这不是巧合因为法平面垂直于切线切线的方向向量正好就是法平面的法向量。写的时候养成一套方向向量填两个位置的习惯能省掉一半抄错的机会。分母为零是最常被卡住的地方。假设 x′(t₀) 0那么比例式里那一项的分母是 0不能再按分母相等来理解。数学上的约定是分母为 0 表示对应的分子也为 0也就是动点的那个坐标被钉住了写成独立的等式。比如方向向量是 (−1, 0, 1)切线就应该写成(X − x₀) / (−1) (Z − z₀) / 1同时 Y y₀也就是两个比例式 一个独立等式的组合。这个处理在所有曲线切线题里都通用遇到分母为 0 千万别硬除也别随手把那一项丢掉丢掉等于降低了一个约束会把整条直线算错。2.3 热身r(t) (t, t², t³) 在 t 1 处先用一道最干净的例子把流程走一遍。给定 r(t) (t, t², t³)求 t 1 处的切线与法平面。第一步求导r′(t) (1, 2t, 3t²)代入 t 1 得方向向量 T (1, 2, 3)。第二步定位点P₀ r(1) (1, 1, 1)。第三步套公式。切线方程(X − 1)/1 (Y − 1)/2 (Z − 1)/3。法平面方程(X − 1) 2(Y − 1) 3(Z − 1) 0整理成一般式是 X 2Y 3Z − 6 0。这道题还有一种反向验证的做法我个人非常推荐把切线方向 (1, 2, 3) 和法平面的法向量 (1, 2, 3) 对比二者必须平行再把定点 (1, 1, 1) 分别代进切线的两个比例式和法平面方程都必须成立。两个条件同时满足基本可以断定没算错。这套自检花不了 30 秒却能在考场上救回不少分。3. 两曲面交线切线为什么等于两个梯度的叉乘3.1 从切线在两张切平面里推出叉乘公式真实题目里空间曲线往往不是参数式给的而是写成两张曲面相交的形式C: F(x, y, z) 0G(x, y, z) 0这类题的标准解法是算两个梯度的叉乘。公式可以死记但我更建议把它的几何来源想清楚因为推导只用了一句话曲线在 P₀ 的切线必然同时躺在曲面 F 的切平面内和曲面 G 的切平面内。道理很简单曲线整个都在 F 上它的切线方向当然要和 F 相切对 G 同理。曲面 F 在 P₀ 的法向量是 ∇F(P₀)它垂直于 F 的切平面因此也垂直于切平面内任意向量包括曲线的切向量 T。于是 T ⊥ ∇F(P₀)。同理 T ⊥ ∇G(P₀)。一个向量同时垂直于两个向量那它只能平行于这两个向量的叉乘前提是这两个梯度不平行。所以T ∇F(P₀) × ∇G(P₀)这个推导过程比公式本身值钱得多。它顺带解释了两件事第一为什么曲线是两曲面交线时要用叉乘而不是直接求导第二为什么当两个梯度平行时公式会失效——那时候两张曲面在 P₀ 处相切切平面重合曲线在那里就会出现奇异行为。3.2 行列式展开与书写规范叉乘写成行列式最不容易出符号错误T | i j k | | F_x F_y F_z | | G_x G_y G_z |展开得到三个分量第一分量iF_y·G_z − F_z·G_y第二分量j−(F_x·G_z − F_z·G_x)注意这里有个负号第三分量kF_x·G_y − F_y·G_xj 分量前面那个负号是叉乘定义自带的也是丢分重灾区。我的做法是在草稿纸上把行列式完整写出来按圈住第一列求 i、圈住第二列求 j补负号、圈住第三列求 k的顺序算不要凭记忆跳步。所有偏导数都要在定点 P₀ 处取值这一点也容易漏——先算出一般表达式再代点比边求导边代点更安全。3.3 叉乘结果为零向量意味着什么如果算出来 ∇F × ∇G (0, 0, 0)说明两个梯度在 P₀ 处平行也就是两张曲面的切平面重合。这种情况通常出现在两曲面相切的位置交线在那里可能有尖点、自交点或者其他奇异结构不能再用常规公式求切线。遇到这种题要么换一种参数化方式重新审视曲线要么按极限方向去分析。还有一种情况是只有一个分量算出来是 0比如 T (−6, 0, 6)。这是完全正常的说明曲线在 P₀ 处沿 y 方向瞬间没有位移切线平行于 xOz 平面。这时候照常写比例式只是对应分母写 0按 2.2 节的办法处理即可不需要额外担心。4. 不想记叉乘公式把 x 当参数做隐函数求导更稳4.1 方程组求导加克拉默法则两步搞定如果连叉乘公式都懒得背还有一条更笨但更稳的路把曲线看成 y y(x)、z z(x)拿 x 当参数对两个曲面方程同时求导得到一个二元一次方程组。具体做法是对 F(x, y(x), z(x)) 0 和 G(x, y(x), z(x)) 0 分别对 x 求导用链式法则展开F_x F_y·y′ F_z·z′ 0 G_x G_y·y′ G_z·z′ 0把 y′ 和 z′ 当成两个未知数这就是标准的二元一次方程组用克拉默法则直接解。记系数行列式 D F_y·G_z − F_z·G_y那么y′ (F_z·G_x − F_x·G_z) / Dz′ (F_x·G_y − F_y·G_x) / D解出 y′ 和 z′ 之后曲线的切向量就是 (1, y′, z′)。这条路的好处是完全不需要叉乘只需要会求偏导和解二元一次方程组出错概率明显更低尤其是符号容易搞混的同学用克拉默法则一步步来反而更稳。4.2 两条路的结果必然成比例附验算方法把两节的结果摆在一起看会发现 4.1 里的 D 恰好等于 T 的第一个分量而 y′·D T 的第二分量z′·D T 的第三分量。也就是说 (1, y′, z′) T / D两条路算出来的向量只差一个倍数。这个等价关系是极好的自检工具。我平时做题习惯两种方法都走一遍叉乘法先算一遍再用隐函数求导算一遍看看两个方向向量是不是成比例。如果不成比例必定有一处算错了而且用比例关系还能快速定位——通常是某个偏导数抄错号或者克拉默法则的分子写反了顺序。这个交叉验证花的时间不多但能把正确率从大概对提到确定对。另外要注意由于 (1, y′, z′) 天然带着一个 1它在数值上比叉乘结果更标准化。如果只是想快速得到切线方向隐函数求导法其实更省事。叉乘法的优势则在于推导干净、几何意义明确而且适用于任何变量都能当参数的情形。4.3 什么时候拿 x 当参数这条路会翻车隐函数求导法有个硬性前提曲线在 P₀ 附近必须能表示成 y y(x)、z z(x)。这要求曲线在 P₀ 处的切线不能垂直于 x 轴所在的那个方向太极端——具体说就是切向量的第一分量不能为 0。如果 D F_y·G_z − F_z·G_y 0那 (1, y′, z′) 这套写法就失效了分母变成 0得改拿 y 或 z 当参数重新来一遍。举个例子曲线是 x² y² a² 和 z 0 的交线一个在 xOy 平面里的圆在点 (0, a, 0) 处切向量是 (−1, 0, 0) 或者 (1, 0, 0)第一分量不为 0可以拿 x 当参数但在点 (a, 0, 0) 处切向量是 (0, ±1, 0)第一分量是 0这时候拿 x 当参数就挂了得改用 y a·cos θ、x a·sin θ 这类参数化处理。所以我的建议是先用叉乘法或者几何直觉判断一下切向量长什么样再决定用哪种方法算细节。不要一上来就无脑选一种方法遇到退化情形会一头雾水。5. 三道典型题的手算全流程与自检5.1 螺旋线参数式的最标准流程螺旋线是空间曲线里的标准模型参数方程 r(t) (a cos t, a sin t, b t)其中 a 是半径、b 决定螺距。求 t₀ π/4 处的切线与法平面。第一步求导r′(t) (−a sin t, a cos t, b)。代入 t₀ π/4注意 sin(π/4) cos(π/4) √2/2得 T (−√2a/2, √2a/2, b)。定位点 P₀ (√2a/2, √2a/2, bπ/4)。切线方程写成比例式然后把方向向量的公共因子 √2a/2 约掉得到更清爽的形式(X − √2a/2) / (−1) (Y − √2a/2) / 1 (Z − bπ/4) / (√2 b / a)法平面方程−(X − √2a/2) (Y − √2a/2) (√2 b / a)(Z − bπ/4) 0整理后是X − Y − (√2 b / a) Z (√2 b²π) / (4a) 0这里有个特别值得说的点参数 t 与弧长 s 不是一回事。螺旋线的弧长微元 ds √(a² b²) dt 是个常数也就是说 t 和 s 之间是线性关系。如果你改用弧长 s 当参数切向量会变成原来的 1/√(a² b²) 倍方向完全一样切线方程也完全一样。所以参数换不换不影响切线但会影响切向量的长度。做数值计算的时候切成单位切向量往往更舒服因为它只保留方向信息。5.2 圆柱面与平面的交线先参数化再套公式题目曲线 C 是圆柱面 x² y² a² 与平面 y z 的交线求它在点 P₀ (a/√2, a/√2, a/√2) 处的切线与法平面。这类题的通用套路是先想办法参数化。圆柱面 x² y² a² 最自然的参数化是 x a cos t、y a sin t再叠加平面条件 z y a sin t于是得到r(t) (a cos t, a sin t, a sin t)点 P₀ 对应 t π/4因为 cos(π/4) sin(π/4) √2/2。求导得 r′(t) (−a sin t, a cos t, a cos t)代入 t π/4 得 T (−√2a/2, √2a/2, √2a/2)约掉 √2a/2 后方向向量是 (−1, 1, 1)。切线方程(X − a/√2) / (−1) (Y − a/√2) / 1 (Z − a/√2) / 1。法平面方程−(X − a/√2) (Y − a/√2) (Z − a/√2) 0整理得 Y Z − X a/√2。这道题非常适合用叉乘法做交叉验证。取 F x² y² − a²、G y − z则 ∇F (2x, 2y, 0)在 P₀ 处是 (√2a, √2a, 0)∇G (0, 1, −1)。叉乘展开i 分量 (√2a)(−1) − 0·1 −√2aj 分量 −[(√2a)(−1) − 0·0] √2ak 分量 (√2a)(1) − (√2a)(0) √2a。结果 (−√2a, √2a, √2a) 约掉后正是 (−1, 1, 1)和参数化方法完全一致。两种方法对上了这道题就可以放心交卷。顺便说个参数化的小坑同一张圆柱面配不同平面参数化的难易程度差别巨大。如果平面是 x z 而不是 y z参数化就变成 z a cos t结果一样好写但如果平面是 z 2x 3y 这种斜着切的就老老实实代入消元把 z 表达成 t 的函数。总之原则是能凑出 x a cos t、y a sin t 的优先用圆参数凑不出来的考虑用一个坐标当参数做隐函数求导。5.3 球面与平面交线在 (1, −2, 1)叉乘法与隐函数法互验这道题很有代表性曲线 C 是球面 x² y² z² 6 与平面 x y z 0 的交线求它在点 (1, −2, 1) 处的切线与法平面。先验一下点是否在曲线上1 4 1 61 − 2 1 0两边都成立可以放心往下做。用叉乘法。取 F x² y² z² − 6∇F (2x, 2y, 2z)在 P₀ 处是 (2, −4, 2)。取 G x y z∇G (1, 1, 1)。叉乘展开i 分量 (−4)(1) − (2)(1) −6j 分量 −[(2)(1) − (2)(1)] 0k 分量 (2)(1) − (−4)(1) 6。所以 T (−6, 0, 6)约掉公因子 6 得到 (−1, 0, 1)。切线方程里 Y 方向的分母是 0按 2.2 节的约定处理(X − 1) / (−1) (Z − 1) / 1且 Y −2法平面方程−(X − 1) 0·(Y 2) (Z − 1) 0化简即 Z − X 0也就是 X Z。再用隐函数求导法验一遍。D F_y·G_z − F_z·G_y (−4)(1) − (2)(1) −6y′ (F_z·G_x − F_x·G_z)/D (2·1 − 2·1)/(−6) 0z′ (F_x·G_y − F_y·G_x)/D (2·1 − (−4)·1)/(−6) 6/(−6) −1。于是切向量是 (1, 0, −1)和 (−1, 0, 1) 只差一个负号是同一条直线。两条路的结果对上了。最后做一次几何自检切向量 (−1, 0, 1) 应该同时垂直于 ∇F (2, −4, 2) 和 ∇G (1, 1, 1)。点乘 ∇F(−1)(2) 0(−4) 1(2) 0成立点乘 ∇G(−1)(1) 0(1) 1(1) 0成立。再验证法平面的法向量应该等于切向量 (−1, 0, 1)而 Z − X 0 的法向量是 (−1, 0, 1)完全一致。这道题从三个角度互验通过说明整个流程没有问题。6. 真正会翻车的几个地方奇异点、约分、方向取反6.1 导数全为零未必是真的没有切线如果 r′(t₀) (0, 0, 0)公式给出 0 0 0什么信息都没有。这时候有两种可能一种是曲线在该点真的病态比如尖点、自交点另一种只是参数化选得不好几何上曲线光滑得很。区分这两种情况是判断的关键。先看参数化制造的假奇异点。抛物线 y x²、z 0 是光滑的但如果把它写成 r(t) (t³, t⁶, 0)那么在 t 0 处正好落在原点上r′(0) (0, 0, 0)。公式失效了但曲线本身完全正常。判断方法是用割线极限从原点指向 r(t) 的向量是 (t³, t⁶, 0)除以 t³ 得到 (1, t³, 0)让 t → 0 极限方向是 (1, 0, 0)。虽然 t³ 的符号有问题但用 t 的奇偶次幂得当的参数化会更好结论是切线方向沿 x 轴对应抛物线的顶点切线。参数化不唯一糟糕的参数化会凭空制造奇异点这是新手最容易慌的地方。再看真奇异点。曲线 r(t) (t², t³, 0) 在原点处也是 r′(0) 0但它的形状是半立方抛物线y ±x^{3/2}在原点是货真价实的尖点。同样的方法取割线方向从原点指向 r(t) 的向量是 (t², t³, 0)除以 t² 得 (1, t, 0)让 t → 0 极限方向是 (1, 0, 0)。所以极限意义下切线也存在方向沿 x 轴。这说明一个有意思的结论即便导数全为零只要割线方向有唯一极限切线依然可以定义只是不能再用求导公式。那什么时候真的没有极限方向如果割线方向随 t 的趋近路径而变比如曲线在原点附近来回震荡那就不存在切线。这类曲线实际题目里很少出现但知道这个边界可以帮你判断到底是我算错了还是题本身就没有切线。另外如果 ∇F × ∇G 0也说明两曲面在该点相切通常是奇异点的信号。6.2 约分与整理方向向量规范化带来的系数变化方向向量乘任何非零常数代表的还是同一条直线、同一张法平面。所以 (−6, 0, 6)、(−1, 0, 1)、(1, 0, −1) 三者完全等价。既然是等价的为什么还要在意约分因为约分能降低后续计算出错的概率尤其是当方向向量里含有参数 a、b 的时候。比如 (−√2a/2, √2a/2, b) 约掉 √2a/2 变成 (−1, 1, √2b/a)看起来复杂了但它把方向%的信息和尺度的信息分离开了后面比较两个方向向量是否平行时会方便很多。反过来约分也有一个坑约分的时候别把零分量弄丢了。如果方向向量是 (−6, 0, 6)你把前两个分量除以 6 得到 (−1, 0)然后误以为第三分量也一起约掉了就会写出 (−1, 0) 这种二维向量直接把三维问题降成了二维。我自己犯过这个错写完检查时才发现 Y 方向的分母莫名其妙消失了。还有一点法平面方程整理成一般式 Ax By Cz D 0 的时候两边同乘 −1 或者除以公因子都是允许的但要保证最终表达的平面没变。最保险的验证方法是把定点 P₀ 代进去看看是不是还成立。写成 Z X 还是 X − Z 0本质上是一张平面但答案的整洁度差别很大建议统一整理成某一侧全为零的一般式。6.3 已知切向量反推参数常见的逆向题型正向题做熟了会遇到反向的已知曲线 r(t) (t, t², t³)问 t 取什么值时切线平行于平面 x 2y z 4。思路是把平行翻译成代数条件。切线平行于平面等价于切向量垂直于平面的法向量。切向量是 T (1, 2t, 3t²)法向量是 (1, 2, 1)所以条件是1·1 2t·2 3t²·1 0整理成 3t² 4t 1 0解出 t −1 或 t −1/3。代回去验证t −1 时 T (1, −2, 3)点乘 (1, 2, 1) 是 1 − 4 3 0t −1/3 时 T (1, −2/3, 1/3)点乘是 1 − 4/3 1/3 0。都对。如果是切线垂直于平面条件就换成切向量平行于法向量即 (1, 2t, 3t²) λ(1, 2, 1)。这要求第一分量和第三分量给出同一个 λ 是 1但第二分量要求 λ t矛盾所以这个问题的答案是不存在这样的 t。这类解不出来的结论本身也是合法答案别以为自己算错了。我在实际带人的时候发现逆向题的分水岭不在会不会算而在能不能正确翻译几何条件。平行于平面 垂直于法向量垂直于平面 平行于法向量在平面上 切点满足平面方程这三条翻译清楚剩下就是解方程的事。7. 把公式落到代码符号推导与数值验证7.1 用 SymPy 一条龙验证手算结果纸面推导再熟也建议用符号计算工具跑一遍尤其是含参数的题目。下面这段脚本把螺旋线的切线与法平面全部符号化出来改几个参数就能复用到别的题目上import sympy as sp t sp.symbols(t, realTrue) a, b sp.symbols(a b, positiveTrue) # 曲线参数方程 x, y, z a * sp.cos(t), a * sp.sin(t), b * t r sp.Matrix([x, y, z]) # 切向量 T r.diff(t) t0 sp.pi / 4 P0 r.subs(t, t0) T0 sp.simplify(T.subs(t, t0)) print(定点 P0 , P0) print(切向量 T0 , T0) # 法平面方程: T0 . (X - P0) 0 X, Y, Z sp.symbols(X Y Z) normal_plane sp.expand(T0.dot(sp.Matrix([X, Y, Z]) - P0)) print(法平面 , normal_plane, 0)跑出来的 T0 是 Matrix([[-sqrt(2)*a/2, sqrt(2)*a/2, b]])和我手算的完全一致。隐式情形同样可以自动化把两个曲面写成表达式对三个变量求偏导得到梯度再调用.cross()求叉乘。碰到符号特别复杂的题目这种写法几分钟就能拿到答案比在纸上反复检查偏导数快得多。我的使用习惯是手算一遍 代码校对一遍。手算负责把思路理顺、把几何关系想透代码负责揪出符号错误和算术失误。两者一结合正确率提升非常明显。唯一的提醒是别养成先跑代码再补过程的习惯考试和面试里可没有 SymPy 帮你。7.2 只有离散采样点时怎么估切向量工程现场遇到的曲线很多时候不是解析表达式而是一串采样点 (xᵢ, yᵢ, zᵢ)比如从扫描仪、运动捕捉设备或者仿真里导出来的轨迹。这时候没有函数可以求导只能靠数值差分。最简单的做法是一阶前向差分Tᵢ ≈ (P_{i1} − Pᵢ) / h。精度只有一阶噪声比较大的时候方向抖得厉害。更稳的做法是中心差分Tᵢ ≈ (P_{i1} − P_{i−1}) / (2h)中心差分是二阶精度误差小一个量级代价只是多用了一个点。如果采样点之间的参数间隔不均匀比如采样频率不稳那必须先把参数重新按弧长归一化否则差出来的方向会被参数化速度污染。这一点在做运动轨迹分析时特别重要我见过不少人直接用时间间隔去差分结果切向量全乱套问题就出在采样频率不均匀上。步长的选择也有讲究。步长太大切向量会被曲线的弯曲平均掉估计出的方向偏向弦方向而不是真正的切线方向步长太小浮点舍入误差会被放大。经验法则是取 h ~ ε^{1/3}其中 ε 是浮点机器精度双精度下大约是 10⁻⁵ 到 10⁻⁶ 量级。实际调的时候可以取几个不同的 h 跑一遍看结果是否稳定稳定了就说明这个尺度合适。7.3 用正交性做数值自检手算题有定点代入 方向垂直的双重自检数值计算同样有。对于两曲面交线这种场景算出来的切向量 T 应该在数值意义上同时垂直于两个梯度 ∇F 和 ∇G。写代码时可以直接算两个点乘的绝对值如果都接近 0相对于 |T|·|∇F| 的量级说明切向量估计得没问题。对于参数化曲线可以验证切向量与法平面的一致性把定点 P₀ 周围的几个采样点代进法平面方程看看数值是否接近 0。理论上法平面只经过 P₀但如果你用二阶泰勒展开点比如 P₀ ± δ·T代入残差应该是 O(δ²) 量级这也可以用来间接验证切向量的准确性。最后再分享一个我踩过的坑。有一次做曲面交线的刀具路径我用叉乘法算出的切向量方向是对的但中间某一步算梯度时用的是近似解析式而不是精确表达式导致切向量整体偏了几度。肉眼完全看不出来但插补出来的路径有明显抖动。后来加了一道正交性残差检查把阈值设在 10⁻⁶问题立刻暴露出来。几何类代码的调试靠肉眼观察远不如靠一个数学恒等式来得可靠这一点值得记住。
返回列表