This chapter is concerned with the calculation of zeros of continuous functions of one or more variables. The majority of problems considered are for realvalued functions of real variables, in which case complex equations must be expressed in terms of the equivalent larger system of real equations.
Syntax
C# 

public static class C05 
Visual Basic 

Public NotInheritable Class C05 
Visual C++ 

public ref class C05 abstract sealed 
F# 

[<AbstractClassAttribute>] [<SealedAttribute>] type C05 = class end 
Background to the Problems
The chapter divides naturally into two parts.
A Single Equation
The first deals with the real zeros of a real function of a single variable $f\left(x\right)$.
There are three methods with simple calling sequences. The first assumes that you can determine an initial interval $\left[a,b\right]$ within which the desired zero lies, (that is, where $f\left(a\right)\times f\left(b\right)<0$), and outside which all other zeros lie. The method then systematically subdivides the interval to produce a final interval containing the zero. This final interval has a length bounded by your specified error requirements; the end of the interval where the function has smallest magnitude is returned as the zero. This method is guaranteed to converge to a simple zero of the function. (Here we define a simple zero as a zero corresponding to a signchange of the function; none of the available methods are capable of making any finer distinction.) However, as with the other methods described below, a nonsimple zero might be determined and it is left to you to check for this. The algorithm used is due to Brent (1973).
The two other methods are both designed for the case where you are unable to specify an interval containing the simple zero. One starts from an initial point and performs a search for an interval containing a simple zero. If such an interval is computed then the method described above is used next to determine the zero accurately. The other method uses a ‘continuation’ method based on a secant iteration. A sequence of subproblems is solved; the first of these is trivial and the last is the actual problem of finding a zero of $f\left(x\right)$. The intermediate problems employ the solutions of earlier problems to provide initial guesses for the secant iterations used to calculate their solutions.
Three other methods are also supplied. They employ reverse communication and use the same core algorithms as the methods described above.
Finally, two methods are provided to return values of Lambert's $W$ function (sometimes known as the ‘product log’ or ‘Omega’ function), which is the inverse function of
that is, if Lambert's $W$ function $W\left(x\right)=a$ for $x,a\in C$, then $a$ is a zero of the function $F\left(w\right)=w{e}^{w}x$. One method uses the iterative method described in Barry et al. (1995) to return values from the real branches of $W$ (restricting $x,a\in R$). The second method enforces no such restriction, and uses the approach described in Corless et al. (1996).
$$f\left(w\right)=w{e}^{w}\text{\hspace{1em} for \hspace{1em}}w\in C\text{;}$$ 
Systems of Equations
The methods in the second part of this chapter are designed to solve a set of nonlinear equations in $n$ unknowns
where $\mathrm{T}$ stands for transpose.
$${f}_{i}\left(x\right)=0\text{, \hspace{1em}}i=1,2,\dots ,n\text{, \hspace{1em}}x={\left({x}_{1},{x}_{2},\dots ,{x}_{n}\right)}^{\mathrm{T}}\text{,}$$  (1) 
It is assumed that the functions are continuous and differentiable so that the matrix of first partial derivatives of the functions, the Jacobian matrix ${J}_{ij}\left(x\right)=\left(\frac{\partial {f}_{i}}{\partial {x}_{j}}\right)$ evaluated at the point $x$, exists, though it may not be possible to calculate it directly.
The functions ${f}_{i}$ must be independent, otherwise there will be an infinity of solutions and the methods will fail. However, even when the functions are independent the solutions may not be unique. Since the methods are iterative, an initial guess at the solution has to be supplied, and the solution located will usually be the one closest to this initial guess.
Recommendations on Choice and Use of Available Methods
Zeros of Functions of One Variable
The methods can be divided into two classes. There are three methods (c05av, c05ax and c05az) all written in reverse communication form and three (c05au, c05aw and c05ay) written in direct communication form. The direct communication methods are designed for inexperienced users and, in particular, for solving problems where the function $f\left(x\right)$ whose zero is to be calculated, can be coded as a usersupplied (sub)program. These methods find the zero by using the same core algorithms as the reverse communication methods. Experienced users are recommended to use the reverse communication methods directly as they permit you more control of the calculation. Indeed, if the zerofinding process is embedded in a much larger program then the reverse communication methods should always be used.
The recommendation as to which method should be used depends mainly on whether you can supply an interval $\left[a,b\right]$ containing the zero; that is, where $f\left(a\right)\times f\left(b\right)<0$. If the interval can be supplied, then c05ay (or, in reverse communication, c05az) should be used, in general. This recommendation should be qualified in the case when the only interval which can be supplied is very long relative to your error requirements and you can also supply a good approximation to the zero. In this case c05aw (or, in reverse communication, c05ax) may prove more efficient (though these latter methods will not provide the error bound available from c05az).
If an interval containing the zero cannot be supplied then you must choose between c05au (or, in reverse communication, c05av followed by c05az) and c05aw (or, in reverse communication, c05ax). c05au first determines an interval containing the zero, and then proceeds as in c05ay; it is particularly recommended when you do not have a good initial approximation to the zero. If a good initial approximation to the zero is available then c05aw is to be preferred. Since neither of these latter methods has guaranteed convergence to the zero, you are recommended to experiment with both in case of difficulty.
Solution of Sets of Nonlinear Equations
The solution of a set of nonlinear equations
can be regarded as a special case of the problem of finding a minimum of a sum of squares
So the methods in E04 class are relevant as well as the special nonlinear equations methods.
$${f}_{i}\left({x}_{1},{x}_{2},\dots ,{x}_{n}\right)=0\text{, \hspace{1em}}i=1,2,\dots ,n$$  (2) 
$$s\left(x\right)=\sum _{i=1}^{m}{\left[{f}_{i}\left({x}_{1},{x}_{2},\dots ,{x}_{n}\right)\right]}^{2}\text{, \hspace{1em}}\left(m\ge n\right)\text{.}$$  (3) 
The methods for solving a set of nonlinear equations can also be divided into classes. There are five methods ( c05qb c05qc (C05QSF not in this release) c05rb c05rc) all written in direct communication form and two (c05qd and c05rd) written in reverse communication form. The direct communication methods are designed for inexperienced users and, in particular, these methods require the ${f}_{i}$ (and possibly their derivatives) to be calculated in usersupplied delegates. These should be set up carefully so the Library methods can work as efficiently as possible. Experienced users are recommended to use the reverse communication methods as they permit you more control of the calculation. Indeed, if the zerofinding process is embedded in a much larger program then the reverse communication methods should always be used.
The main decision you have to make is whether to supply the derivatives $\frac{\partial {f}_{i}}{\partial {x}_{j}}$. It is advisable to do so if possible, since the results obtained by algorithms which use derivatives are generally more reliable than those obtained by algorithms which do not use derivatives.
c05rb, c05rc and c05rd require you to provide the derivatives, whilst c05qb c05qc c05qd (C05QSF not in this release) do not. c05qb c05rb (C05QSF not in this release) are easytouse methods; greater flexibility may be obtained using c05qc and c05rc (or, in reverse communication, c05qd and c05rd), but these have longer parameter lists.
(C05QSF not in this release) is an easytouse method specially adapted for sparse problems, that is, problems where each function depends on a small subset of the $n$ variables so that the Jacobian matrix has many zeros. It employs sparse linear algebra methods and consequently is expected to take significantly less time to complete than the other methods, especially if $n$ is large.
c05zd is provided for use in conjunction with c05rb, c05rc and c05rd to check the usersupplied derivatives for consistency with the functions themselves. You are strongly advised to make use of this method whenever c05rb, c05rc or c05rd is used.
Firstly, the calculation of the functions and their derivatives should be ordered so that cancellation errors are avoided. This is particularly important in a method that uses these quantities to build up estimates of higher derivatives.
Secondly, scaling of the variables has a considerable effect on the efficiency of a method. The problem should be designed so that the elements of $x$ are of similar magnitude. The same comment applies to the functions, i.e., all the ${f}_{i}$ should be of comparable size.
The accuracy is usually determined by the accuracy parameters of the methods, but the following points may be useful.
(i)  Greater accuracy in the solution may be requested by choosing smaller input values for the accuracy parameters. However, if unreasonable accuracy is demanded, rounding errors may become important and cause a failure.  
(ii)  Some idea of the accuracies of the ${x}_{i}$ may be obtained by monitoring the progress of the method to see how many figures remain unchanged during the last few iterations.  
(iii)  An approximation to the error in the solution $x$ is given by $e$ where $e$ is the solution to the set of linear equations


(iv)  If the functions
${f}_{i}\left(x\right)$ are changed by small amounts ${\epsilon}_{i}$, for $\mathit{i}=1,2,\dots ,n$, then the corresponding change in the solution $x$ is given approximately by $\sigma $, where $\sigma $ is the solution of the set of linear equations

Values of Lambert's $W$ function
If you require purelyreal values of $W$, these will be evaluated marginally more efficiently by (C05BAF not in this release) than (C05BBF not in this release) owing to the differing iterative procedures used by each method.
Decision Trees
Tree 1: Functions of One Variable
Is reverse communication required?  _ yes 
Is there available an interval $\left[a,b\right]$ containing a simple zero, and no others?  _ yes 
c05az 
  no  

  Is a good approximation to the zero available?  _ yes 
c05ax  
  no  

  c05av followed by c05az  
no  

Do you wish to compute the values of Lambert's $W$ function?  _ yes 
do you require values from only the real branches?  _ yes 
(C05BAF not in this release) 
  no  

  (C05BBF not in this release)  
no  

Is there available an interval $\left[a,b\right]$ containing a simple zero, and no others?  _ yes 
c05ay  
no  

Is a good approximation to the zero available?  _ yes 
c05aw  
no  

c05au 
Tree 2: Functions of several variables
Is the Jacobian matrix sparse?  _ yes 
(C05QSF not in this release)  
no  

Is reverse communication required?  _ yes 
Is the Jacobian matrix available?  _ yes 
c05rd and c05zd 
  no  

  c05qd  
no  

Is the Jacobian matrix available?  _ yes 
Is flexibility required?  _ yes 
c05rc and c05zd 
  no  

  c05rb and c05zd  
no  

Is flexibility required?  _ yes 
c05qc  
no  

c05qb 
References
Barry D J, Culligan–Hensley P J, and Barry S J (1995) Real values of the $W$function ACM Trans. Math. Software 21(2) 161–171
Brent R P (1973) Algorithms for Minimization Without Derivatives Prentice–Hall
Corless R M, Gonnet G H, Hare D E G, Jeffrey D J and Knuth D
E (1996) On the Lambert $W$ function Advances in Comp. Math. 3 329–359
Gill P E and Murray W (1976) Algorithms for the solution of the nonlinear least squares problem Report NAC 71 National Physical Laboratory
Moré J J, Garbow B S and Hillstrom K E (1980) User guide for MINPACK1 Technical Report ANL8074 Argonne National Laboratory
Ortega J M and Rheinboldt W C (1970) Iterative Solution of Nonlinear Equations in Several Variables Academic Press
Rabinowitz P (1970) Numerical Methods for Nonlinear Algebraic Equations Gordon and Breach