Part I · 第 2 章 微积分 · 2.4

泰勒展开

2.1 节说,光滑函数放大后是一条直线。泰勒展开把这句话升级:放大后是直线,稍微放松一点是抛物线,再放松一点是三次曲线……每多算一阶导数,近似就能在更大的范围内贴紧函数。机器人里的"小角度近似"、线性化、Newton 法、EKF,全是截断的泰勒展开。

约 25 分钟 前置:2.1 导数 · 2.2 链式法则 4 个交互

    1为什么机器人需要它

    机器人学几乎每个地方都在做同一件事:把难算的非线性函数,在工作点附近换成容易算的多项式。

    • 倒立摆的控制器按 \(\sin\theta\approx\theta\) 设计(线性化),在竖直附近稳稳地工作。
    • 扩展卡尔曼滤波(EKF)把非线性的运动与观测模型在当前估计处展开到一阶。
    • Newton 法、Gauss–Newton、SQP 每一步都在解"一阶或二阶泰勒模型"的最优点。
    • 小旋转 \(R\approx I+[\boldsymbol\omega]_\times\),是李群里指数映射的一阶展开。

    用得多,就更要知道:这个多项式在多大范围内可信,丢掉的那一项有多大。这是本节要讲清楚的。

    2直觉:每多一阶导数,多贴紧一圈

    想在 \(x=a\) 处"复制"一个函数。零阶:只对上高度,得到一条水平线。一阶:再对上斜率,得到切线。二阶:再对上弯曲程度,得到抛物线。三阶:对上弯曲程度的变化……每对上一阶,近似曲线就和真函数多"黏"在一起一段。

    下面拖动阶数滑块,拖动琥珀色的展开点 \(a\),再拖紫色的探针 \(x\),观察右图:误差随离展开点的距离 \(|x-a|\) 缩小得有多快。

    FIG 1泰勒多项式 Tₙ
    函数(琥珀)与 Tₙ(青)
    log₁₀ 误差 对 log₁₀ |x − a|
    左:展开点 \(a\)(琥珀点)与探针 \(x\)(紫点)。右:青色线是真实误差 \(|f(x)-T_n(x)|\),紫色虚线是斜率为 \(n+1\) 的参考线。离 \(a\) 越近,误差按 \(|x-a|^{n+1}\) 缩小,阶数每加 1,双对数图上的直线就陡一级。
    • 选 sin x,\(a=0\),阶数调到 7:把探针拖到 \(x=\pm\pi\) 附近,误差仍小于 0.1。
    • 选 ln(1+x),\(a=0\),阶数 6 以上,把探针拖到 \(x>1\):阶数越高误差越大(超出收敛半径)。
    核心洞见

    泰勒多项式是"局部近似":在展开点附近,\(n\) 阶近似的误差是 \(O(|x-a|^{n+1})\),离得越近越准、阶数越高越准;但远离展开点,多项式可能很快跑偏,甚至越高阶越差(有些函数有"收敛半径",比如 \(\ln(1+x)\) 在 \(|x|>1\) 处)。

    3动手玩:小角度、Newton 法、摆

    小角度近似到底有多小?

    \(\sin\theta\approx\theta\)、\(\cos\theta\approx1\)、\(\cos\theta\approx1-\tfrac12\theta^2\) 是机器人里最常用的三个近似。右侧是它们的相对误差随角度变化的曲线(纵轴是以 10 为底的对数,−2 即 1%)。"小"得看你容忍多大误差。

    FIG 2小角度近似的误差
    水平虚线是 1% 误差线,竖线是你选的角度 \(\theta\)。阶数每升一阶,曲线整体下移一大截;但每条曲线都随角度迅速上升(\(\cos\theta\approx1\) 在 60° 处已达 100%)。
    • 找到 \(\sin\theta\approx\theta\) 的误差刚好达到 1% 的角度(约 14°)。
    • 找到 \(\cos\theta\approx1\) 的误差达到 1% 的角度。它为什么比 sin 的小得多?

    Newton 法:每一步都是一个泰勒模型

    求根:在当前点 \(x_k\) 用一阶泰勒(切线)代替 \(f\),解切线的零点作为下一个点:\(x_{k+1}=x_k-f(x_k)/f'(x_k)\)。求极小:用二阶泰勒(抛物线)代替 \(g\),跳到抛物线的顶点:\(x_{k+1}=x_k-g'(x_k)/g''(x_k)\)。拖动起点 \(x_0\),点"步进",看它怎么走,什么时候出问题。

    FIG 3Newton 法
    函数
    log₁₀ 残差 随迭代次数
    青线(求根时)或青色抛物线(求极小时)是当前点的泰勒模型,紫色点是模型给出的下一个点。残差是 \(|f(x_k)|\)(求根)或 \(|g'(x_k)|\)(求极小)。收敛时每一步"有效数字翻倍",对数残差下降得越来越快。
    • 求根,函数 \(x^2-2\),\(x_0=1\):看到残差在 6 步内降到 \(10^{-12}\) 以下(二次收敛)。
    • 求根,函数 \(x^3-2x+2\),\(x_0=0\):迭代在 0 和 1 之间来回跳,永远到不了根。
    • 求极小,选"非凸",在 \(g''<0\) 的地方起步:这一步让 g 变大了。

    摆:线性化好用到哪里?

    单摆满足 \(\ddot\theta=-\tfrac g\ell\sin\theta\)。线性化(\(\sin\theta\approx\theta\))得到简谐运动 \(\ddot\theta=-\tfrac g\ell\theta\),周期和振幅无关。真实的摆摆得越大,周期越长。下面把两者的轨迹放在一起,改变初始摆角。

    FIG 4真实的摆 vs 线性化的摆
    θ(t)(度)
    青色:真实(非线性)的摆。紫色:线性化的摆。小摆角时两条曲线重合,大摆角时线性模型"走得太快",几个周期之后相位差越来越大。"阻尼 c"给两个模型都加上 \(-c\dot\theta\) 项;有阻尼时不再显示周期,任务也要求 \(c=0\)。
    • 摆角 ≤ 10°:两条轨迹在 8 秒内几乎无法区分(最大差小于 0.5°)。
    • 摆角 ≥ 90°:真实的摆周期比线性模型长 15% 以上。

    4再看数学

    提示:悬停在公式带底色的符号上,FIG 1 里对应的部分会高亮。

    泰勒公式

    设 \(f\) 在 \(a\) 附近有 \(n+1\) 阶导数,则

    $$ f(x)=\underbrace{\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}\,(x-a)^k}_{\hl{poly}{T_n(x)}}\;+\;\underbrace{\frac{f^{(n+1)}(\xi)}{(n+1)!}\,\hl{pow}{(x-a)^{n+1}}}_{R_n(x)},\qquad \xi\in(a,x). $$

    展开到前几项:\(f(a)+f'(a)\,\delta+\tfrac12f''(a)\,\delta^2+\tfrac16f'''(a)\,\delta^3+\cdots\),\(\delta=x-a\)。系数里的 \(1/k!\) 是为了让多项式的 \(k\) 阶导数在 \(a\) 处恰好等于 \(f^{(k)}(a)\)。余项说明误差是 \(O(|\delta|^{n+1})\),系数由 \(f^{(n+1)}\) 控制:函数"弯"得越厉害,误差越大。

    值得记住的几个展开(在 0 处)

    函数展开适用范围
    \(\sin x\)\(x-\tfrac{x^3}{6}+\tfrac{x^5}{120}-\cdots\)所有 \(x\)
    \(\cos x\)\(1-\tfrac{x^2}{2}+\tfrac{x^4}{24}-\cdots\)所有 \(x\)
    \(e^x\)\(1+x+\tfrac{x^2}{2}+\tfrac{x^3}{6}+\cdots\)所有 \(x\)
    \(\ln(1+x)\)\(x-\tfrac{x^2}{2}+\tfrac{x^3}{3}-\cdots\)\(|x|<1\)
    \(\dfrac1{1-x}\)\(1+x+x^2+x^3+\cdots\)\(|x|<1\)

    多元函数

    对 \(f:\mathbb R^n\to\mathbb R\),到二阶:

    $$ f(\mathbf x+\boldsymbol\delta)\;\approx\;f(\mathbf x)+\nabla f(\mathbf x)^{\!\top}\boldsymbol\delta+\tfrac12\,\boldsymbol\delta^{\!\top}H(\mathbf x)\,\boldsymbol\delta. $$

    一阶项里的梯度见 3.2 节,二阶项里的 Hessian 见 3.5 节。对向量函数 \(\mathbf f:\mathbb R^n\to\mathbb R^m\),一阶项是雅可比:\(\mathbf f(\mathbf x+\boldsymbol\delta)\approx\mathbf f(\mathbf x)+J\boldsymbol\delta\)(3.3 节),这就是 EKF 的线性化。

    Newton 法的来历与速度

    令一阶模型 \(f(x_k)+f'(x_k)(x-x_k)=0\),解得 \(x_{k+1}=x_k-f(x_k)/f'(x_k)\)。把 \(f\) 展开到二阶可以证明:在单根附近 \(e_{k+1}\approx\dfrac{f''(x^\star)}{2f'(x^\star)}\,e_k^2\),误差被平方:\(10^{-2}\to10^{-4}\to10^{-8}\to10^{-16}\),这叫二次收敛。求极小就是对导数 \(g'\) 做 Newton 法,等价于每步最小化二阶泰勒模型。

    5机器人中的它:线性化的有效区域

    FIG 4 的结论可以直接搬到控制器设计里:

    • 用线性化模型设计的控制器(PD、LQR)只在工作点附近有保证。摆角 10° 以内,模型误差不到 1%;超过 60°,线性模型已经完全不对了。
    • EKF 在当前估计 \(\hat{\mathbf x}\) 处线性化。如果估计偏离真值太远(比如机器人"被绑架"),线性化点本身错了,滤波器会越修越偏,这叫不一致。
    • 轨迹优化每一步用二阶泰勒模型,为防止"跳出可信范围",要加信赖域(6.5 节):限制步长不超过模型可信的半径。
    • 数值上的警告:\(1-\cos\theta\) 在 \(\theta\) 很小时会因为两个近似相等的数相减而丢掉有效数字,应当写成 \(2\sin^2(\theta/2)\),或者直接用泰勒展开 \(\theta^2/2\)。
    真实系统里

    旋转的最基本事实也是泰勒展开:绕轴 \(\hat{\mathbf n}\) 转很小的角 \(\phi\),\(R=\exp([\phi\hat{\mathbf n}]_\times)\approx I+[\phi\hat{\mathbf n}]_\times\)。IMU 积分、视觉里程计、姿态估计里随处可见"小旋转 \(\approx I+\)反对称矩阵",我们会在 5.6、5.7 节把它做严格。

    6常见误区

    误区 1:阶数越高越准

    只在收敛半径内成立,也只在离展开点不太远时成立。FIG 1 里 \(\ln(1+x)\) 在 \(x>1\) 处越展开越离谱。

    误区 2:数错阶数

    "一阶近似"误差是 \(\delta^2\),"二阶近似"误差是 \(\delta^3\)。\(\cos\theta\approx1\) 虽然是"零阶",误差却是 \(\theta^2/2\);而 \(\sin\theta\approx\theta\) 是"一阶",误差是 \(\theta^3/6\),因为 \(\sin\) 的二阶项恰好为零。

    误区 3:Newton 法总是收敛

    它只保证"离解足够近时二次收敛"。起点不好,会来回跳(FIG 3),甚至发散。求极小时若 Hessian 不是正定,Newton 步会指向上坡或鞍点。实用的做法是配合线搜索或信赖域,或给 Hessian 加阻尼(Levenberg–Marquardt,6.6 节)。

    误区 4:角度用度

    \(\sin\theta\approx\theta\) 要求 \(\theta\) 是弧度。\(\sin 10^\circ\approx10\) 是荒谬的。

    7小练习

    1. 用 \(e^x\) 在 0 处的二阶泰勒多项式估计 \(e^{0.1}\)。
    \(1+0.1+0.1^2/2=1.105\),真值 1.10517。
    2. 用 \(\cos\theta\approx1-\tfrac12\theta^2\) 估计 \(\cos 0.2\)(弧度)。
    \(1-0.5\times0.04=0.98\)(真值 0.98007)。
    3. 二阶泰勒近似的误差是 \(O(\delta^3)\)。把 \(\delta\) 缩小一半,误差大约变成原来的……
    \((1/2)^3=1/8\)。FIG 1 右图里斜率就是 \(n+1=3\)。
    4. 用 Newton 法解 \(x^2-2=0\),从 \(x_0=1\) 出发,\(x_1\) 是多少?
    \(x_1=1-\dfrac{1-2}{2\cdot1}=1.5\)。再走一步 \(x_2=1.4167\),已经只差 \(0.002\)。
    5. 为什么 \(\ln(1+x)\) 在 0 处的泰勒级数在 \(x=1.6\) 处越加项误差越大?
    \(\ln(1+x)\) 在 \(x=-1\) 处有奇点,离展开点 0 的距离是 1,这决定了收敛半径。

    8延伸阅读

    • 3Blue1Brown, Essence of Calculus — 第 11 章:泰勒级数
    • J. Nocedal & S. Wright, Numerical Optimization, Ch. 3, 6 — 信赖域与 Newton 类方法
    • T. Barfoot, State Estimation for Robotics, Ch. 4 — 非线性系统的线性化与 EKF
    • S. Boyd & L. Vandenberghe, Convex Optimization, App. A.4 — 导数与二阶近似