| Optimization Toolbox | Search  Help Desk |
| fsolve | Examples See Also |
Solve a system of nonlinear equations
Syntax
x = fsolve(fun,x0) x = fsolve(fun,x0,options) x = fsolve(fun,x0,options,P1,P2, ... ) [x,fval] = fsolve(...) [x,fval,exitflag] = fsolve(...) [x,fval,exitflag,output] = fsolve(...) [x,fval,exitflag,output,jacobian] = fsolve(...)
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 tofsolve 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 endIf 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: | |
|
|
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:
function F = myfun(x) F = [2*x(1) - x(2) - exp(-x(1)); -x(1) + 2*x(2) - exp(-x(2))];Next, call an optimization routine:
x0 = [-5; -5]; % Make a starting guess at the solution
options=optimset('Display','iter'); % Option to display output
[x,fval] = fsolve('myfun',x0,options) % call optimizer
After 28 function evaluations, a zero is found:Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x =
0.5671
0.5671
fval =
1.0e-08 *
-0.5320
-0.5320
Example 2: Find a matrix x that satisfies the equation
x= [1,1; 1,1].
First, write an M-file that computes the equations to be solved:
function F = myfun(x) F = x*x*x-[1,2;3,4];Next, invoke an optimization routine:
x0 = ones(2,2); % Make a starting guess at the solution
options = optimset('Display','off'); % Turn off Display
[x,Fval,exitflag] = fsolve('myfun',x0,options)
The solution is
x =
-0.1291 0.8602
1.2903 1.1612
Fval =
1.0e-03 *
0.1541 -0.1163
0.0109 -0.0243
exitflag =
1
and the residual is close to zero
sum(sum(Fval.*Fval))
ans =
3.7974e-008
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:
A = [ 3 11 -2; 1 1 -2; 1 -1 1];
b = [ 7; 4; 19];
x = A\b
x =
13.2188
-2.3438
3.4375
Algorithm
The methods are based on the nonlinear least-squares algorithms also used inlsqnonlin. 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
Optimizer is stuck at a minimum that is not a root Try again with a new starting guessIn 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.