9.2 Secant Method, False Position Method, and Ridders' Method
9.2 Secant Method, False Position Method, and Ridders' Method
#include <math.h>
#define JMAX 40 Maximum allowed number of bisections.
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
int j;
float dx,f,fmid,xmid,rtb;
f=(*func)(x1);
fmid=(*func)(x2);
if (f*fmid >= 0.0) nrerror("Root must be bracketed for bisection in rtbis");
rtb = f < 0.0 ? (dx=x2-x1,x1) : (dx=x1-x2,x2); Orient the search so that f>0
for (j=1;j<=JMAX;j++) { lies at x+dx.
fmid=(*func)(xmid=rtb+(dx *= 0.5)); Bisection loop.
if (fmid <= 0.0) rtb=xmid;
if (fabs(dx) < xacc || fmid == 0.0) return rtb;
}
nrerror("Too many bisections in rtbis");
return 0.0; Never get here.
}
The secant method has, however, the disadvantage that the root does not necessarily
remain bracketed. For functions that are not sufficiently continuous, the algorithm
can therefore not be guaranteed to converge: Local behavior might send it off
towards infinity.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
Figure 9.2.2. False position method. Interpolation lines (dashed) are drawn through the most recent
points that bracket the root. In this example, point 1 thus remains “active” for many steps. False position
Figure 9.2.1. Secant method. Extrapolation or interpolation lines (dashed) are drawn through the two
most recently evaluated points, whether or not they bracket the function. The points are numbered in
355
x
x
9.2 Secant Method, False Position Method, and Ridders’ Method
converges less rapidly than the secant method, but it is more certain.
f(x)
f(x)
3
3
4
the order that they are used.
4
1
1
356 Chapter 9. Root Finding and Nonlinear Sets of Equations
2
f (x)
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
x
1 3 4
Figure 9.2.3. Example where both the secant and false position methods will take many iterations to
arrive at the true root. This function would be difficult for many other root-finding methods.
False position, since it sometimes keeps an older rather than newer function
evaluation, has a lower order of convergence. Since the newer function value will
sometimes be kept, the method is often superlinear, but estimation of its exact order
is not so easy.
Here are sample implementations of these two related methods. While these
methods are standard textbook fare, Ridders’ method, described below, or Brent’s
method, in the next section, are almost always better choices. Figure 9.2.3 shows the
behavior of secant and false-position methods in a difficult situation.
#include <math.h>
#define MAXIT 30 Set to the maximum allowed number of iterations.
fl=(*func)(x1);
fh=(*func)(x2); Be sure the interval brackets a root.
if (fl*fh > 0.0) nrerror("Root must be bracketed in rtflsp");
if (fl < 0.0) { Identify the limits so that xl corresponds to the low
xl=x1; side.
xh=x2;
} else {
xl=x2;
xh=x1;
swap=fl;
9.2 Secant Method, False Position Method, and Ridders’ Method 357
fl=fh;
fh=swap;
}
dx=xh-xl;
for (j=1;j<=MAXIT;j++) { False position loop.
rtf=xl+dx*fl/(fl-fh); Increment with respect to latest value.
f=(*func)(rtf);
if (f < 0.0) { Replace appropriate limit.
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
del=xl-rtf;
xl=rtf;
fl=f;
} else {
del=xh-rtf;
xh=rtf;
fh=f;
}
dx=xh-xl;
if (fabs(del) < xacc || f == 0.0) return rtf; Convergence.
}
nrerror("Maximum number of iterations exceeded in rtflsp");
return 0.0; Never get here.
}
#include <math.h>
#define MAXIT 30 Maximum allowed number of iterations.
fl=(*func)(x1);
f=(*func)(x2);
if (fabs(fl) < fabs(f)) { Pick the bound with the smaller function value as
rts=x1; the most recent guess.
xl=x2;
swap=fl;
fl=f;
f=swap;
} else {
xl=x1;
rts=x2;
}
for (j=1;j<=MAXIT;j++) { Secant loop.
dx=(xl-rts)*f/(f-fl); Increment with respect to latest value.
xl=rts;
fl=f;
rts += dx;
f=(*func)(rts);
if (fabs(dx) < xacc || f == 0.0) return rts; Convergence.
}
nrerror("Maximum number of iterations exceeded in rtsec");
return 0.0; Never get here.
}
358 Chapter 9. Root Finding and Nonlinear Sets of Equations
Ridders’ Method
A powerful variant on false position is due to Ridders [1]. When a root is
bracketed between x1 and x2 , Ridders’ method first evaluates the function at the
midpoint x3 = (x1 + x2 )/2. It then factors out that unique exponential function
which turns the residual function into a straight line. Specifically, it solves for a
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
factor eQ that gives
Now the false position method is applied, not to the values f(x1 ), f(x3 ), f(x2 ), but
to the values f(x1 ), f(x3 )eQ , f(x2 )e2Q , yielding a new guess for the root, x4 . The
overall updating formula (incorporating the solution 9.2.3) is
Equation (9.2.4) has some very nice properties. First, x4 is guaranteed to lie
in the interval (x1 , x2 ), so the method never jumps out of its brackets. Second,
the convergence of successive applications of equation (9.2.4) is quadratic, that is,
m = 2 in equation (9.1.4). Since each application √ of (9.2.4) requires two function
evaluations, the actual order of the method is 2, not 2; but this is still quite
respectably superlinear: the number of significant digits in the answer approximately
doubles with each two function evaluations. Third, taking out the function’s “bend”
via exponential (that is, ratio) factors, rather than via a polynomial technique (e.g.,
fitting a parabola), turns out to give an extraordinarily robust algorithm. In both
reliability and speed, Ridders’ method is generally competitive with the more highly
developed and better established (but more complicated) method of Van Wijngaarden,
Dekker, and Brent, which we next discuss.
#include <math.h>
#include "nrutil.h"
#define MAXIT 60
#define UNUSED (-1.11e30)
fl=(*func)(x1);
fh=(*func)(x2);
if ((fl > 0.0 && fh < 0.0) || (fl < 0.0 && fh > 0.0)) {
xl=x1;
xh=x2;
ans=UNUSED; Any highly unlikely value, to simplify logic
below.
9.3 Van Wijngaarden–Dekker–Brent Method 359
for (j=1;j<=MAXIT;j++) {
xm=0.5*(xl+xh);
fm=(*func)(xm); First of two function evaluations per it-
s=sqrt(fm*fm-fl*fh); eration.
if (s == 0.0) return ans;
xnew=xm+(xm-xl)*((fl >= fh ? 1.0 : -1.0)*fm/s); Updating formula.
if (fabs(xnew-ans) <= xacc) return ans;
ans=xnew;
visit website http://www.nr.com or call 1-800-872-7423 (North America only),or send email to [email protected] (outside North America).
readable files (including this one) to any servercomputer, is strictly prohibited. To order Numerical Recipes books,diskettes, or CDROMs
Permission is granted for internet users to make one paper copy for their own personal use. Further reproduction, or any copying of machine-
Copyright (C) 1988-1992 by Cambridge University Press.Programs Copyright (C) 1988-1992 by Numerical Recipes Software.
Sample page from NUMERICAL RECIPES IN C: THE ART OF SCIENTIFIC COMPUTING (ISBN 0-521-43108-5)
fnew=(*func)(ans); Second of two function evaluations per
if (fnew == 0.0) return ans; iteration.
if (SIGN(fm,fnew) != fm) { Bookkeeping to keep the root bracketed
xl=xm; on next iteration.
fl=fm;
xh=ans;
fh=fnew;
} else if (SIGN(fl,fnew) != fl) {
xh=ans;
fh=fnew;
} else if (SIGN(fh,fnew) != fh) {
xl=ans;
fl=fnew;
} else nrerror("never get here.");
if (fabs(xh-xl) <= xacc) return ans;
}
nrerror("zriddr exceed maximum iterations");
}
else {
if (fl == 0.0) return x1;
if (fh == 0.0) return x2;
nrerror("root must be bracketed in zriddr.");
}
return 0.0; Never get here.
}