
简介本资源是MTH008多元微积分课程的系统性学习笔记面向高校数学、物理、工程类本科生及自学进阶者专为应对期末考试与夯实高维微积分基础而整理。笔记覆盖教材前12章核心内容涵盖空间曲面与曲线如球面、圆柱螺线、向量运算正交性、方向角、投影、平面与直线方程、参数曲线弧长计算等重点模块关键定义与定理以红色标注便于考前高效聚焦每部分均配典型例题强化从概念理解到解题应用的转化能力。资源为单个PDF文件大小29.24MB排版清晰、公式完整虽全文英文书写但术语规范、逻辑连贯中文授课学生可先掌握基础知识后对照提升专业英语表达与解题思维。目前已有260人学习下载适合时间紧张的备考者快速抓重点也适合作为中文教材的有力补充与习题训练拓展材料。1. 这不是“高数二”的复习提纲而是工程实践中反复调参失败后我重写的多元微积分认知框架你有没有遇到过在做三维点云配准时雅可比矩阵算出来方向全反训练一个带空间约束的损失函数梯度爆炸却查不出是偏导链哪里断了甚至只是想给一个曲面加个法向量可视化结果法向量全指向内部——这些都不是代码写错了是多元微积分的直觉没立住。MTH008 多元微积分 笔记知识点例题不是为考试默写公式准备的它是我在某跨平台系统开发中连续三次因方向导数符号、变量依赖路径、隐函数求导链断裂导致模型收敛异常后把课本定义全部拉回物理意义和几何操作重新推演的实战记录。它面向的是正在调试坐标变换、实现物理仿真、构建几何约束优化器或处理多维传感器融合的工程师——你需要的不是“∂f/∂x 的定义”而是“当我把 f(x,y,z) 输入到 CUDA kernel 里做局部线性化时哪一阶偏导该用中心差分、哪一阶必须解析求导、哪一阶根本不能求”。笔记里所有例题都来自真实调试场景从旋转矩阵对欧拉角的导数到热传导方程在非正交网格上的梯度离散误差分析再到机器人末端执行器位姿误差对关节角的敏感度建模。如果你还在用单变量思维硬套多元问题这篇笔记就是你的后悔药。2. 从单变量到多元为什么“先对 x 求导再对 y 求导”不等于“先对 y 再对 x”——变量依赖结构决定一切2.1 不是数学家在较真是你的坐标系在说谎很多工程师翻车的第一步是把所有变量默认当成独立变量。但现实中x、y、z 很少真正独立——它们可能被同一个参数 t 驱动如机械臂轨迹可能通过隐式方程耦合如刚体约束 g(x,y,z)0也可能在不同坐标系下存在嵌套映射如世界坐标 → 相机坐标 → 像素坐标。此时“∂²f/∂x∂y” 和 “∂²f/∂y∂x” 是否相等不再只取决于函数是否光滑而取决于你求导时冻结了哪些变量、释放了哪些变量。举个典型例子某图像处理Demo 中需计算像素灰度 f(u,v) 对相机外参 R 的梯度其中 u π(R·P)v π(R·P)π 是投影函数。这里 u,v 显式依赖 R但 P 是世界点坐标在优化时可能也被更新。若你直接写 ∂f/∂R就忽略了 P 与 R 的耦合路径。正确做法是展开全微分df (∂f/∂u)·du (∂f/∂v)·dv du (∂π/∂(R·P)) · (dR·P R·dP)看到没dR 和 dP 是并行扰动不是先后顺序。所谓“混合偏导可交换”只在你固定所有其他变量、仅沿单一坐标轴扰动时才成立。工程中绝大多数场景变量是成组释放的。提示当你发现数值梯度finite difference和解析梯度symbolic derivative对不上90% 的概率是你没画出完整的变量依赖图dependency graph。不要急着改代码先手绘节点变量和有向边谁依赖谁标出哪些边在当前求导路径中是“激活”的。2.2 雅可比矩阵不是数学装饰是局部线性化的操作手册雅可比矩阵 J [∂f_i/∂x_j] 的本质是告诉你当输入 x 在某点 x₀ 发生微小变化 Δx 时输出 f(x) 如何近似变化Δf ≈ J(x₀)·Δx。但关键来了——J 的形状和物理意义完全由你定义的输入输出维度决定。常见错误配置把三维点 P ∈ ℝ³ 映射到其在图像上的齐次坐标 p [u,v,1]ᵀ ∈ ℝ³却用 3×3 雅可比忘了 p 是齐次表示实际自由度只有 2对旋转矩阵 R ∈ SO(3) 求导直接对 3×3 矩阵元素求偏导结果得到 9×3 矩阵但 SO(3) 只有 3 个自由度正确做法是对李代数 so(3) 上的旋转向量 ω 求导得 2×3 或 3×3 雅可比取决于输出维度。下面这段 Python 代码演示如何为一个典型视觉重投影误差构建正确的雅可比import numpy as np def reprojection_error_jacobian(R, t, K, P_world): 计算重投影误差 e p_observed - pi(R P_world t) 对旋转向量 omega 的雅可比 输入: R (3x3), t (3,), K (3x3), P_world (3,) 输出: J (2x3), 即 de/domega # 将 R 转为旋转向量 omega (使用 scipy.spatial.transform.Rotation 或自实现) from scipy.spatial.transform import Rotation r Rotation.from_matrix(R) omega r.as_rotvec() # shape (3,) # 正向投影世界点 → 像素 P_cam R P_world t p_homo K P_cam # 齐次像素坐标 p p_homo[:2] / p_homo[2] # 归一化 # 解析求导使用李代数扰动模型 # δR ≈ I [δω]_×, 所以 δP_cam [δω]_× (R P_world) # 则 δp ∂pi/∂P_cam δP_cam ∂pi/∂P_cam [δω]_× (R P_world) # 其中 ∂pi/∂P_cam 是 2x3 投影雅可比K 的前两行经深度归一化 depth P_cam[2] J_proj np.array([ [K[0,0]/depth, 0, -K[0,0]*P_cam[0]/(depth**2)], [0, K[1,1]/depth, -K[1,1]*P_cam[1]/(depth**2)] ]) # 2x3 # [δω]_× (R P_world) 是 3x3 × 3x1 → 3x1可写为 skew(P_cam) δω # skew(a) [[0,-a2,a1], [a2,0,-a0], [-a1,a0,0]] a P_cam skew_a np.array([ [0, -a[2], a[1]], [a[2], 0, -a[0]], [-a[1], a[0], 0] ]) # 3x3 # 所以 δp J_proj skew_a δω → J J_proj skew_a (2x3) J J_proj skew_a return J # 示例调用 R np.array([[0.9, -0.1, 0.4], [0.1, 0.9, -0.2], [-0.4, 0.2, 0.8]]) t np.array([1.0, 0.5, 3.0]) K np.array([[500, 0, 320], [0, 500, 240], [0, 0, 1]]) P_w np.array([0.5, -0.3, 2.0]) J reprojection_error_jacobian(R, t, K, P_w) print(Reprojection Jacobian (2x3):) print(J)参数说明J_proj是标准针孔相机模型下像素坐标对相机坐标系下三维点的导数它考虑了深度项的非线性缩放skew_a将旋转向量扰动 δω 映射为三维点扰动 δP_cam这是 SO(3) 李代数扰动的核心最终J是 2×3意味着每个像素误差分量u/v对三个旋转自由度ωₓ/ω_y/ω_z的敏感度——这正是优化器如 Levenberg-Marquardt真正需要的输入。如果你跳过这一步直接对 R 的 9 个元素求导得到的雅可比不仅维度错乱还会在优化中引入病态ill-conditioned问题因为 R 的 9 个元素受 6 个正交约束限制。3. 方向导数与梯度为什么“最大变化率方向”在你的坐标系里可能根本不存在3.1 梯度不是箭头是“变化率的协变向量”教科书说“梯度指向函数增长最快的方向”但这句话有个致命前提你使用的度量metric是欧氏度量。一旦你的变量空间自带非平凡度量比如球面坐标下的角度、机器人关节空间的扭矩权重、或图像像素的各向异性采样梯度就必须用该度量进行“抬升”raising index否则它给出的方向在物理上毫无意义。例如在某机器人控制项目中我们定义关节空间代价函数 C(q₁,q₂,q₃)其中 q₁ 是肩部旋转单位radq₂ 是肘部平移单位mmq₃ 是腕部旋转单位deg。若直接计算 ∇C [∂C/∂q₁, ∂C/∂q₂, ∂C/∂q₃]你会发现由于单位不同rad vs mm vs deg三个分量量纲不一致无法直接比较大小。更严重的是1° 的腕部转动和 1 mm 的肘部平移对机械臂末端的影响完全不同但梯度值会强行让它们“平等竞争”。解决方案引入度量张量 G定义加权梯度 ∇_G C G⁻¹ ∇C。G 的对角线元素是各维度的“尺度因子平方”若希望 q₁ 和 q₃ 都按角度统一则 G₁₁ 1, G₃₃ (π/180)²将 deg 转为 rad若希望 q₂ 的 mm 位移与角度变化影响相当设 G₂₂ (r_eff)²其中 r_eff 是肘部平移对末端位置的等效半径单位 mm/rad。def weighted_gradient(C_func, q, G_inv): 计算加权梯度 ∇_G C G^{-1} ∇C C_func: callable, input q (3,), output scalar q: current joint configuration (3,) G_inv: inverse metric tensor (3x3), precomputed # 数值梯度中心差分 eps 1e-6 grad np.zeros(3) for i in range(3): q_plus q.copy() q_minus q.copy() q_plus[i] eps q_minus[i] - eps grad[i] (C_func(q_plus) - C_func(q_minus)) / (2 * eps) # 加权 weighted_grad G_inv grad return weighted_grad # 示例设定 G_inv假设已根据机械臂动力学标定 G_inv np.diag([1.0, 0.01, (180/np.pi)**2]) # 统一为 rad 单位 q0 np.array([0.5, 10.0, 30.0]) # q1(rad), q2(mm), q3(deg) # 定义一个虚拟代价函数末端到目标点距离平方 def C_cost(q): # 简化假设正向运动学为线性近似 # 实际项目中此处为完整 FK 函数 x_end 2*q[0] 0.1*q[1] 0.05*q[2]*(np.pi/180) # mm y_end 1*q[0] 0.05*q[1] 0.1*q[2]*(np.pi/180) target np.array([100.0, 80.0]) # mm err np.array([x_end, y_end]) - target return np.sum(err**2) wg weighted_gradient(C_cost, q0, G_inv) print(Weighted gradient (in rad-equivalent space):, wg)逻辑说明G_inv是手动设定的逆度量它把不同物理量纲的梯度分量“拉到同一可比尺度”weighted_gradient先用中心差分算出原始梯度避免符号微分库依赖再左乘G_inv输出wg的三个分量现在具有相同物理意义单位 rad 的等效变化率可直接送入梯度下降或 PID 控制器。注意很多开源优化库如 SciPy 的minimize默认使用欧氏度量。如果你不显式传入jac雅可比或重写目标函数它内部的线搜索和 Hessian 近似都会出错。这不是 bug是设计使然——它假设你已将问题预处理到“度量友好”的形式。3.2 方向导数别再用单位向量点乘梯度了先确认你的“方向”在哪个流形上方向导数 D_u f ∇f · u 的公式要求 u 是定义在同一内积空间中的单位向量。但在工程中“方向”往往不在欧氏空间里你想让机械臂沿“末端 TCP 的 x 轴方向”移动但这个方向在关节空间中是一条曲线不是直线你想让点云法向量“朝向光源”但光源方向在球面坐标中是 (θ,φ)不是 ℝ³ 中的向量你想让图像梯度“沿边缘切线”但边缘是亚像素级的隐式曲线。此时D_u f 的正确计算方式是先将方向 u 提升为流形上的切向量再与梯度作为余切向量配对。对于嵌入 ℝⁿ 的子流形 M切向量 v ∈ T_pM 可表示为 v J_φ(ξ)其中 φ 是局部参数化ξ 是参数空间中的方向J_φ 是 φ 的雅可比。例如在球面 S² 上点 p (x,y,z) 满足 x²y²z²1。给定一个“地理方向”——朝北-∂/∂θ和朝东∂/∂φ它们在 ℝ³ 中的切向量为北v_north [-sinθ cosφ, -sinθ sinφ, -cosθ]ᵀ东v_east [-sinφ, cosφ, 0]ᵀ则 f 在 p 点沿北方向的方向导数为 ∇f(p) · v_north注意∇f(p) 是 ℝ³ 中的梯度v_north 是 S² 在 p 点的切向量二者点乘合法。def spherical_directional_derivative(f_func, p, directionnorth): Compute directional derivative of f on sphere S^2 at point p p: 3D unit vector (x,y,z) direction: north, east, or custom unit tangent vector (3,) # Ensure p is unit p p / np.linalg.norm(p) # Compute gradient in R^3 using finite diff eps 1e-6 grad np.zeros(3) for i in range(3): p_plus p.copy() p_minus p.copy() p_plus[i] eps p_minus[i] - eps p_plus / np.linalg.norm(p_plus) # project back to sphere p_minus / np.linalg.norm(p_minus) grad[i] (f_func(p_plus) - f_func(p_minus)) / (2 * eps) # Get tangent vector if isinstance(direction, str): # Convert p to spherical coords: p [sinθ cosφ, sinθ sinφ, cosθ] x, y, z p θ np.arccos(z) # 0 θ π φ np.arctan2(y, x) # -π φ π if direction north: # -∂/∂θ direction in R^3 v np.array([ -np.cos(θ) * np.cos(φ), -np.cos(θ) * np.sin(φ), np.sin(θ) ]) elif direction east: # ∂/∂φ direction in R^3 v np.array([ -np.sin(θ) * np.sin(φ), np.sin(θ) * np.cos(φ), 0 ]) else: raise ValueError(Unknown direction) else: v direction # assume already tangent and unit # Normalize v to unit (numerical safety) v v / np.linalg.norm(v) return np.dot(grad, v) # Example: f(p) z (height function on sphere) def f_height(p): return p[2] p_eq np.array([1.0, 0.0, 0.0]) # equator point dn spherical_directional_derivative(f_height, p_eq, north) de spherical_directional_derivative(f_height, p_eq, east) print(fNorth directional derivative at equator: {dn:.6f}) # should be ~1.0 print(fEast directional derivative at equator: {de:.6f}) # should be 0.0参数说明f_func必须接受单位向量p并在数值扰动后显式投影回球面否则梯度计算失效v是严格定义在球面切空间中的向量不是任意 ℝ³ 向量输出dn在赤道点应接近 1向北走z 坐标增加最快de应接近 0向东走z 不变验证了实现正确性。4. 隐函数定理与约束梯度当你的优化变量被方程死死捆住时怎么求导4.1 不要解出显式表达式用隐函数定理直接求约束梯度很多工程师面对约束优化如 g(x,y,z)0的第一反应是把 z 解成 zh(x,y)再代入目标函数 f(x,y,z) → f̃(x,y)。这在解析可行时没问题但现实中g 可能是高次多项式无解析解g 可能是数值函数如有限元求解器返回的应力平衡无法手工求逆解出 h 后h 的导数可能病态如在奇点附近斜率无穷大。隐函数定理给出更鲁棒的路径若 ∂g/∂z ≠ 0则在局部有 ∂z/∂x −(∂g/∂x)/(∂g/∂z)∂z/∂y −(∂g/∂y)/(∂g/∂z)。于是目标函数 f 对自由变量 x,y 的梯度为∂f/∂x ∂f/∂x (∂f/∂z)(∂z/∂x) ∂f/∂x − (∂f/∂z)(∂g/∂x)/(∂g/∂z)∂f/∂y ∂f/∂y − (∂f/∂z)(∂g/∂y)/(∂g/∂z)这本质上是将约束梯度 ∇g 投影掉只保留与约束正交的方向。def constrained_gradient(f_func, g_func, x, y, z, eps1e-6): Compute gradient of f subject to g(x,y,z)0, treating x,y as free variables Uses implicit function theorem: dz/dx -g_x/g_z, dz/dy -g_y/g_z Returns: [df/dx, df/dy] at (x,y,z) # Compute partials of f and g via central difference def partial_f(var_idx): h np.zeros(3) h[var_idx] eps return (f_func(xh[0], yh[1], zh[2]) - f_func(x-h[0], y-h[1], z-h[2])) / (2*eps) def partial_g(var_idx): h np.zeros(3) h[var_idx] eps return (g_func(xh[0], yh[1], zh[2]) - g_func(x-h[0], y-h[1], z-h[2])) / (2*eps) fx, fy, fz partial_f(0), partial_f(1), partial_f(2) gx, gy, gz partial_g(0), partial_g(1), partial_g(2) # Check if g_z is zero (singular point) if abs(gz) 1e-10: raise ValueError(g_z ≈ 0: implicit function theorem not applicable at this point) # Apply implicit differentiation df_dx fx - fz * gx / gz df_dy fy - fz * gy / gz return np.array([df_dx, df_dy]) # Example: minimize distance to origin subject to x^2 y^2 - z^2 1 (hyperboloid) def f_dist(x, y, z): return x**2 y**2 z**2 # squared distance def g_hyperb(x, y, z): return x**2 y**2 - z**2 - 1 # At point (1,0,0) on hyperboloid: g10-0-10 ✓ grad_constr constrained_gradient(f_dist, g_hyperb, 1.0, 0.0, 0.0) print(Constrained gradient [df/dx, df/dy] at (1,0,0):, grad_constr) # Expected: at (1,0,0), the surface normal is (2,0,0), so constraint gradient should be (2,0) # But fs gradient is (2,0,0), and since g_z0? Wait — g_z -2z 0 at z0 → singular! # So pick a non-singular point, e.g., (1,0,1): g10-1-1-1 → no, adjust: (sqrt(2),0,1): 20-1-10 ✓ grad_constr2 constrained_gradient(f_dist, g_hyperb, np.sqrt(2), 0.0, 1.0) print(At (sqrt(2),0,1):, grad_constr2)逻辑说明函数constrained_gradient不要求你知道 z 关于 x,y 的显式关系只要求你在给定点处能数值计算 f 和 g 的偏导关键检查gz ! 0这是隐函数定理生效的充要条件对应约束曲面非垂直即 z 方向有足够变化输出是二维梯度可直接用于scipy.optimize.minimize的jac参数配合constraints[{type: eq, fun: g_func}]。4.2 约束雅可比当有多个约束时别用拉格朗日乘子硬凑多个约束 g₁0, g₂0,...,gₘ0 时拉格朗日法引入 m 个乘子 λᵢ目标变为 min L f Σλᵢgᵢ。但数值优化中λᵢ 是额外未知数增大问题规模且 λᵢ 的初值敏感常导致收敛失败。更工程的做法是构造约束雅可比 J_g ∈ ℝ^(m×n)然后求 f 的梯度在 J_g 的零空间上的投影。即∇_constr f (I − J_g⁺ J_g) ∇f其中 J_g⁺ 是 J_g 的伪逆可用np.linalg.pinv。def multi_constraint_gradient(f_func, g_funcs, x_vec, eps1e-6): Gradient of f subject to multiple equality constraints g_i(x)0 x_vec: current point (n,) g_funcs: list of m callables, each takes x_vec and returns scalar Returns: projected gradient in nullspace of J_g (n,) n len(x_vec) m len(g_funcs) # Compute gradient of f grad_f np.zeros(n) for i in range(n): x_plus x_vec.copy() x_minus x_vec.copy() x_plus[i] eps x_minus[i] - eps grad_f[i] (f_func(x_plus) - f_func(x_minus)) / (2 * eps) # Compute constraint Jacobian J_g (m x n) J_g np.zeros((m, n)) for i, g in enumerate(g_funcs): for j in range(n): x_plus x_vec.copy() x_minus x_vec.copy() x_plus[j] eps x_minus[j] - eps J_g[i, j] (g(x_plus) - g(x_minus)) / (2 * eps) # Project grad_f onto nullspace of J_g # If J_g is full rank, nullspace projector I - J_g.T (J_g J_g.T)^{-1} J_g # Use pseudo-inverse for robustness J_g_pinv np.linalg.pinv(J_g) # n x m projector np.eye(n) - J_g_pinv J_g # n x n grad_constr projector grad_f return grad_constr # Example: minimize x^2y^2z^2 subject to xyz0 and x^2y^21 def f_sphere(x): return x[0]**2 x[1]**2 x[2]**2 def g1_sum(x): return x[0] x[1] x[2] def g2_circle(x): return x[0]**2 x[1]**2 - 1 x0 np.array([1.0/np.sqrt(2), -1.0/np.sqrt(2), 0.0]) # satisfies both constraints grad_multi multi_constraint_gradient(f_sphere, [g1_sum, g2_circle], x0) print(Multi-constraint gradient at feasible point:, grad_multi)参数说明g_funcs是约束函数列表每个函数必须接受x_vec并返回标量J_g_pinv使用np.linalg.pinv而非np.linalg.inv以处理秩亏rank-deficient约束如两个约束线性相关projector是正交投影矩阵确保grad_constr与所有约束梯度正交即沿约束流形的切方向此梯度可直接用于无约束优化器如 BFGS无需修改目标函数。5. 常见问题排查那些让你调试三天却只改了一行代码的玄学翻车现场5.1 现象数值梯度和解析梯度差 10⁶ 倍但函数本身很光滑原因你用了np.gradient或scipy.misc.derivative它们默认在均匀网格上差分而你的变量空间是非均匀的如对数尺度的超参、球面坐标的极角。例如在 θ ∈ [0,π] 上用np.gradient(f_theta, theta)若theta是等间隔采样但 f 对 θ 的敏感度在 θ→0 时爆炸如 sinθ 在 0 附近导数为 1但数值差分步长 Δθ 固定导致相对误差放大。解决永远用中心差分并显式传入变量步长dx对非欧氏空间先将变量映射到线性空间再差分。例如对球面坐标用 φ 和 log(tan(θ/2))即球极平面投影作为新变量。5.2 现象雅可比矩阵奇异det(J)0优化器报“SVD did not converge”原因不是数学问题是变量冗余。典型场景用四元数 q[q₀,q₁,q₂,q₃] 表示旋转但约束 q₀²q₁²q₂²q₃²1 未被显式处理导致 J 的 4 列线性相关。或者在三角网格参数化中用顶点坐标作为变量但网格拓扑固定实际自由度远小于顶点数。解决对四元数改用 3D 旋转向量 ω对网格用主成分PCA降维后的系数作为变量通用法对 J 做 SVD取前 r 个非零奇异值对应的右奇异向量构成降维基底。5.3 现象方向导数在某点突然变号但函数看起来很平滑原因你计算方向向量 u 时没确保 u 是单位向量且与梯度在同一坐标系。例如用u [1,0,0]表示“x 方向”但在相机坐标系中x 轴实际是世界坐标系的某个旋转你却在世界坐标系下算梯度。更隐蔽的是u 的范数不是 1点乘后被放大/缩小。解决每一步都u u / np.linalg.norm(u)梯度和 u 必须同属一个坐标系用变换矩阵 R 显式对齐。5.4 现象隐函数定理求出的 ∂z/∂x 在 z0 处爆炸但物理上该点很稳定原因∂g/∂z 0是数学奇点但物理约束可能在此处有更高阶行为。例如gz²−x²−y²0圆锥在 (0,0,0) 处 g_z0但圆锥有两条分支。此时应切换到参数化用 xr cosφ, yr sinφ, z±r。解决检测|g_z| threshold时自动切换到另一变量作为因变量如用 ∂x/∂z −g_z/g_x或改用参数化形式。5.5 现象约束梯度优化收敛到一个点但该点明显不满足约束g≠0原因你只提供了jac梯度但没提供constraints的jac约束雅可比。优化器如 SLSQP在每次迭代中需要约束雅可比来更新拉格朗日乘子。若未提供它用数值差分估计精度不足导致约束违反累积。解决对每个约束 g_i必须提供其雅可比jac_gi或至少提供jac2-point让优化器用二点差分比默认的三点更稳。6. 进阶技巧用微分几何视角重写你的自动微分流程——告别“黑匣子”掌控每一阶导数6.1 别再把 autograd 当魔法盒理解它在做什么才能修它现代自动微分AD工具如 PyTorch 的torch.autograd、JAX 的grad本质是反向模式链式法则的编译器。它把函数 f(x) 编译成计算图每个节点是基本运算, *, sin, exp...每条边是变量依赖。反向传播时它从输出开始按拓扑序乘上局部导数Jacobian-vector product。但关键点在于AD 默认假设所有变量在 ℝⁿ 中且度量是欧氏的。这意味着如果你用torch.tensor存储四元数 qAD 会把它当 4D 向量对 q 的 4 个分量求导但实际自由度是 3如果你用jnp.array存储球面坐标 (θ,φ)AD 会计算 ∂f/∂θ 和 ∂f/∂φ但这两个导数的物理权重不同φ 方向的弧长是 sinθ dφθ 方向是 dθAD 不知道如果你用tf.Variable存储旋转矩阵 RAD 会对 R 的 9 个元素求导但 R 受 6 个正交约束导数空间是病态的。所以真正的进阶不是“怎么用 AD”而是“怎么告诉 AD我的变量在哪个流形上它的切空间基是什么”。6.2 三步法为任意流形定制你的 AD 流程第一步定义流形嵌入 ℝⁿ 的映射 φ: M → ℝⁿ例如SO(3) 的嵌入是φ(ω) exp_so3(ω)指数映射球面 S² 的嵌入是φ(θ,φ) [sinθ cosφ, sinθ sinφ, cosθ]。第二步实现 φ 的雅可比 J_φ: T_pM → ℝⁿ即计算 ∂φ/∂parameters。这是你唯一需要手动本文还有配套的精品资源点击获取