uniroot                 package:base                 R Documentation

One Dimensional Root (Zero) Finding

Description:

     The function `uniroot' searches the interval from `lower' to
     `upper' for a root (i.e. zero) of the function `f' with respect to
     its first argument.

Usage:

     uniroot(f, interval, lower = min(interval), upper = max(interval),
             tol = .Machine$double.eps^0.25, maxiter = 1000, ...)

Arguments:

       f: the function for which the root is sought.

interval: a vector containing the end-points of the interval to be
          searched for the root.

   lower: the lower end point of the interval to be searched.

   upper: the upper end point of the interval to be searched.

     tol: the desired accuracy (convergence tolerance).

 maxiter: the maximum number of iterations.

     ...: additional arguments to `f'.

Details:

     Either `interval' or both `lower' and `upper' must be specified. 
     The function uses Fortran subroutine `"zeroin"' (from Netlib)
     based on algorithms given in the reference below.

     If the algorithm does not converge in `maxiter' steps, a warning
     is printed and the current approximation is returned.

Value:

     A list with four components: `root' and `f.root' give the location
     of the root and the value of the function evaluated at that point.
     `iter' and `estim.prec' give the number of iterations used and an
     approximate estimated precision for `root'.

References:

     Brent, R. (1973) Algorithms for Minimization without Derivatives.
     Englewood Cliffs, NJ: Prentice-Hall.

See Also:

     `polyroot' for all complex roots of a polynomial; `optimize',
     `nlm'.

Examples:

     f <- function (x,a) x - a
     str(xmin <- uniroot(f, c(0, 1), tol = 0.0001, a = 1/3))
     str(uniroot(function(x) x*(x^2-1) + .5, low = -2, up = 2, tol = 0.0001),
         dig = 10)
     str(uniroot(function(x) x*(x^2-1) + .5, low = -2, up =2 , tol = 1e-10 ),
         dig = 10)

     ## Find the smallest value x for which exp(x) > 0 (numerically):
     r <- uniroot(function(x) 1e80*exp(x) -1e-300,,-1000,0, tol=1e-20)
     str(r, digits= 15)##> around -745.1332191

     exp(r$r)        # = 0, but not for r$r * 0.999...
     minexp <- r$r * (1 - .Machine$double.eps)
     exp(minexp)     # typically denormalized

