Raw File
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]])
}
back to top