| bI {Bessel} | R Documentation |
Bessel I() function Simple Series Representation
Description
Computes the modified Bessel I function, using one of its basic
definitions as an infinite series. The implementation is pure R,
working for numeric, complex, but also
e.g., for objects of class "mpfr"
from package Rmpfr.
Usage
besselIs(x, nu, nterm = 800, expon.scaled = FALSE, log = FALSE,
Ceps = if (isNum) 8e-16 else 2^(-x@.Data[[1]]@prec))
Arguments
x |
numeric or complex vector, or of another |
nu |
non-negative numeric (scalar). |
nterm |
integer indicating the number of terms to be used.
Should be in the order of |
expon.scaled |
logical indicating if the result should be scaled
by |
log |
logical indicating if the logarithm |
Ceps |
a relative error tolerance for checking if |
Value
a “numeric” (or complex or "mpfr")
vector of the same class and length as x.
Author(s)
Martin Maechler
References
Abramowitz, M., and Stegun, I. A. (1964,.., 1972). Handbook of mathematical functions (NBS AMS series 55, U.S. Dept. of Commerce).
See Also
This package BesselI, base besselI, etc
Examples
(nus <- c(outer((0:3)/4, 1:5, `+`)))
stopifnot(
all.equal(besselIs(1:10, 1), # our R code
besselI (1:10, 1)) # internal C code w/ different algorithm
,
sapply(nus, function(nu)
all.equal(besselIs(1:10, nu, expon.scale=TRUE), # our R code
BesselI (1:10, nu, expon.scale=TRUE)) # TOMS644 code
)
,
## complex argument [gives warnings 'nterm=800' may be too small]
sapply(nus, function(nu)
all.equal(besselIs((1:10)*(1+1i), nu, expon.scale=TRUE), # our R code
BesselI ((1:10)*(1+1i), nu, expon.scale=TRUE)) # TOMS644 code
)
)
## Large 'nu' ...
x <- (0:20)/4
(bx <- besselI(x, nu=200))# base R's -- gives (mostly wrong) warnings
if(require("Rmpfr")) { ## Use high precision (notably large exponent range) numbers:
Bx <- besselIs(mpfr(x, 64), nu=200)
all.equal(Bx, bx, tol = 1e-15)# TRUE -- warning were mostly wrong; specifically:
cbind(bx, Bx)
signif(asNumeric(1 - (bx/Bx)[19:21]), 4) # only [19] had lost accuracy
## With*out* mpfr numbers -- using log -- is accurate (here)
(lbx <- besselIs( x, nu=200, log=TRUE))
lBx <- besselIs(mpfr(x, 64), nu=200, log=TRUE)
stopifnot(all.equal(asNumeric(log(Bx)), lbx, tol=1e-15),
all.equal(lBx, lbx, tol=4e-16))
} # Rmpfr