Ceres Solver数值微分方法详解
数值微分基础概念
在优化问题中,我们经常需要计算目标函数的导数。当解析导数难以获得时,数值微分提供了一种实用的替代方案。Ceres Solver作为一款强大的非线性优化库,提供了多种数值微分方法的选择。
数值微分的核心思想源自导数的定义:
$$ Df(x) = \lim_{h \rightarrow 0} \frac{f(x + h) - f(x)}{h} $$
由于计算机无法处理极限运算,我们使用有限差分来近似导数计算。
前向差分法
基本原理
前向差分是最简单的数值微分方法,其公式为:
$$ Df(x) \approx \frac{f(x + h) - f(x)}{h} $$
在Ceres Solver中实现前向差分非常简单。以Rat43模型为例,我们首先定义一个函子(Functor)来计算残差,然后使用NumericDiffCostFunction进行包装:
struct Rat43CostFunctor {
Rat43CostFunctor(const double x, const double y) : x_(x), y_(y) {}
bool operator()(const double* parameters, double* residuals) const {
const double b1 = parameters[0];
const double b2 = parameters[1];
const double b3 = parameters[2];
const double b4 = parameters[3];
residuals[0] = b1 * pow(1.0 + exp(b2 - b3 * x_), -1.0 / b4) - y_;
return true;
}
const double x_;
const double y_;
};
CostFunction* cost_function =
new NumericDiffCostFunction<Rat43CostFunctor, FORWARD, 1, 4>(x, y);
误差分析
通过泰勒展开分析,前向差分的截断误差为O(h)。这意味着误差随步长h线性减小,但实际应用中不能无限减小h,因为过小的h会导致浮点数舍入误差增大。
中心差分法
改进方法
中心差分公式提供了更好的近似:
$$ Df(x) \approx \frac{f(x + h) - f(x - h)}{2h} $$
虽然计算成本是前向差分的两倍(需要两次函数求值),但其误差为O(h²),收敛速度更快。
在Ceres中使用中心差分只需修改模板参数:
CostFunction* cost_function =
new NumericDiffCostFunction<Rat43CostFunctor, CENTRAL, 1, 4>(
new Rat43CostFunctor(x, y));
实际比较
对于函数f(x) = eˣ/(sinx - x²)在x=1.0处的导数计算:
- 解析值:140.73773557129658
- 前向差分(h=0.0001):相对误差约10⁻⁵
- 中心差分(h=0.0001):相对误差约10⁻¹⁰
中心差分在相同步长下精度显著提高。
Ridders方法
高阶改进
Ridders方法通过Richardson外推技术,实现了更高阶的误差收敛(O(h²ⁿ))。它构建一个差分表来逐步提高精度:
A(1,1) A(1,2) A(1,3) ...
A(2,1) A(2,2) ...
A(3,1) ...
每增加一列需要两次函数求值,但精度呈指数级提高。
在Ceres中使用Ridders方法:
CostFunction* cost_function =
new NumericDiffCostFunction<Rat43CostFunctor, RIDDERS, 1, 4>(
new Rat43CostFunctor(x, y));
性能比较
对于Rat43模型,不同方法的计算时间(ns):
| 方法 | 时间 | |---------------------|-------| | 解析导数 | 255 | | 优化解析导数 | 92 | | 前向差分 | 262 | | 中心差分 | 517 | | Ridders方法 | 3760 |
实践建议
-
步长选择:Ceres使用相对步长(默认为10⁻⁶),对于接近零的参数会自动切换为固定步长
-
方法选择:
- 优先使用中心差分而非前向差分
- 当精度要求高且计算时间不是主要考量时,使用Ridders方法
- 避免使用过小的步长,以免浮点误差主导计算结果
-
应用场景:数值微分最适合用于外部库函数或无法获取解析导数的情形
数值微分是Ceres Solver强大功能的重要组成部分,理解这些方法的特性和适用场景,将帮助您在实际问题中做出更明智的选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考