LineSearch.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include <cstddef>
7 
9 /*!
10  * \brief Find the next step length for the line-search globalization
11  *
12  * The next step length is chosen such that it minimizes the quadratic (first
13  * globalization step, i.e., when `globalization_iteration_id` is 0) or cubic
14  * (subsequent globalization steps) polynomial interpolation. This function
15  * implements Algorithm A6.1.3 in \cite DennisSchnabel (p. 325). This is how
16  * argument names map to symbols in that algorithm:
17  *
18  * - `step_length`: \f$\lambda\f$
19  * - `prev_step_length`: \f$\lambda_\mathrm{prev}\f$
20  * - `residual`: \f$f_c\f$
21  * - `residual_slope`: \f$g^T p < 0\f$
22  * - `next_residual`: \f$f_+\f$
23  * - `prev_residual`: \f$f_{+,\mathrm{prev}}\f$
24  *
25  * Note that the argument `residual_slope` is the derivative of the residual
26  * function \f$f\f$ w.r.t. the step length, i.e.
27  * \f$\frac{\mathrm{d}f}{\mathrm{d}\lambda}\f$, which must be negative. For the
28  * common scenario where \f$f(x)=|\boldsymbol{r}(x)|^2\f$, i.e. the residual
29  * function is the L2 norm of a residual vector \f$\boldsymbol{r}(x)\f$, and
30  * where that in turn is the residual of a nonlinear equation
31  * \f$\boldsymbol{r}(x)=b-A_\mathrm{nonlinear}(x)\f$ in a Newton-Raphson step as
32  * described in `NonlinearSolver::newton_raphson::NewtonRaphson`, then the
33  * `residual_slope` reduces to
34  *
35  * \f{equation}
36  * \frac{\mathrm{d}f}{\mathrm{d}\lambda} =
37  * \frac{\mathrm{d}f}{\mathrm{d}x^i} \frac{\mathrm{d}x^i}{\mathrm{d}\lambda} =
38  * 2 \boldsymbol{r}(x) \cdot \frac{\mathrm{d}\boldsymbol{r}}{\mathrm{d}x^i}
39  * \frac{\mathrm{d}x^i}{\mathrm{d}\lambda} =
40  * -2 |\boldsymbol{r}(x)|^2 = -2 f(x) \equiv -2 f_c
41  * \text{.}
42  * \f}
43  *
44  * Here we have used the relation
45  *
46  * \f{equation}
47  * \frac{\mathrm{d}\boldsymbol{r}}{\mathrm{d}x^i}
48  * \frac{\mathrm{d}x^i}{\mathrm{d}\lambda} =
49  * -\frac{\delta A_\mathrm{nonlinear}}{\delta x}\cdot\delta x = -r
50  * \f}
51  *
52  * of a Newton-Raphson step of full length \f$\delta x\f$.
53  */
54 double next_step_length(size_t globalization_iteration_id, double step_length,
55  double prev_step_length, double residual,
56  double residual_slope, double next_residual,
57  double prev_residual) noexcept;
58 } // namespace NonlinearSolver::newton_raphson
NonlinearSolver::newton_raphson::next_step_length
double next_step_length(const size_t globalization_iteration_id, const double step_length, const double prev_step_length, const double residual, const double residual_slope, const double next_residual, const double prev_residual) noexcept
Find the next step length for the line-search globalization.
Definition: LineSearch.cpp:12
cstddef
NonlinearSolver::newton_raphson
Items related to the NewtonRaphson nonlinear solver.
Definition: ElementActions.hpp:48