This example shows how to solve a nonlinear minimization problem
with an explicit tridiagonal Hessian matrix *H*(*x*).

The problem is to find *x* to minimize

$$f(x)={\displaystyle \sum _{i=1}^{n-1}\left({\left({x}_{i}^{2}\right)}^{\left({x}_{i+1}^{2}+1\right)}+{\left({x}_{i+1}^{2}\right)}^{\left({x}_{i}^{2}+1\right)}\right)},$$ | (6-16) |

where *n* = `1000`

.

The file is lengthy so is not included here. View the code with the command

type brownfgh

Because `brownfgh`

computes the gradient and
Hessian values as well as the objective function, you need to use `optimoptions`

to indicate that this information
is available in `brownfgh`

, using the `SpecifyObjectiveGradient`

and `HessianFcn`

options.

n = 1000; xstart = -ones(n,1); xstart(2:2:n,1) = 1; options = optimoptions(@fminunc,'Algorithm','trust-region',... 'SpecifyObjectiveGradient',true,'HessianFcn','objective'); [x,fval,exitflag,output] = fminunc(@brownfgh,xstart,options);

This 1000 variable problem is solved in about 7 iterations and
7 conjugate gradient iterations with a positive `exitflag`

indicating
convergence. The final function value and measure of optimality at
the solution `x`

are both close to zero. For `fminunc`

, the first order optimality is
the infinity norm of the gradient of the function, which is zero at
a local minimum:

fval,exitflag,output fval = 2.8709e-17 exitflag = 1 output = struct with fields: iterations: 7 funcCount: 8 stepsize: 0.0039 cgiterations: 7 firstorderopt: 4.7948e-10 algorithm: 'trust-region' message: 'Local minimum found.…' constrviolation: []

Was this topic helpful?