Bessel_mpfr {Rmpfr} | R Documentation |
Bessel functions of integer orders, provided via arbitrary precision algorithms from the MPFR library.
Note that the computation can be very slow when n
and
x
are large (and of similar magnitude).
Ai(x) j0(x) j1(x) jn(n, x, rnd.mode = c("N","D","U","Z","A")) y0(x) y1(x) yn(n, x, rnd.mode = c("N","D","U","Z","A"))
x |
|
n |
non-negative integer (vector). |
rnd.mode |
a 1-letter string specifying how rounding
should happen at C-level conversion to MPFR, see |
Computes multiple precision versions of the Bessel functions of
integer order, J[n](x) and Y[n](x),
and—when using MPFR library 3.0.0 or newer—also of the Airy function
Ai(x). Note that currently Ai(x)
is very slow to compute
for large x
.
besselJ
, and besselY
compute the
same bessel functions but for arbitrary real order and only
precision of a bit more than ten digits.
x <- (0:100)/8 # (have exact binary representation) stopifnot( all.equal(besselY(x, 0), bY0 <- y0(x)) , all.equal(besselJ(x, 1), bJ1 <- j1(x)) , all.equal(yn(0,x), bY0) , all.equal(jn(1,x), bJ1) ) if(mpfrVersion() >= "3.0.0") { ## Ai() not available previously print( aix <- Ai(x) ) plot(x, aix, log="y", type="l", col=2) stopifnot( all.equal(Ai (0) , 1/(3^(2/3) * gamma(2/3))) , # see http://dlmf.nist.gov/9.2.ii all.equal(Ai(100), mpfr("2.6344821520881844895505525695264981561e-291"), tol=1e-37) ) two3rd <- 2/mpfr(3, 144) print( all.equal(Ai(0), 1/(3^two3rd * gamma(two3rd)), tol=0) ) # 1.7e-40 if(Rmpfr:::doExtras()) { # slowish: system.time(ai1k <- Ai(1000)) # 1.4 sec (on 2017 lynne) stopifnot(all.equal(log10(ai1k), -9157.031193409585185582, tol=1e-16)) } } # ver >= 3.0