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 SpecifyObjectiveGradient
option in
options
to true
), 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
SpecifyObjectiveGradient
to false
using
optimoptions
.
This example uses bananaobj
from the example Nonlinear Equations with Analytic Jacobian as the objective function, but
sets SpecifyObjectiveGradient
to false
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','SpecifyObjectiveGradient',false); [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 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.