尧图精选

二元函数泰勒展开:混合偏导、海森矩阵与工程应用

🕒 发布时间:2026/10/1 9:03:20 📁 来源:尧图网络
很多人在一元微积分里把泰勒公式背得滚瓜烂熟一到二元函数就卡壳——公式长得像但莫名多出个系数 2三阶往上更是一堆项分不清谁乘谁。这篇就专门聊二元函数的泰勒展开它是怎么推出来的、系数为什么长这样、手算怎么不丢项、误差怎么估、代码怎么验以及在误差传播、灵敏度分析、优化迭代这些真实场景里它到底顶什么用。适合正在学多元微积分的学生也适合做实验数据处理、参数标定、代理模型拟合的工程师——只要你的模型里有两个以上自变量这套东西迟早要用上。我尽量少写定理-证明-习题那套多写我在实际用的时候踩过的东西。1. 从一元公式跨到二元先搞清楚多出来的那几项一元泰勒公式的直觉很好建立用一条曲线在某点的切线去贴合曲线贴合不住就加二次项再不行加三次项。二元函数面对的是空间曲面切的对象从一个点变成一张平面再往上就是一个二次曲面、三次曲面。物理图像清楚了剩下的难点全在项数和系数上。1.1 一元公式照搬会出什么事先做个最容易踩的实验。设 $f(x,y)$ 在 $(x_0,y_0)$ 处可微有人会这样写$$ f(x_0h,,y_0k)\approx f(x_0,y_0)f_x(x_0,y_0)hf_y(x_0,y_0)k $$这一步没问题这就是全微分给出的线性近似几何上是用切平面代替曲面。问题出在往上加项的时候。有人会顺着一元二阶项是 $\tfrac12 f(x_0)h^2$的印象直接写$$ \frac{1}{2}f_{xx}h^2\frac{1}{2}f_{yy}k^2 $$漏掉了 $f_{xy}hk$ 这一项。这是最常见的错误没有之一。原因很直观当 $x$ 和 $y$ 同时变化时$f$ 对 $x$ 的敏感度本身也在随 $y$ 变这个敏感度的变化就体现在混合偏导 $f_{xy}$ 上。上面那个式子相当于假设 $x$ 方向和 $y$ 方向互不干扰也就是假设曲面在这个点附近可以拆成两个一维函数相加——这几乎永远不成立。举个能立刻算出来的例子。取 $f(x,y)xy$在 $(0,0)$ 点。真值 $f(h,k)hk$。线性近似给出 $0$误差是 $hk$是二阶量这没错。如果按上面那个漏项公式二阶项是 $\tfrac12 f_{xx}h^2\tfrac12 f_{yy}k^2 0$二阶近似依然是 $0$而正确值 $hk$ 是实打实的二阶量。误差从二阶掉不下来了等于这一阶白做。1.2 交叉项系数 2 的来历多项式定理不是拼凑$2hk$ 里的这个 2 不是习惯写法它是二项式系数算出来的。把偏导算子当成一个整体$$ \left(h\frac{\partial}{\partial x}k\frac{\partial}{\partial y}\right)^2 h^2\frac{\partial^2}{\partial x^2}2hk\frac{\partial^2}{\partial x\partial y}k^2\frac{\partial^2}{\partial y^2} $$跟 $(ab)^2a^22abb^2$ 是同一个展开只不过 $a,b$ 换成了两个微分算子。那个 2 就是 $\binom{2}{1}2$本质原因是先对 $x$ 后对 $y$和先对 $y$ 后对 $x$在展开时会各出现一次而两者相等克莱罗定理要求二阶混合偏导连续所以合并成一项。这个观察有个很实用的推论三阶项有 4 项系数是 $1,3,3,1$四阶有 5 项系数是 $1,4,6,4,1$。完全就是杨辉三角那一行。你不需要记公式只要记住$n$ 阶项是 $(h\partial_xk\partial_y)^n$ 展开系数自己就出来了。提示写高阶展开的时候先写算子形式再逐项展开是防丢项最有效的方法。直接凭记忆背二阶、三阶展开式的人几乎都会在四阶崩掉。顺带说一句易混淆的地方$h\partial_x$ 里的 $\partial_x$只能作用于 $f$$h$ 和 $k$ 是常数增量不参与求导。有人第一次看到 $(h\partial_xk\partial_y)^n f$ 会下意识想对 $h$ 求导那就完全跑偏了。2. 把公式压缩成一行算子写法与阶数记账整套公式其实只有一行但这一行里藏着展开点、增量、阶数、余项四个信息值得拆开讲透。搞懂了记账规则多变量、多阶数的展开就是个体力活。2.1 $(h\partial_xk\partial_y)^n$ 的展开规则在 $(x_0,y_0)$ 处展开记 $hx-x_0$$ky-y_0$那么$$ f(x_0h,,y_0k)\sum_{n0}^{\infty}\frac{1}{n!}\left(h\frac{\partial}{\partial x}k\frac{\partial}{\partial y}\right)^n f,\Big|_{(x_0,y_0)} $$把算子幂展开成 $\sum_{j0}^{n}\binom{n}{j}h^jk^{,n-j}\dfrac{\partial^n}{\partial x^j\partial y^{n-j}}$就得到最实用的实用形式$$ f(x_0h,y_0k)\sum_{n0}^{N}\frac{1}{n!}\sum_{j0}^{n}\binom{n}{j}h^{j}k^{,n-j},f^{(j,,n-j)}(x_0,y_0)R_N $$其中 $f^{(j,n-j)}$ 表示对 $x$ 求 $j$ 阶、对 $y$ 求 $n-j$ 阶的混合偏导。这三行合起来把全部规则说完了剩下的是记账。我把记账规则整理成一张表写代码和手算的时候对着看阶数 $n$项数系数序列写出来长什么样011$f$121, 1$h f_x k f_y$231, 2, 1$h^2f_{xx}2hkf_{xy}k^2f_{yy}$341, 3, 3, 1$h^3f_{xxx}3h^2kf_{xxy}3hk^2f_{xyy}k^3f_{yyy}$451, 4, 6, 4, 1$h^4f_{4,0}4h^3kf_{3,1}6h^2k^2f_{2,2}4hk^3f_{1,3}k^4f_{0,4}$表格里的内容别忘了最前面还有 $\tfrac{1}{n!}$ 这个因子。很多人只记得 $\tfrac{1}{2!}$、$\tfrac{1}{3!}$写四阶的时候犹豫是不是除以 4!——是的就是 4!即 24。2.2 阶数记账的实操检查法手算展开最容易出问题的地方不是求导而是合并同类项。 $h^2k$ 和 $hk^2$ 是两个不同的项不能合并但 $\binom{3}{1}3$ 和 $\binom{3}{2}3$ 这两个系数数值相等会让一些人在核验时以为重复计算了。我自己的核验习惯是数总次数把每一项 $h^jk^{n-j}$ 的指数加起来必须恰好等于当前阶数 $n$。这个检查一步就能抓出大部分错误。写完之后从头到尾扫一遍但凡有一项 $\deg$ 不等于 $n$立刻回头找。第二个习惯是对展开点的取值做核对。所有偏导都是在 $(x_0,y_0)$ 处取值的不是函数值代入之后再求导。有些人在这一步图省事直接把 $xx_0h$ 代进原函数再做展开结果得到了一个恒等式——形式上是精确的实际上什么也没展开因为每一项里都还挂着 $h$ 和 $k$。注意如果展开点是原点 $(0,0)$那么 $hx$、$ky$写法上会变简单但原理没有变。不要因为形式简单就跳过这是在展开点处取值这一步。2.3 余项佩亚诺和拉格朗日该挑哪个阶数截断就得知道误差。两种余项各有各的用场佩亚诺余项$R_No(\rho^N)$其中 $\rho\sqrt{h^2k^2}$。它只说比 $\rho^N$ 更高阶给不出具体数值但用来做极限计算、判断局部性质非常顺手。求多元极限、证明极值判别法的时候都用它。拉格朗日余项$R_N\dfrac{1}{(N1)!}\left(h\partial_xk\partial_y\right)^{N1}f(\xi,\eta)$其中 $(\xi,\eta)$ 是展开点与目标点连线上的某个点可以写成 $(x_0\theta h,,y_0\theta k)$$\theta\in(0,1)$。它能给出误差上界做数值估算是必须用这个。工程上做误差预算我用拉格朗日形式的思路先估计各种偏导在邻域内的上界 $M$然后$$ |R_N|\le\frac{M}{(N1)!}\left(|h||k|\right)^{N1} $$这里的 $(|h||k|)^{N1}$ 是把算子展开后的每一项都取绝对值、用三角不等式放缩得到的粗界。它比真实误差通常大好几倍但作为能不能用的判断足够了。一个小细节$\rho\sqrt{h^2k^2}$ 用的是欧氏距离而放缩界里出现的是 $|h||k|$两者满足 $|h||k|\ge\rho$在 $hk$ 的时候差一个 $\sqrt2$ 因子。做严格证明用 $\rho$做快速估算用 $|h||k|$ 更省事心里知道差了常数倍就行。3. 手算一个完整例子$e^x\cos y$ 的偏导表与展开式光讲公式没用走一遍完整流程。选 $f(x,y)e^x\cos y$ 在 $(0,0)$ 处展开到四阶原因是这个函数的高阶偏导会循环回来便于交叉核验而且它本身是可分离的 $fe^x\cdot\cos y$等于自带一个答案。3.1 求导循环与偏导表先看求导规律。对 $x$ 求导$e^x$ 不变$\cos y$ 不受影响对 $y$ 求导每求一次 $\cos y\to-\sin y\to-\cos y\to\sin y\to\cos y$周期是 4。所以高阶偏导是两类因子相乘我在脑海里只记两件事$e^x$ 求了几次 $x$ 导就是几次本身$\cos y$ 按 4 循环。在 $(0,0)$ 处$e^01$且 $\cos01,\ \sin00$。把所有需要的偏导列成表偏导表达式在 $(0,0)$ 的值$f$$e^x\cos y$1$f_x$$e^x\cos y$1$f_y$$-e^x\sin y$0$f_{xx}$$e^x\cos y$1$f_{xy}$$-e^x\sin y$0$f_{yy}$$-e^x\cos y$$-1$$f_{xxx}$$e^x\cos y$1$f_{xxy}$$-e^x\sin y$0$f_{xyy}$$-e^x\cos y$$-1$$f_{yyy}$$e^x\sin y$0$f_{xxxx}$$e^x\cos y$1$f_{xxxy}$$-e^x\sin y$0$f_{xxyy}$$-e^x\cos y$$-1$$f_{xyyy}$$e^x\sin y$0$f_{yyyy}$$e^x\cos y$1表格里有个很强的规律凡是含奇数阶 $y$ 导数的项值都是 0。这不是巧合是因为 $\cos y$ 的各阶导数在 $y0$ 处偶数阶取 $\pm1$、奇数阶取 0。看出这个规律表里一半的格子都不用算了。3.2 代入合并用乘积展开交叉验证按阶数逐层代入。$n0$$1$。$n1$$h\cdot1k\cdot0h$。$n2$$\tfrac{1}{2}(h^2\cdot12hk\cdot0k^2\cdot(-1))\tfrac12(h^2-k^2)$。$n3$$\tfrac{1}{6}(h^3\cdot13h^2k\cdot03hk^2\cdot(-1)k^3\cdot0)\tfrac16(h^3-3hk^2)$。$n4$$\tfrac{1}{24}(h^4\cdot14h^3k\cdot06h^2k^2\cdot(-1)4hk^3\cdot0k^4\cdot1)\tfrac{1}{24}(h^4-6h^2k^2k^4)$。合起来$$ f(h,k)1h\frac{h^2-k^2}{2}\frac{h^3-3hk^2}{6}\frac{h^4-6h^2k^2k^4}{24}\cdots $$现在做交叉验证。既然 $fe^x\cos y$把两个一元展开相乘$$ \left(1h\frac{h^2}{2}\frac{h^3}{6}\frac{h^4}{24}\right)\left(1-\frac{k^2}{2}\frac{k^4}{24}\right) $$逐项乘开会得到常数项 1一次项 $h$二次项 $\tfrac{h^2}{2}-\tfrac{k^2}{2}$三次项 $\tfrac{h^3}{6}-\tfrac{hk^2}{2}$四次项 $\tfrac{h^4}{24}-\tfrac{h^2k^2}{4}\tfrac{k^4}{24}$。整理后与上式完全一致。这个可分离函数用乘积展开反查的招数非常实用只要函数能拆成两个一元函数的乘积就有一份免费的答案可以对。心得遇到可分离函数我会先用乘积法快速拿到结果再走一遍偏导流程两边对上才敢往下用。走流程的过程本身也是自查——如果两边不一致八成是我漏了某个混合偏导。3.3 第二个例子$\ln(1xy)$ 看交叉项的扎堆第二个例子专门用来展示交叉项。取 $f(x,y)\ln(1xy)$ 在原点展开到三阶。先求导。令 $s1xy$则 $f_xf_y\dfrac{1}{s}$在原点都是 1。二阶$f_{xx}f_{xy}f_{yy}-\dfrac{1}{s^2}$在原点都是 $-1$。三阶$f_{xxx}f_{xxy}f_{xyy}f_{yyy}\dfrac{2}{s^3}$在原点都是 2。代入$n1$$hk$$n2$$\tfrac12(-h^2-2hk-k^2)-\tfrac12(hk)^2$$n3$$\tfrac16(2h^36h^2k6hk^22k^3)\tfrac13(hk)^3$结果是 $(hk)-\tfrac12(hk)^2\tfrac13(hk)^3$正好是一元展开 $\ln(1t)t-\tfrac{t^2}{2}\tfrac{t^3}{3}$ 取 $thk$。这个例子特别能说明问题如果一个函数的全部自变量依赖都通过某个线性组合 $txy$ 体现那它的二元泰勒展开就是一元的展开换个自变量。所有交叉项都会按二项式系数自动扎堆到 $(hk)^n$ 里。反过来说什么时候要看得出这不是伪二元当 $f_{xx},f_{xy},f_{yy}$ 三者在展开点的值不满足任何线性关系时展开式就真的需要三元组 $(h^2,2hk,k^2)$ 独立写出来。做个快速判据算 $f_{xx}f_{yy}-f_{xy}^2$如果它非零说明二阶项真的是一个非退化的二次型各方向曲率不同如果它恒等于零那曲面在这个点的二阶行为是退化的展开式会瘦很多。4. 方向降维把二元问题化成一元问题自查这是我用得最多的一个技巧也是最容易被教材一笔带过的地方。它把二元展开的所有系数压进一元展开里是两个维度之间的一座桥。4.1 令 $g(t)f(x_0th,,y_0tk)$固定一个方向 $(h,k)$构造一元函数 $g(t)f(x_0th,,y_0tk)$。对它做一元泰勒展开$$ g(t)g(0)g(0)t\frac{g(0)}{2!}t^2\frac{g(0)}{3!}t^3\cdots $$而根据链式法则$g(0)hf_xkf_y$$g(0)h^2f_{xx}2hkf_{xy}k^2f_{yy}$$g(0)h^3f_{xxx}3h^2kf_{xxy}3hk^2f_{xyy}k^3f_{yyy}$。注意这些正好就是前面算子形式里第 $n$ 阶项乘上 $n!$ 之后的结果——因为 $t^n$ 对应的是把增量放大 $t$ 倍。这件事的意义在于二元的 $n$ 阶展开等价于沿任意方向的一元展开都成立到 $n$ 阶。所以有两个用法第一核验。算完展开式后任选一个方向比如 $(h,k)(1,1)$把 $g(t)$ 的一元展开算出来与二元展开式代入 $ht,kt$ 的结果对照。两边必须一致。这个方法比逐项核对要快得多而且能抓出系数错误——系数错了沿某个方向代入就会出现偏差。第二降维求解。有些问题只需要沿某个方向的近似比如结构分析里关心沿某个载荷方向组合的响应、参数标定里关心沿某个参数比例的变化。这种情况下完全不用算全部偏导只要沿着那个方向算一元导数就够了计算量能省一半以上。提示这个技巧成立的前提是 $g(t)$ 在 $t0$ 附近足够光滑。如果方向选到了函数不可导的地方比如绝对值函数的尖点方向链条会断。选方向的时候心里过一遍函数的定义域。4.2 用方向展开反推偏导系数反过来的用法更有意思如果你只能通过采样得到 $g(t)$ 在若干 $t$ 值上的数据就可以反推出 $f$ 的各阶偏导组合。这在实验数据场景里很常见——你没法求导只能测点。具体做法是选定几个不同方向比如 $(1,0)$、$(0,1)$、$(1,1)$、$(1,-1)$各自拟合一条一元多项式就能解出 $f_x,f_y,f_{xx},f_{xy},f_{yy}$ 这些系数。四个方向对应能定出二阶的全部信息因为二阶有 3 个未知量$f_{xx},f_{xy},f_{yy}$加上两个一阶量一共 5 个未知量方向数够就行。方向的选择有讲究尽量避开对称方向。如果只用 $(1,0)$ 和 $(0,1)$那两个方向的方程只含 $f_{xx}$ 和 $f_{yy}$$f_{xy}$ 完全定不出来。加上 $(1,1)$ 和 $(1,-1)$ 才有足够约束。这一点在实验设计里叫避免混叠。我踩过的坑是早期的试验点全部布置在一个正方形的四个角上看上去四平八稳实际上拟合出来的二次响应面里 $f_{xy}$ 的置信区间大得离谱——因为角点分布的对称性让 $h^2$ 和 $k^2$ 之间产生了强相关。后来改成包含轴向点的布点中心复合设计的思路混合项的估计立刻稳了。5. 用代码把展开和误差验一遍手算再仔细也会出纰漏尤其是四阶往上。我现在固定用一套符号展开 数值残差的双校验流程符号负责把式子写对数值负责告诉你这个阶数到底够不够用。下面这套代码可以直接抄。5.1 sympy 符号展开把算子形式翻译成代码import sympy as sp x, y, h, k sp.symbols(x y h k) def taylor2d(f, x, y, x0, y0, order): 二元函数在 (x0,y0) 展开到 order 阶返回以 hx-x0, ky-y0 表示的展开式 total sp.Integer(0) for n in range(order 1): for j in range(n 1): coeff sp.binomial(n, j) # 二项式系数就是杨辉三角那一行 d sp.Derivative(f, (x, j), (y, n - j)).doit() val d.subs({x: x0, y: y0}) total coeff * h**j * k**(n - j) * val / sp.factorial(n) return sp.expand(total) f sp.exp(x) * sp.cos(y) expr taylor2d(f, x, y, 0, 0, 4) print(expr)跑出来的结果是1 h h**2/2 - k**2/2 h**3/6 - h*k**2/2 h**4/24 - h**2*k**2/4 k**4/24跟手算完全对得上。代码里有几个细节值得说。sp.binomial(n, j)直接给出二项式系数比自己写阶乘除法稳sp.Derivative(f, (x, j), (y, n-j)).doit()是先构造偏导再求值比用diff连续求导更干净而且当 $j0$ 或 $n-j0$ 时它也能正确处理相当于不求导。sp.factorial(n)就是那个 $\tfrac{1}{n!}$。注意sympy 的多元展开没有内置的series直接支持一元有所以这个手写的循环是最省事的路子。别去折腾series嵌套容易在阶数截断上出错。5.2 数值残差表判断阶数够不够用符号式对完接着看数值。取 $h0.1$、$k0.2$逐阶比较import math def f_true(h, k): return math.exp(h) * math.cos(k) h, k 0.1, 0.2 true f_true(h, k) approx { 0: 1, 1: 1 h, 2: 1 h (h**2 - k**2)/2, 3: 1 h (h**2 - k**2)/2 (h**3 - 3*h*k**2)/6, 4: 1 h (h**2 - k**2)/2 (h**3 - 3*h*k**2)/6 (h**4 - 6*h**2*k**2 k**4)/24, } for n, a in approx.items(): print(f{n} 阶: {a:.7f} 误差 {a - true:.3e})结果整理成表阶数近似值绝对误差误差量级01.0000000$-8.31\times10^{-2}$$10^{-1}$11.1000000$1.69\times10^{-2}$$10^{-2}$21.0850000$1.86\times10^{-3}$$10^{-3}$31.0831667$2.56\times10^{-5}$$10^{-5}$41.0831375$-3.58\times10^{-6}$$10^{-6}$这里 $\rho\sqrt{0.1^20.2^2}\approx0.2236$$|h||k|0.3$。误差大致按 $\rho^{n1}$ 的量级往下掉从二阶到三阶掉了一个半数量级三阶到四阶掉了将近一个数量级。这个下降速度可以作为阶数够不够的判据经验判据如果当前阶数的误差已经比你允许的容差小一个数量级以上就停手如果还大就往上加一阶再看。不要盲目上五阶、六阶——项数按 $n1$ 增长每一项都要求混合偏导符号计算的代价涨得很快而且高阶项常常被数值噪声淹没。另外注意误差的符号在交替二阶正、三阶正、四阶负。这说明只用偶数阶或只用奇数阶信息时误差项不能简单当作偏大或偏小来处理做误差预算时要留双向余量。5.3 有限差分校验偏导的几个坑没有符号计算环境的时候比如嵌入式标定、在线估计只能用有限差分。这里有几个坑必须提前知道。中心差分的基本形式$f_x\approx\dfrac{f(x\delta,y)-f(x-\delta,y)}{2\delta}$。截断误差是 $O(\delta^2)$看起来越小越好但舍入误差是 $O(\varepsilon/\delta)$$\delta$ 越小反而越大。两者相加的最优步长在 $\delta\sim\varepsilon^{1/3}$ 附近。对双精度$\varepsilon\approx2.2\times10^{-16}$一阶偏导 $\delta\approx(2.2\times10^{-16})^{1/3}\approx6\times10^{-6}$再乘变量的特征尺度二阶偏导用中心二阶差分 $\dfrac{f_{1}-2f_0f_{-1}}{\delta^2}$最优步长约为 $\varepsilon^{1/4}\approx1.2\times10^{-4}$乘特征尺度。三个具体的坑尺度不匹配。如果 $x$ 的量级是 $10^6$、$y$ 的量级是 $10^{-3}$用同一个绝对步长会有一个维度完全失效。必须先把变量无量纲化再差分。混合偏导的差分格式。$f_{xy}$ 用四点格式 $\dfrac{f_{}-f_{-}-f_{-}f_{--}}{4\delta_x\delta_y}$误差也是 $O(\delta^2)$但分母是两个步长相乘舍入误差被放大得更厉害。这个量的数值噪声通常比 $f_{xx}$ 大一到两个数量级做二次型判别时要有心理准备。函数求值本身有噪声。如果 $f$ 来自数值模拟或者测量本身带 $10^{-4}$ 量级的噪声那么二阶差分会把噪声放大 $1/\delta^2$ 倍直接爆掉。这种情况要么上高阶差分加 Richardson 外推要么改用拟合——在邻域内取一堆点做二次曲面最小二乘拟合比差分稳得多。Richardson 外推的用法很简单用 $\delta$ 和 $\delta/2$ 各算一次中心差分结果分别记为 $D_1,D_2$则 $\tilde D(4D_2-D_1)/3$ 的截断误差升到 $O(\delta^4)$。多花一次函数求值换两个数量级精度很划算。6. 工程里真正用到它的三个场景公式本身是工具关键在什么时候掏出来。我梳理了三个真正高频的场景每个都给出具体的用法和参数口径。6.1 误差传播与灵敏度分析设 $Zf(X,Y)$$X,Y$ 是带不确定度的输入均值附近做二阶展开$$ \Delta Z\approx (f_x\Delta Xf_y\Delta Y)\frac{1}{2}\left(f_{xx}\Delta X^22f_{xy}\Delta X\Delta Yf_{yy}\Delta Y^2\right) $$如果 $\Delta X,\Delta Y$ 独立、均值为零、标准差为 $\sigma_X,\sigma_Y$对小量取期望$$ E[\Delta Z]\approx\frac{1}{2}\left(f_{xx}\sigma_X^2f_{yy}\sigma_Y^2\right),\qquad \mathrm{Var}(Z)\approx f_x^2\sigma_X^2f_y^2\sigma_Y^2 $$这两条式子合起来说清了一件重要的事线性化只给方差不给偏差偏差是二阶项带来的。很多人做误差分析只算了一阶项然后发现预测值和实测均值系统性对不上问题就出在这。举个能算的例子$fX/Y$在 $(1,1)$ 附近$\sigma_X0.01,\sigma_Y0.02$。偏导是 $f_x1/Y1$$f_y-X/Y^2-1$$f_{xx}0$$f_{yy}2X/Y^32$。一阶传播给出 $\sigma_Z\approx\sqrt{1^2\times10^{-4}1^2\times4\times10^{-4}}\sqrt{5\times10^{-4}}\approx0.0224$相对不确定度 2.24%。这部分是熟悉的做法。二阶项给出偏差 $E[\Delta Z]\approx\tfrac12\times2\times4\times10^{-4}4\times10^{-4}$相对偏差 0.04%。数值不大但它是系统性的——不管你测多少次这个偏差都不会被平均掉。分母的不确定度越大这个偏差涨得越快按平方增长。所以在比值型指标收率、转化率、效率这类的报告里如果分母的相对不确定度到了 5% 以上二阶偏差就进了小数点后两位不能忽略。我在做参数标定报告时的口径是一级不确定度按线性传播写然后单独列一行二阶偏差修正并注明它只对均值有效。这样别人复现的时候不会把偏差项错当成方差的贡献。6.2 优化海森矩阵与牛顿迭代二元展开在优化里的角色非常直接。目标函数 $f(x,y)$ 在 $\mathbf{x}_n$ 附近做二阶展开$$ f(\mathbf{x}_n\mathbf{d})\approx f(\mathbf{x}_n)\nabla f^\top\mathbf{d}\tfrac12\mathbf{d}^\top H\mathbf{d} $$其中 $H\begin{pmatrix}f_{xx}f_{xy}\f_{xy}f_{yy}\end{pmatrix}$就是海森矩阵。对它求关于 $\mathbf{d}$ 的梯度并令其为零得到 $\mathbf{d}-H^{-1}\nabla f$这就是牛顿法的迭代步。一元牛顿法是 $x_{n1}x_n-f/f$二元只是把除以二阶导换成乘海森矩阵的逆。二阶项的定性判别也直接来自这张二次型$H$ 的性质判别条件几何含义正定$f_{xx}0$ 且 $f_{xx}f_{yy}-f_{xy}^20$碗形局部极小负定$f_{xx}0$ 且 $f_{xx}f_{yy}-f_{xy}^20$穹顶形局部极大不定$f_{xx}f_{yy}-f_{xy}^20$鞍点半定$f_{xx}f_{yy}-f_{xy}^20$二阶信息不足要升到三阶实战里最麻烦的是最后一行。行列式接近零的时候二阶项在某些方向上平得像一条沟梯度下降会沿着沟爬得极慢牛顿法又因为 $H$ 接近奇异而步长爆炸。我在处理这类问题时通常做两件事一是给 $H$ 加一个小的对角正则项$\lambda I$$\lambda$ 取 $10^{-6}$ 到 $10^{-3}$ 量级把奇异方向压住二是在迭代中监控 $H$ 的条件数一旦超过 $10^{10}$ 就退回最速下降走几步等曲率重新长起来再切回牛顿法。提示$f_{xx}f_{yy}-f_{xy}^2$ 这个量就是二阶项二次型的判别式也等于海森矩阵的行列式。它在几何上描述两个主方向曲率的乘积接近于零意味着曲面在一个方向上是沟不是点。还有一个和方向降维呼应的用法牛顿步的方向 $\mathbf{d}$ 对应的方向导数恰好是 $-|\nabla f|^2/\sqrt{\cdots}$沿着这个方向函数下降最快。如果你只是想找下降方向而懒得组装完整的海森矩阵可以用两条不同方向的截面线拟合出三组二阶信息反解出 $H$——这是准牛顿法比如 BFGS的思想源头。6.3 曲面拟合、代理模型与无量纲化做仿真或者实验时常常需要用一个便宜的表达式代替昂贵的模型。二元二阶展开就是最简单的代理模型只要在中心点做若干次扰动试验测出 6 个数$f,f_x,f_y,f_{xx},f_{xy},f_{yy}$就能写出一个能用的响应面。这里的核心技巧是无量纲化。把增量换成 $\tilde hh/L_x$、$\tilde kk/L_y$其中 $L_x,L_y$ 是两个方向的特征变化尺度然后定义 $\rho\sqrt{\tilde h^2\tilde k^2}$。这样做的价值在于可以先看 $\rho$ 的数量级再决定用几阶。$\rho0.05$ 的时候一阶通常够用$\rho$ 在 $0.05\sim0.2$ 之间二阶比较稳$\rho0.3$ 就别指望低阶展开了换别的模型。无量纲之后各阶项的系数之间可以直接比较大小。如果二阶项的最大绝对值不到一阶项的 10%那二阶项就是噪声级别的贡献写进去反而增加过拟合风险。不同量纲的变量放在一起做二次曲面拟合时无量纲化能显著改善设计矩阵的条件数。我做过一个测试把温度量级 $10^3$和流量量级 $10^{-1}$直接扔进最小二乘设计矩阵条件数超过 $10^{12}$拟合出来的 $f_{xy}$ 是纯噪声无量纲化之后条件数降到 $10^4$ 以内系数立刻稳定。代理模型的一个常见误用是外推。二次响应面在中心点附近好用一旦把自变量推出拟合区间二次项会把预测拉得飞快。我的习惯是给代理模型加一个适用范围标注把参数区间写死在注释里并且在区间边界处用真实模型抽几个点做核对。展开点是局部信息它从来就不是全局模型。7. 踩坑清单与速查表把前面散落的坑集中起来做成可以直接查的表。7.1 常见错误对照表现象最可能的原因处理办法二阶结果总是差一个 $2hk$ 相关的量漏了混合偏导项回到算子形式逐项列出 $(h\partial_xk\partial_y)^2$系数差 2 倍或 6 倍漏乘二项式系数或 $\tfrac{1}{n!}$检查每一阶是否都除以了 $n!$每一项是否带 $\binom{n}{j}$三阶展开项数写成 3 项误以为三阶只含 $f_{xxx},f_{xxy},f_{yyy}$三阶一定是 4 项系数 $1,3,3,1$指数和为 3在中心点对得上稍远就崩展开半径不够检查 $\rho$ 的大小$\rho0.3$ 就该换模型与一维结果对不上误把函数当成两个一元函数的乘积用方向降维法 $g(t)f(x_0th,y_0tk)$ 核验混合偏导数值噪声极大有限差分步长和量纲不匹配先无量纲化混合项改用四点格式加 Richardson 外推二次型判别式接近零迭代震荡海森矩阵接近奇异加对角正则 $\lambda I$或临时退回最速下降响应面系数是噪声设计矩阵条件数过大无量纲化 增加轴向试验点避免只用角点误差分析预测均值有系统偏差只算了线性传播丢了二阶偏差补上 $\tfrac12(f_{xx}\sigma_X^2f_{yy}\sigma_Y^2)$参数标定结果对不上实测均值分母的不确定度较大检查比值型指标的二阶偏差$\sigma$ 超 5% 就必须算7.2 我自己的几条经验法则第一先写算子形式再展开。这是我唯一一条从不例外的习惯。哪怕只展到二阶我也会先把 $(h\partial_xk\partial_y)^2$ 写出来再往里填偏导值。省的那几秒钟抵不过事后排查一个错项的半小时。第二能分离就先分离。遇到 $fg(x)\cdot h(y)$ 或者 $fg(xy)$ 这类结构先用一元的展开相乘或者代换得到结果再走偏导流程核对。这不是偷懒是给自己准备一份标准答案。第三阶数由 $\rho$ 决定不由想要多准决定。$\rho$ 决定了理论上能达到的精度天花板想要更高精度缩小展开半径比增加阶数有效得多。我现在拿到问题先算 $\rho$$\rho$ 大就干脆分段展开——把大区间切成几个小区间每个区间单独展开成本比硬上高阶低得多。第四参数标定的报告里一定要写展开点和适用范围。这件事我吃过亏一份响应面报告交出去半年别人拿去把参数推到了两倍区间外结果预测全错回头来找我。从此我强制自己在每次输出里写清楚中心点坐标、无量纲尺度、$\rho$ 的最大值和各阶误差量级。这四行字看着啰嗦但在交接环节能省掉大量沟通成本。第五别指望低阶展开处理强非线性。如果数据画出来有明显的平台、拐点、陡壁二阶展开只会把它们抹平。这时候该换的是模型形式不是展开阶数。我一般会先画一张沿两个主方向的截面图扫一眼看到明显非线性就立刻放弃展开路线——这个判断花不了五分钟却能把后面几小时的调参时间省下来。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →