Bessel                 package:base                 R Documentation

Bessel Functions

Description:

     Bessel Functions of integer and fractional order, of first and
     second kind, J(nu) and Y(nu), and Modified Bessel functions (of
     first and third kind), I(nu) and K(nu). 

     `gammaCody' is the (Gamma) function as from the Specfun package
     and originally used in the Bessel code.

Usage:

     besselI(x, nu, expon.scaled = FALSE)
     besselK(x, nu, expon.scaled = FALSE)
     besselJ(x, nu)
     besselY(x, nu)
     gammaCody(x)

Arguments:

       x: numeric, >= 0.

      nu: numeric; The order (maybe fractional!) of the corresponding
          Bessel function.

expon.scaled: logical; if `TRUE', the results are exponentially scaled
          in order to avoid overflow (I(nu)) or underflow (K(nu)),
          respectively.

Details:

     The underlying C code stems from Netlib (<URL:
     http://www.netlib.org/specfun/r[ijky]besl>).

     If `expon.scaled = TRUE', exp(-x) I(x;nu), or exp(x) K(x;nu) are
     returned.

     `gammaCody' may be somewhat faster but less precise and/or robust
     than R's standard `gamma'.  It is here for experimental purpose
     mainly, and may be defunct very soon.

     For nu < 0, formulae 9.1.2 and 9.6.2 from the reference below are
     applied (which is probably suboptimal), unless for `besselK' which
     is symmetric in `nu'.

Value:

     Numeric vector of the same length of `x' with the (scaled, if
     `expon.scale=TRUE') values of the corresponding Bessel function.

Author(s):

     Original Fortran code: W. J. Cody, Argonne National Laboratory 
     Translation to C and adaption to R: Martin Maechler
     maechler@stat.math.ethz.ch.

References:

     Abramowitz, M. and Stegun, I. A. (1972) Handbook of Mathematical
     Functions. Dover, New York; Chapter 9: Bessel Functions of Integer
     Order.

See Also:

     Other special mathematical functions, as the `gamma', Gamma(x),
     and `beta', B(x).

Examples:

     nus <- c(0:5,10,20)

     x <- seq(0,4, len= 501)
     plot(x,x, ylim = c(0,6), ylab="",type='n', main = "Bessel Functions  I_nu(x)")
     for(nu in nus) lines(x,besselI(x,nu=nu), col = nu+2)
     legend(0,6, leg=paste("nu=",nus), col = nus+2, lwd=1)

     x <- seq(0,40,len=801); yl <- c(-.8,.8)
     plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  J_nu(x)")
     for(nu in nus) lines(x,besselJ(x,nu=nu), col = nu+2)
     legend(32,-.18, leg=paste("nu=",nus), col = nus+2, lwd=1)

     ## Negative nu's :
     xx <- 2:7
     nu <- seq(-10,9, len = 2001)
     op <- par(lab = c(16,5,7))
     matplot(nu, t(outer(xx,nu, besselI)), type = 'l', ylim = c(-50,200),
             main = expression(paste("Bessel ",I[nu](x)," for fixed ", x,
                                     ",  as ",f(nu))),
             xlab = expression(nu))
     abline(v=0, col = "light gray", lty = 3)
     legend(5,200, leg = paste("x=",xx), col=seq(xx), lty=seq(xx))
     par(op)

     x0 <- 2^(-20:10)
     plot(x0,x0^-8, log='xy', ylab="",type='n',
          main = "Bessel Functions  J_nu(x)  near 0\n log - log  scale")
     for(nu in sort(c(nus,nus+.5))) lines(x0,besselJ(x0,nu=nu), col = nu+2)
     legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

     plot(x0,x0^-8, log='xy', ylab="",type='n',
          main = "Bessel Functions  K_nu(x)  near 0\n log - log  scale")
     for(nu in sort(c(nus,nus+.5))) lines(x0,besselK(x0,nu=nu), col = nu+2)
     legend(3,1e50, leg=paste("nu=", paste(nus,nus+.5, sep=",")), col=nus+2, lwd=1)

     x <- x[x > 0]
     plot(x,x, ylim=c(1e-18,1e11),log="y", ylab="",type='n',
          main = "Bessel Functions  K_nu(x)")
     for(nu in nus) lines(x,besselK(x,nu=nu), col = nu+2)
     legend(0,1e-5, leg=paste("nu=",nus), col = nus+2, lwd=1)

     ## Check the Scaling :
     for(nu in nus)
        print(all(abs(1- besselK(x,nu)*exp( x) / besselK(x,nu,expo=TRUE)) < 2e-15))
     for(nu in nus)
        print(all(abs(1- besselI(x,nu)*exp(-x) / besselI(x,nu,expo=TRUE)) < 1e-15))

     yl <- c(-1.6, .6)
     plot(x,x, ylim = yl, ylab="",type='n', main = "Bessel Functions  Y_nu(x)")
     for(nu in nus){xx <- x[x > .6*nu]; lines(xx,besselY(xx,nu=nu), col = nu+2)}
     legend(25,-.5, leg=paste("nu=",nus), col = nus+2, lwd=1)

