|  | .. default-domain:: cpp | 
|  |  | 
|  | .. cpp:namespace:: ceres | 
|  |  | 
|  | .. _chapter-on_derivatives: | 
|  |  | 
|  | ============== | 
|  | On Derivatives | 
|  | ============== | 
|  |  | 
|  | Ceres Solver, like all gradient based optimization algorithms, depends | 
|  | on being able to evaluate the objective function and its derivatives | 
|  | at arbitrary points in its domain. Indeed, defining the objective | 
|  | function and its `Jacobian | 
|  | <https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant>`_ is | 
|  | the principal task that the user is required to perform when solving | 
|  | an optimization problem using Ceres Solver. The correct and efficient | 
|  | computation of the Jacobian is the key to good performance. | 
|  |  | 
|  | Ceres Solver offers considerable flexibility in how the user can | 
|  | provide derivatives to the solver. She can use: | 
|  |  | 
|  | #. :ref:`chapter-analytical_derivatives`: The user figures out the | 
|  | derivatives herself, by hand or using a tool like `Maple | 
|  | <https://www.maplesoft.com/products/maple/>`_ or `Mathematica | 
|  | <https://www.wolfram.com/mathematica/>`_, and implements them in a | 
|  | :class:`CostFunction`. | 
|  | #. :ref:`chapter-numerical_derivatives`: Ceres numerically computes | 
|  | the derivative using finite differences. | 
|  | #. :ref:`chapter-automatic_derivatives`: Ceres automatically computes | 
|  | the analytic derivative using C++ templates and operator | 
|  | overloading. | 
|  |  | 
|  | Which of these three approaches (alone or in combination) should be | 
|  | used depends on the situation and the tradeoffs the user is willing to | 
|  | make. Unfortunately, numerical optimization textbooks rarely discuss | 
|  | these issues in detail and the user is left to her own devices. | 
|  |  | 
|  | The aim of this article is to fill this gap and describe each of these | 
|  | three approaches in the context of Ceres Solver with sufficient detail | 
|  | that the user can make an informed choice. | 
|  |  | 
|  | For the impatient amongst you, here is some high level advice: | 
|  |  | 
|  | #. Use :ref:`chapter-automatic_derivatives`. | 
|  | #. In some cases it maybe worth using | 
|  | :ref:`chapter-analytical_derivatives`. | 
|  | #. Avoid :ref:`chapter-numerical_derivatives`. Use it as a measure of | 
|  | last resort, mostly to interface with external libraries. | 
|  |  | 
|  | For the rest, read on. | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 1 | 
|  |  | 
|  | spivak_notation | 
|  | analytical_derivatives | 
|  | numerical_derivatives | 
|  | automatic_derivatives | 
|  | interfacing_with_autodiff | 
|  | inverse_and_implicit_function_theorems |