|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<html class="no-js" lang="en" >
|
|
Packit |
ea1746 |
<head>
|
|
Packit |
ea1746 |
<meta charset="utf-8">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<title>Numeric derivatives — Ceres Solver</title>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<link rel="top" title="Ceres Solver" href="index.html"/>
|
|
Packit |
ea1746 |
<link rel="up" title="On Derivatives" href="derivatives.html"/>
|
|
Packit |
ea1746 |
<link rel="next" title="Automatic Derivatives" href="automatic_derivatives.html"/>
|
|
Packit |
ea1746 |
<link rel="prev" title="Analytic Derivatives" href="analytical_derivatives.html"/>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<script src="_static/js/modernizr.min.js"></script>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
</head>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<body class="wy-body-for-nav" role="document">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Ceres Solver
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
1.13
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
|
|
Packit |
ea1746 |
<input type="text" name="q" placeholder="Search docs" />
|
|
Packit |
ea1746 |
<input type="hidden" name="check_keywords" value="yes" />
|
|
Packit |
ea1746 |
<input type="hidden" name="area" value="default" />
|
|
Packit |
ea1746 |
</form>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Why?
|
|
Packit |
ea1746 |
Installation
|
|
Packit |
ea1746 |
Tutorial
|
|
Packit |
ea1746 |
On Derivatives
|
|
Packit |
ea1746 |
Spivak Notation
|
|
Packit |
ea1746 |
Analytic Derivatives
|
|
Packit |
ea1746 |
Numeric derivatives
|
|
Packit |
ea1746 |
Forward Differences
|
|
Packit |
ea1746 |
Implementation Details
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Central Differences
|
|
Packit |
ea1746 |
Ridders’ Method
|
|
Packit |
ea1746 |
Recommendations
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Automatic Derivatives
|
|
Packit |
ea1746 |
Interfacing with Automatic Differentiation
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Modeling Non-linear Least Squares
|
|
Packit |
ea1746 |
Solving Non-linear Least Squares
|
|
Packit |
ea1746 |
Covariance Estimation
|
|
Packit |
ea1746 |
General Unconstrained Minimization
|
|
Packit |
ea1746 |
FAQS, Tips & Tricks
|
|
Packit |
ea1746 |
Users
|
|
Packit |
ea1746 |
Contributing
|
|
Packit |
ea1746 |
Version History
|
|
Packit |
ea1746 |
Bibliography
|
|
Packit |
ea1746 |
License
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
</nav>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Ceres Solver
|
|
Packit |
ea1746 |
</nav>
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Docs »
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
On Derivatives »
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Numeric derivatives
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Numeric derivatives¶
|
|
Packit |
ea1746 |
The other extreme from using analytic derivatives is to use numeric
|
|
Packit |
ea1746 |
derivatives. The key observation here is that the process of
|
|
Packit |
ea1746 |
differentiating a function \(f(x)\) w.r.t \(x\) can be written
|
|
Packit |
ea1746 |
as the limiting process:
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
\[Df(x) = \lim_{h \rightarrow 0} \frac{f(x + h) - f(x)}{h}\]
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Forward Differences¶
|
|
Packit |
ea1746 |
Now of course one cannot perform the limiting operation numerically on
|
|
Packit |
ea1746 |
a computer so we do the next best thing, which is to choose a small
|
|
Packit |
ea1746 |
value of \(h\) and approximate the derivative as
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
\[Df(x) \approx \frac{f(x + h) - f(x)}{h}\]
|
|
Packit |
ea1746 |
The above formula is the simplest most basic form of numeric
|
|
Packit |
ea1746 |
differentiation. It is known as the Forward Difference formula.
|
|
Packit |
ea1746 |
So how would one go about constructing a numerically differentiated
|
|
Packit |
ea1746 |
version of Rat43Analytic (Rat43) in
|
|
Packit |
ea1746 |
Ceres Solver. This is done in two steps:
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
Define Functor that given the parameter values will evaluate the
|
|
Packit |
ea1746 |
residual for a given \((x,y)\).
|
|
Packit |
ea1746 |
Construct a CostFunction by using
|
|
Packit |
ea1746 |
NumericDiffCostFunction to wrap an instance of
|
|
Packit |
ea1746 |
Rat43CostFunctor .
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
struct Rat43CostFunctor {
|
|
Packit |
ea1746 |
Rat43CostFunctor(const double x, const double y) : x_(x), y_(y) {}
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
bool operator()(const double* parameters, double* residuals) const {
|
|
Packit |
ea1746 |
const double b1 = parameters[0];
|
|
Packit |
ea1746 |
const double b2 = parameters[1];
|
|
Packit |
ea1746 |
const double b3 = parameters[2];
|
|
Packit |
ea1746 |
const double b4 = parameters[3];
|
|
Packit |
ea1746 |
residuals[0] = b1 * pow(1.0 + exp(b2 - b3 * x_), -1.0 / b4) - y_;
|
|
Packit |
ea1746 |
return true;
|
|
Packit |
ea1746 |
}
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
const double x_;
|
|
Packit |
ea1746 |
const double y_;
|
|
Packit |
ea1746 |
}
|
|
Packit |
ea1746 |
|
|
Packit |
ea1746 |
CostFunction* cost_function =
|
|
Packit |
ea1746 |
new NumericDiffCostFunction<Rat43CostFunctor, FORWARD, 1, 4>(
|
|
Packit |
ea1746 |
new Rat43CostFunctor(x, y));
|