vuniroot <-
function (f, ..., lower, upper,
f.lower = f(lower, ...), f.upper = f(upper, ...), check.conv = FALSE, tol = .Machine$double.eps^0.25,
maxiter = 1000, trace = 0)
{
stopifnot(all(is.numeric(lower), is.numeric(upper), is.numeric(f.lower), is.numeric(f.upper)))
stopifnot(all.equal(length(lower), length(upper), length(f.lower), length(f.upper)))
stopifnot(!any(is.na(lower)))
stopifnot(!any(is.na(upper)))
stopifnot(!any(is.na(f.lower)))
stopifnot(!any(is.na(f.upper)))
## re-order lower and upper if lower>upper - too automagical?
if (any(index <- (lower>upper))) {
temp <- lower[index]
lower[index] <- upper[index]
upper[index] <- temp
temp <- f.lower[index]
f.lower[index] <- f.upper[index]
f.upper[index] <- temp
}
maxiter <- as.integer(maxiter)
fun <- function(x) f(x, ...)
if (check.conv) {
val <- tryCatch(.Call("vunirootRcpp", fun, lower, upper, maxiter, tol, PACKAGE="rstpm2"),
warning = function(w) w)
if (inherits(val, "warning"))
stop("convergence problem in zero finding: ", conditionMessage(val))
}
else {
val <- .Call("vunirootRcpp", fun, lower, upper, maxiter, tol, PACKAGE="rstpm2")
}
iter <- as.integer(val[[2L]])
if (any(iter < 0)) {
(if (check.conv)
stop
else warning)(sprintf(ngettext(maxiter, "_NOT_ converged in %d iteration",
"_NOT_ converged in %d iterations"), maxiter), domain = NA)
iter <- maxiter
}
list(root = val[[1L]], f.root = f(val[[1L]], ...), iter = iter)
#init.it = it), estim.prec = val[[3L]])
}