Documentation |
In the example Nonlinear Equations with Analytic Jacobian, the function bananaobj evaluates F and computes the Jacobian J. What if the code to compute the Jacobian is not available? By default, if you do not indicate that the Jacobian can be computed in the objective function (by setting the Jacobian option in options to 'on'), fsolve, lsqnonlin, and lsqcurvefit instead use finite differencing to approximate the Jacobian. This is the default Jacobian option. You can select finite differencing by setting Jacobian to 'off' using optimoptions.
This example uses bananaobj from the example Nonlinear Equations with Analytic Jacobian as the objective function, but sets Jacobian to 'off' so that fsolve approximates the Jacobian and ignores the second bananaobj output.
n = 64; x0(1:n,1) = -1.9; x0(2:2:n,1) = 2; options = optimoptions(@fsolve,'Display','iter','Jacobian','off'); [x,F,exitflag,output,JAC] = fsolve(@bananaobj,x0,options);
The example produces the following output:
Norm of First-order Trust-region Iteration Func-count f(x) step optimality radius 0 65 8563.84 615 1 1 130 3093.71 1 329 1 2 195 225.104 2.5 34.8 2.5 3 260 212.48 6.25 34.1 6.25 4 261 212.48 6.25 34.1 6.25 5 326 102.771 1.5625 6.39 1.56 6 327 102.771 3.90625 6.39 3.91 7 392 87.7443 0.976562 2.19 0.977 8 457 74.1426 2.44141 6.27 2.44 9 458 74.1426 2.44141 6.27 2.44 10 523 52.497 0.610352 1.52 0.61 11 588 41.3297 1.52588 4.63 1.53 12 653 34.5115 1.52588 6.97 1.53 13 718 16.9716 1.52588 4.69 1.53 14 783 8.16797 1.52588 3.77 1.53 15 848 3.55178 1.52588 3.56 1.53 16 913 1.38476 1.52588 3.31 1.53 17 978 0.219553 1.16206 1.66 1.53 18 1043 0 0.0468565 0 1.53 Equation solved. fsolve completed because the vector of function values is near zero as measured by the default value of the function tolerance, and the problem appears regular as measured by the gradient.
The finite-difference version of this example requires the same number of iterations to converge as the analytic Jacobian version in the preceding example. It is generally the case that both versions converge at about the same rate in terms of iterations. However, the finite-difference version requires many additional function evaluations. The cost of these extra evaluations might or might not be significant, depending on the particular problem.