Optimization Toolbox
  Go to function:
    Search    Help Desk 
fsolve    Examples   See Also

Solve a system of nonlinear equations

for x, where x is a vector and F(x) is a function that returns a vector value.

Syntax

Description

fsolve finds a root (zero) of a system of nonlinear equations.

x = fsolve(fun,x0) starts at x0 and tries to solve the equations described in fun.

x = fsolve(fun,x0,options) minimizes with the optimization parameters specified in the structure options.

x = fsolve(fun,x0,options,P1,P2,...) passes the problem-dependent parameters P1, P2, etc., directly to the function fun. Pass an empty matrix for options to use the default values for options.

[x,fval] = fsolve(fun,x0) returns the value of the objective function fun at the solution x.

[x,fval,exitflag] = fsolve(...) returns a value exitflag that describes the exit condition.

[x,fval,exitflag,output] = fsolve(...) returns a structure output that contains information about the optimization.

[x,fval,exitflag,output,jacobian] = fsolve(...) returns the Jacobian of fun at the solution x.

Arguments

The arguments passed into the function are described in Table 1-1. The arguments returned by the function are described in Table 1-2. Details relevant to fsolve are included below for fun, options, exitflag, and output.

fun
The function to be minimized. fun takes a vector x and returns a vector F of the nonlinear equations evaluated at x. You can specify fun to be an inline object. For example,

    x = fsolve(inline('sin(x.*x)'),x0)
    
Alternatively, fun can be a string containing the name of a function (an M-file, a built-in function, or a MEX-file). If fun='myfun' then the M-file function myfun.m would have the form

    function F = myfun(x)
    F = ...            % Compute function values at x
    

If the Jacobian can also be computed and options.Jacobian is 'on', set by

    options = optimset('Jacobian','on')
    
then the function fun must return, in a second output argument, the Jacobian value J, a matrix, at x. Note that by checking the value of nargout the function can avoid computing J when fun is called with only one output argument (in the case where the optimization algorithm only needs the value of F but not J):


    function [F,J] = myfun(x)
    F = ...          % objective function values at x
    if nargout > 1   % two output arguments
       J = ...   % Jacobian of the function evaluated at x
    end
    
If fun returns a vector (matrix) of m components and x has length n, then the Jacobian J is an m-by-n matrix where J(i,j) is the partial derivative of F(i) with respect to x(j). (Note that the Jacobian J is the transpose of the gradient of F.)

options
Optimization parameter options. You can set or change the values of these parameters using the optimset function. Some parameters apply to all algorithms, some are only relevant when using the large-scale algorithm, and others are only relevant when using the medium-scale algorithm.

We start by describing the LargeScale option since it states a preference for which algorithm to use. It is only a preference since certain conditions must be met to use the large-scale algorithm. For lsqnonlin, the nonlinear system of equations cannot be underdetermined; that is, the number of equations (the number of elements of F returned by fun) must be at least as many as the length of x or else the medium-scale algorithm will be used.


Parameters used by both the large-scale and medium-scale algorithms:



Parameters used by the large-scale algorithm only:


Parameters used by the medium-scale algorithm only:

exitflag
Describes the exit condition:

output
A structure whose fields contain information about the optimization:

Examples

Example 1: Find a zero of the system of two equations and two unknowns

Thus we want to solve the following system for x

starting at x0 = [-5 -5].

First, write an M-file that computes F, the values of the equations at x:

Next, call an optimization routine:

After 28 function evaluations, a zero is found:

Iteration

Func-count

f(x)

Norm of

step

First-order

optimality

CG-iterations

1

4

47071.2

1

2.29e+004

0

2

7

6527.47

1.45207

3.09e+003

1

3

10

918.372

1.49186

418

1

4

13

127.74

1.55326

57.3

1

5

16

14.9153

1.57591

8.26

1

6

19

0.779051

1.27662

1.14

1

7

22

0.00372453

0.484658

0.0683

1

8

25

9.21617e-008

0.0385552

0.000336

1

9

28

5.66133e-017

0.000193707

8.34e-009

1

Example 2: Find a matrix x that satisfies the equation

starting at the point x= [1,1; 1,1].

First, write an M-file that computes the equations to be solved:

Next, invoke an optimization routine:

The solution is

and the residual is close to zero

Notes

If the system of equations is linear, then \ (the backslash operator: see      help slash) should be used for better speed and accuracy. For example, say we want to find the solution to the following linear system of equations:

Then the problem is formulated and solved as

Algorithm

The methods are based on the nonlinear least-squares algorithms also used in lsqnonlin. The advantage of using a least-squares method is that if the system of equations is never zero due to small inaccuracies, or because it just does not have a zero, the algorithm still returns a point where the residual is small. However, if the Jacobian of the system is singular, the algorithm may converge to a point that is not a solution of the system of equations (see Limitations and Diagnostics below).

Large-scale optimization.    By default fsolve will choose the large-scale algorithm. The algorithm is a subspace trust region method and is based on the interior-reflective Newton method described in [5],[6]. Each iteration involves the approximate solution of a large linear system using the method of preconditioned conjugate gradients (PCG). See the trust-region and preconditioned conjugate gradient method descriptions in the Large-Scale Algorithms chapter.

Medium-scale optimization.    fsolve with options.LargeScale set to 'off' uses the Gauss-Newton method [4] with line-search. Alternatively, a Levenberg-Marquardt method [1], [2], [3] with line-search may be selected. The choice of algorithm is made by setting options.LevenbergMarquardt. Setting options.LevenbergMarquardt to 'on' (and options.LargeScale to 'off') selects the Levenberg-Marquardt method.

The default line search algorithm, i.e., options.LineSearchType set to 'quadcubic', is a safeguarded mixed quadratic and cubic polynomial interpolation and extrapolation method. A safeguarded cubic polynomial method can be selected by setting options.LineSearchType to 'cubicpoly'. This method generally requires fewer function evaluations but more gradient evaluations. Thus, if gradients are being supplied and can be calculated inexpensively, the cubic polynomial line search method is preferable. The algorithms used are described fully in the Introduction to Algorithms chapter.

Diagnostics

fsolve may converge to a nonzero point and give this message

In this case, run fsolve again with other starting values.

Limitations

The function to be solved must be continuous. When successful, fsolve only gives one root. fsolve may converge to a nonzero point, in which case, try other starting values.

fsolve only handles real variables. When x has complex variables, the variables must be split into real and imaginary parts.

Large-scale optimization.    Currently, if the analytical Jacobian is provided in fun, the options parameter DerivativeCheck cannot be used with the large-scale method to compare the analytic Jacobian to the finite-difference Jacobian. Instead, use the medium-scale method to check the derivative with options parameter MaxIter set to 0 iterations. Then run the problem again with the large-scale method. See Table 1-4 for more information on what problem formulations are covered and what information must be provided.

The preconditioner computation used in the preconditioned conjugate gradient part of the large-scale method forms JTJ (where J is the Jacobian matrix) before computing the preconditioner; therefore, a row of J with many nonzeros, which results in a nearly dense product JTJ, may lead to a costly solution process for large problems.

See Also

\, optimset, lsqnonlin, lsqcurvefit, inline

References

[1] Levenberg, K., "A Method for the Solution of Certain Problems in Least Squares," Quarterly Applied Mathematics 2, pp. 164-168, 1944.

[2] Marquardt, D., "An Algorithm for Least-squares Estimation of Nonlinear Parameters," SIAM Journal Applied Mathematics, Vol. 11, pp. 431-441, 1963.

[3] More, J. J., "The Levenberg-Marquardt Algorithm: Implementation and Theory," Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, pp. 105-116, 1977.

[4] Dennis, J. E. Jr., "Nonlinear Least Squares," State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269-312.

[5] Coleman, T.F. and Y. Li, "On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds," Mathematical Programming, Vol. 67, Number 2, pp. 189-224, 1994.

[6] Coleman, T.F. and Y. Li, "An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds," SIAM Journal on Optimization, Vol. 6, pp. 418-445, 1996.



[ Previous | Help Desk | Next ]