泰勒展开(Taylor Expansion)详解以及在工程实践(SLAM)中的应用实例
项目内容使用条件非线性函数可微,输入误差较小(局部线性近似有效)优点计算快速,适合高频状态估计(如 IMU 融合)局限线性化误差大时不准,需二阶或采样方法(如 UKF、蒙特卡洛)常用工具雅可比矩阵、协方差传播、残差线性化内容表达式作用一阶泰勒展开fx≈fx0∇f⊤Δxfx≈fx0∇f⊤Δx一阶近似二阶泰勒展开加上12Δx⊤HΔx21Δx⊤HΔx曲率控制精度更高极值判断。
泰勒展开(Taylor Expansion)是微积分中一个重要工具,它将一个在某点可导函数表示为无穷级数,从而用多项式近似函数。它广泛用于数值计算、物理建模、SLAM 优化等领域。
一、单变量泰勒展开公式
基本形式
设函数 f(x)f(x)f(x) 在某点 aaa 处具有无限阶导数,则它在该点的泰勒展开为:
f(x)=f(a)+f′(a)(x−a)+f′′(a)2!(x−a)2+⋯+f(n)(a)n!(x−a)n+Rn(x) f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \cdots + \frac{f^{(n)}(a)}{n!}(x-a)^n + R_n(x) f(x)=f(a)+f′(a)(x−a)+2!f′′(a)(x−a)2+⋯+n!f(n)(a)(x−a)n+Rn(x)
其中:
- f(n)(a)f^{(n)}(a)f(n)(a):第 nnn 阶导数在 aaa 点的值。
- Rn(x)R_n(x)Rn(x):余项,用于表示截断误差。
麦克劳林展开(Maclaurin)
是泰勒展开在 a=0a=0a=0 处的特例:
f(x)=f(0)+f′(0)x+f′′(0)2!x2+⋯ f(x) = f(0) + f'(0)x + \frac{f''(0)}{2!}x^2 + \cdots f(x)=f(0)+f′(0)x+2!f′′(0)x2+⋯
常见函数的泰勒展开(Maclaurin)
| 函数 | 展开式 |
|---|---|
| exe^xex | 1+x+x22!+x33!+⋯1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots1+x+2!x2+3!x3+⋯ |
| sinx\sin xsinx | x−x33!+x55!−⋯x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdotsx−3!x3+5!x5−⋯ |
| cosx\cos xcosx | 1−x22!+x44!−⋯1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \cdots1−2!x2+4!x4−⋯ |
| ln(1+x)\ln(1+x)ln(1+x) | x−x22+x33−⋯(−1<x≤1)x - \frac{x^2}{2} + \frac{x^3}{3} - \cdots \quad (-1<x \le 1)x−2x2+3x3−⋯(−1<x≤1) |
二、多元泰勒展开公式(Multivariable Taylor Expansion)
设函数 f(x,y)f(x, y)f(x,y) 在点 (a,b)(a, b)(a,b) 处具有连续偏导数,我们希望对 f(x,y)f(x, y)f(x,y) 在点 (a,b)(a, b)(a,b) 处展开,近似表示在附近的值 f(a+h,b+k)f(a + h, b + k)f(a+h,b+k)。
一阶泰勒展开:
f(a+h,b+k)≈f(a,b)+fx(a,b)h+fy(a,b)k f(a + h, b + k) \approx f(a, b) + f_x(a, b) h + f_y(a, b) k f(a+h,b+k)≈f(a,b)+fx(a,b)h+fy(a,b)k
是函数在点 (a,b)(a, b)(a,b) 处的线性近似(即切平面)。
二阶泰勒展开:
f(a+h,b+k)≈ f(a,b)+fx(a,b)h+fy(a,b)k+12[fxx(a,b)h2+2fxy(a,b)hk+fyy(a,b)k2] \begin{aligned} f(a + h, b + k) \approx\ & f(a, b) + f_x(a, b) h + f_y(a, b) k \\ &+ \frac{1}{2} \left[ f_{xx}(a, b) h^2 + 2f_{xy}(a, b) hk + f_{yy}(a, b) k^2 \right] \end{aligned} f(a+h,b+k)≈ f(a,b)+fx(a,b)h+fy(a,b)k+21[fxx(a,b)h2+2fxy(a,b)hk+fyy(a,b)k2]
这个式子也可写作矩阵形式(见下文)。
向量记号的二阶泰勒展开(推广到 nnn 维):
设函数 f:Rn→Rf : \mathbb{R}^n \to \mathbb{R}f:Rn→R,点 x0∈Rn\mathbf{x}_0 \in \mathbb{R}^nx0∈Rn,展开点为 x=x0+Δx\mathbf{x} = \mathbf{x}_0 + \Delta \mathbf{x}x=x0+Δx:
f(x0+Δx)≈f(x0)+∇f(x0)⊤Δx+12Δx⊤Hf(x0)Δx f(\mathbf{x}_0 + \Delta \mathbf{x}) \approx f(\mathbf{x}_0) + \nabla f(\mathbf{x}_0)^\top \Delta \mathbf{x} + \frac{1}{2} \Delta \mathbf{x}^\top H_f(\mathbf{x}_0) \Delta \mathbf{x} f(x0+Δx)≈f(x0)+∇f(x0)⊤Δx+21Δx⊤Hf(x0)Δx
其中:
- ∇f\nabla f∇f:梯度列向量(偏导数);
- HfH_fHf:Hessian 矩阵(所有二阶偏导);
- Δx\Delta \mathbf{x}Δx:位移向量。
示例 1:展开 f(x)=ln(1+x)f(x) = \ln(1+x)f(x)=ln(1+x) 于 x=0x=0x=0
f(x)=ln(1+x)f′(x)=11+x,f′′(x)=−1(1+x)2,…⇒f(x)=x−x22+x33−⋯(−1<x≤1) \begin{aligned} f(x) &= \ln(1+x) \\ f'(x) &= \frac{1}{1+x},\quad f''(x) = -\frac{1}{(1+x)^2}, \ldots \\ \Rightarrow f(x) &= x - \frac{x^2}{2} + \frac{x^3}{3} - \cdots \quad (-1 < x \le 1) \end{aligned} f(x)f′(x)⇒f(x)=ln(1+x)=1+x1,f′′(x)=−(1+x)21,…=x−2x2+3x3−⋯(−1<x≤1)
示例 2:多元函数 f(x,y)=ex+yf(x, y) = e^{x+y}f(x,y)=ex+y 在 (0,0)(0,0)(0,0) 处展开
- f(x,y)=1+(x+y)+12!(x+y)2+⋯f(x, y) = 1 + (x + y) + \frac{1}{2!}(x + y)^2 + \cdotsf(x,y)=1+(x+y)+2!1(x+y)2+⋯
也可展开为:
f(x,y)=1+x+y+x22+xy+y22+⋯ f(x, y) = 1 + x + y + \frac{x^2}{2} + xy + \frac{y^2}{2} + \cdots f(x,y)=1+x+y+2x2+xy+2y2+⋯
示例 3:在优化中的使用(如 SLAM)
在 GTSAM 或 Ceres 等优化库中,经常用一阶或二阶泰勒展开来逼近非线性残差函数:
设残差函数 r(x)r(\mathbf{x})r(x),优化变量 x\mathbf{x}x 附近一阶展开:
r(x+δ)≈r(x)+Jδ r(\mathbf{x} + \delta) \approx r(\mathbf{x}) + J \delta r(x+δ)≈r(x)+Jδ
其中 J=∂r∂xJ = \frac{\partial r}{\partial \mathbf{x}}J=∂x∂r 是雅可比矩阵,这是高斯-牛顿等算法的核心。
三、多元函数的极值判别法(极值充分条件)
判断多元函数 f(x,y)f(x, y)f(x,y) 在某点是否取得极值,步骤如下:
Step 1: 求偏导
fx(x,y)=0,fy(x,y)=0 f_x(x, y) = 0, \quad f_y(x, y) = 0 fx(x,y)=0,fy(x,y)=0
求解得驻点(候选极值点)。
Step 2: 构造海森矩阵(Hessian Matrix)
H=[fxxfxyfyxfyy] H = \begin{bmatrix} f_{xx} & f_{xy} \\ f_{yx} & f_{yy} \end{bmatrix} H=[fxxfyxfxyfyy]
记 D=det(H)=fxxfyy−(fxy)2D = \det(H) = f_{xx} f_{yy} - (f_{xy})^2D=det(H)=fxxfyy−(fxy)2
Step 3: 二阶判别条件
- 若 D>0D > 0D>0 且 fxx>0f_{xx} > 0fxx>0 → 极小值
- 若 D>0D > 0D>0 且 fxx<0f_{xx} < 0fxx<0 → 极大值
- 若 D<0D < 0D<0 → 鞍点(非极值点)
- 若 D=0D = 0D=0 → 无法判别(需更高阶展开)
示例:
f(x,y)=x2+y2+xy f(x, y) = x^2 + y^2 + xy f(x,y)=x2+y2+xy
-
梯度:
fx=2x+y,fy=2y+x⇒x=y=0为驻点 f_x = 2x + y, \quad f_y = 2y + x \Rightarrow x = y = 0 \quad \text{为驻点} fx=2x+y,fy=2y+x⇒x=y=0为驻点
-
二阶导数:
fxx=2,fyy=2,fxy=1⇒D=2⋅2−12=3>0⇒fxx=2>0⇒(0,0)为极小值点 f_{xx} = 2, f_{yy} = 2, f_{xy} = 1 \Rightarrow D = 2 \cdot 2 - 1^2 = 3 > 0 \Rightarrow f_{xx} = 2 > 0 \Rightarrow (0, 0) 为极小值点 fxx=2,fyy=2,fxy=1⇒D=2⋅2−12=3>0⇒fxx=2>0⇒(0,0)为极小值点
四、误差传播应用实战
在**误差传播(Error Propagation)**中,泰勒展开是分析非线性函数对输入误差敏感性的核心工具,尤其是一阶展开被广泛用于估计输出协方差。下面详细说明:
1、误差传播的基本思想
给定一个输入变量向量 x∈Rn\mathbf{x} \in \mathbb{R}^nx∈Rn,具有均值 xˉ\bar{\mathbf{x}}xˉ 和协方差矩阵 Σx\Sigma_xΣx,其经过非线性变换:
y=f(x)∈Rm \mathbf{y} = f(\mathbf{x}) \in \mathbb{R}^m y=f(x)∈Rm
我们希望估计输出 y\mathbf{y}y 的协方差矩阵 Σy\Sigma_yΣy。
2、一阶泰勒展开用于误差传播
在输入均值点 xˉ\bar{\mathbf{x}}xˉ 附近进行一阶展开:
f(x)≈f(xˉ)+J(x−xˉ) f(\mathbf{x}) \approx f(\bar{\mathbf{x}}) + J (\mathbf{x} - \bar{\mathbf{x}}) f(x)≈f(xˉ)+J(x−xˉ)
其中:
- J=∂f∂x∣xˉ∈Rm×nJ = \left. \frac{\partial f}{\partial \mathbf{x}} \right|_{\bar{\mathbf{x}}} \in \mathbb{R}^{m \times n}J=∂x∂f xˉ∈Rm×n 是雅可比矩阵
那么,输出协方差 Σy\Sigma_yΣy 近似为:
Σy≈JΣxJT \Sigma_y \approx J \Sigma_x J^T Σy≈JΣxJT
这就是经典的线性误差传播公式。
3、实际示例(坐标转换)
场景:从极坐标 (r,θ)(r, \theta)(r,θ) 转换到笛卡尔坐标 (x,y)(x, y)(x,y)
定义转换:
f(r,θ)=[xy]=[rcosθrsinθ] f(r, \theta) = \begin{bmatrix} x \\ y \end{bmatrix} =\begin{bmatrix} r \cos \theta \\ r \sin \theta \end{bmatrix} f(r,θ)=[xy]=[rcosθrsinθ]
假设:
- 输入 xˉ=[rθ]\bar{\mathbf{x}} = \begin{bmatrix} r \\ \theta \end{bmatrix}xˉ=[rθ]
- 输入协方差为:
Σx=[σr200σθ2] \Sigma_x = \begin{bmatrix} \sigma_r^2 & 0 \\ 0 & \sigma_\theta^2 \end{bmatrix} Σx=[σr200σθ2]
计算雅可比矩阵:
J=[cosθ−rsinθsinθrcosθ] J = \begin{bmatrix} \cos \theta & -r \sin \theta \\ \sin \theta & r \cos \theta \end{bmatrix} J=[cosθsinθ−rsinθrcosθ]
代入误差传播公式:
Σy=JΣxJT \Sigma_y = J \Sigma_x J^T Σy=JΣxJT
就得到了 (x,y)(x, y)(x,y) 的协方差。
4、在 SLAM / GTSAM 中的应用场景
| 应用场景 | 描述 |
|---|---|
| IMU 预积分误差传播 | 用一阶泰勒近似推导预积分中速度/位置的协方差更新 |
| 点云 ICP / 位姿图优化中 | 将相对变换误差从局部坐标系传播到世界系:使用雅可比左乘传播 |
| 视觉SLAM中三角化点的不确定性传播 | 将图像点误差通过三角化过程传播到3D点的协方差 |
| 优化中残差的线性化 | 高斯-牛顿、LM 中都依赖于雅可比传播误差与协方差 |
5、Python 示例代码
以上面的极坐标转直角坐标为例:
import numpy as np
# 均值点
r = 2.0
theta = np.pi / 4
# 输入协方差
sigma_r = 0.05
sigma_theta = 0.02
Sigma_x = np.diag([sigma_r**2, sigma_theta**2])
# 计算雅可比
J = np.array([
[np.cos(theta), -r * np.sin(theta)],
[np.sin(theta), r * np.cos(theta)]
])
# 输出协方差
Sigma_y = J @ Sigma_x @ J.T
print("Output covariance Σ_y:\n", Sigma_y)
6、总结
| 项目 | 内容 |
|---|---|
| 使用条件 | 非线性函数可微,输入误差较小(局部线性近似有效) |
| 优点 | 计算快速,适合高频状态估计(如 IMU 融合) |
| 局限 | 线性化误差大时不准,需二阶或采样方法(如 UKF、蒙特卡洛) |
| 常用工具 | 雅可比矩阵、协方差传播、残差线性化 |
五、总结表格
| 内容 | 表达式 | 作用 |
|---|---|---|
| 一阶泰勒展开 | f(x)≈f(x0)+∇f⊤Δxf(\mathbf{x}) \approx f(\mathbf{x}_0) + \nabla f^\top \Delta \mathbf{x}f(x)≈f(x0)+∇f⊤Δx | 一阶近似 |
| 二阶泰勒展开 | 加上 12Δx⊤HΔx\frac{1}{2} \Delta x^\top H \Delta x21Δx⊤HΔx | 曲率控制精度更高 |
| 极值判断 | 利用 Hessian 矩阵的行列式 DDD 和符号 | 判定极大、极小或鞍点 |
更多推荐
所有评论(0)