Raw File
agm.R
##
##   a g m . R  Arithmetic-geometric Mean
##


agm <- function(a, b, maxiter = 25, tol = .Machine$double.eps^(1/2)) {
    stopifnot(is.numeric(a), length(a) == 1, a >= 0,
              is.numeric(b), length(b) == 1, b >= 0)

    niter <- 0
    while (abs(a-b) >= tol && niter <= maxiter) {
        a1 <- (a + b) / 2
        b1 <- sqrt(a * b)
        a <- a1
        b <- b1
        niter <- niter + 1
    }
    if (niter > maxiter)
        warning("Maximum number of allowed iterations exceeded.")
    return(list(agm=(a+b)/2, niter = niter, estim.prec = abs(a-b)))
}
back to top