Here is something simple (does not have any checks for bad input), yet
should be adequate:

bisect <- function(fn, lower, upper, tol=1.e-07, ...) {
f.lo <- fn(lower, ...) 
f.hi <- fn(upper, ...) 
feval <- 2

if (f.lo * f.hi > 0) stop("Root is not bracketed in the specified interval
\n")
chg <- upper - lower

while (abs(chg) > tol) {
        x.new <- (lower + upper) / 2
        f.new <- fn(x.new, ...)
        if (abs(f.new) <= tol) break
        if (f.lo * f.new < 0) upper <- x.new 
        if (f.hi * f.new < 0) lower <- x.new 
        chg <- upper - lower
        feval <- feval + 1
}
list(x = x.new, value = f.new, fevals=feval)
}

# An example
fn1 <- function(x, a) {
exp(-x) - a*x 
}

bisect(fn1, 0, 2, a=1)
 
bisect(fn1, 0, 2, a=2)


Ravi.

-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On
Behalf Of Peter Dalgaard
Sent: Friday, September 17, 2010 4:16 PM
To: Gregory Gentlemen
Cc: r-help@r-project.org
Subject: Re: [R] Is there a bisection method in R?

On 09/17/2010 09:28 PM, Gregory Gentlemen wrote:
> If uniroot is not a bisection method, then what function in R does use
bisection?
> 

Why do you assume that there is one? uniroot contains a better algorithm
for finding bracketed roots.

It shouldn't be too hard to roll your own if you need one for
pedagogical purposes.

-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to