Ceres Solver数值微分方法详解

Ceres Solver数值微分方法详解

ceres-solver A large scale non-linear optimization library ceres-solver 项目地址: https://gitcode.com/gh_mirrors/ce/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 |

实践建议

  1. 步长选择:Ceres使用相对步长(默认为10⁻⁶),对于接近零的参数会自动切换为固定步长

  2. 方法选择

    • 优先使用中心差分而非前向差分
    • 当精度要求高且计算时间不是主要考量时,使用Ridders方法
    • 避免使用过小的步长,以免浮点误差主导计算结果
  3. 应用场景:数值微分最适合用于外部库函数或无法获取解析导数的情形

数值微分是Ceres Solver强大功能的重要组成部分,理解这些方法的特性和适用场景,将帮助您在实际问题中做出更明智的选择。

ceres-solver A large scale non-linear optimization library ceres-solver 项目地址: https://gitcode.com/gh_mirrors/ce/ceres-solver

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方蕾嫒Falcon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值