mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-30 00:50:37 +08:00
a04490be97
Change-Id: I9468b6a7b9f2ffdd2bf9f0dd1f4e1d5f894e540c
43 lines
2.1 KiB
Markdown
43 lines
2.1 KiB
Markdown
Sampled Functions
|
||
--
|
||
|
||
It is common to not have an analytical representation of the optimization
|
||
problem but rather a table of values at specific inputs. This commonly occurs
|
||
when working with images or when the functions in the problem are expensive to
|
||
evaluate. To use this data in an optimization problem we can use interpolation
|
||
to evaluate the function and derivatives at intermediate input values.
|
||
|
||
There are many libraries that implement a variety of interpolation schemes, but
|
||
it is difficult to use them in Ceres' automatic differentiation framework.
|
||
Instead, Ceres provides the ability to interpolate one and two dimensional data.
|
||
|
||
The one dimensional interpolation is based on the Cubic Hermite Spline. This
|
||
interpolation method requires knowledge of the function derivatives at the
|
||
control points, however we only know the function values. Consequently, we will
|
||
use the data to estimate derivatives at the control points. The choice of how to
|
||
compute the derivatives is not unique and Ceres uses the Catmull–Rom Spline
|
||
variant which uses `0.5 * (p_{k+1} - p_{k-1})` as the derivative for control
|
||
point `p_k.` This produces a first order differentiable interpolating
|
||
function. The two dimensional interpolation scheme is a generalization of the
|
||
one dimensional scheme where the interpolating function is assumed to be
|
||
separable in the two dimensions.
|
||
|
||
This example shows how to use interpolation schemes within the Ceres automatic
|
||
differentiation framework. This is a one dimensional example and the objective
|
||
function is to minimize `0.5 * f(x)^2` where `f(x) = (x - 4.5)^2`.
|
||
|
||
It is also possible to use analytical derivatives with the provided
|
||
interpolation schemes by using a `SizedCostFunction` and defining the
|
||
``Evaluate` function. For this example, the evaluate function would be:
|
||
|
||
```c++
|
||
bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const {
|
||
if (jacobians == NULL || jacobians[0] == NULL)
|
||
interpolator_.Evaluate(parameters[0][0], residuals);
|
||
else
|
||
interpolator_.Evaluate(parameters[0][0], residuals, jacobians[0]);
|
||
|
||
return true;
|
||
}
|
||
```
|