| .. 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 |