Title: | Exponential Integral and Incomplete Gamma Function |
---|---|
Description: | The exponential integrals E_1(x), E_2(x), E_n(x) and Ei(x), and the incomplete gamma function G(a, x) defined for negative values of its first argument. The package also gives easy access to the underlying C routines through an API; see the package vignette for details. A test package included in sub-directory example_API provides an implementation. C routines derived from the GNU Scientific Library <https://www.gnu.org/software/gsl/>. |
Authors: | Vincent Goulet [cre, aut], Gerard Jungman [aut] (Original GSL code), Brian Gough [aut] (Original GSL code), Jeffrey A. Ryan [aut] (Package API), Robert Gentleman [aut] (Parts of the R to C interface), Ross Ihaka [aut] (Parts of the R to C interface), R Core Team [aut] (Parts of the R to C interface), R Foundation [aut] (Parts of the R to C interface) |
Maintainer: | Vincent Goulet <[email protected]> |
License: | GPL (>= 2) |
Version: | 0.1-8 |
Built: | 2024-10-31 20:32:09 UTC |
Source: | https://github.com/cran/expint |
The exponential integrals ,
,
and
, and the incomplete gamma function
that is defined for negative values of its first argument.
The exponential integral
and the incomplete gamma function
are closely related functions that arise in various fields of mathematics.
expint is a small package that provides R functions to compute the exponential integral and the incomplete gamma function.
Most conveniently for R package developers, the package also gives access to the underlying C workhorses through an API; see the package vignette for instructions.
The C routines are adapted versions of those of the GNU Scientific Library https://www.gnu.org/software/gsl/.
Vincent Goulet [email protected]
Abramowitz, M. and Stegun, I. A. (1972), Handbook of Mathematical Functions, Dover.
expint
for the exponential integral family of functions.
gammainc
for the incomplete gamma function.
vignette("expint")
for a detailed presentation of the package.
The exponential integrals ,
,
and
.
expint(x, order = 1L, scale = FALSE) expint_E1(x, scale = FALSE) expint_E2(x, scale = FALSE) expint_En(x, order, scale = FALSE) expint_Ei(x, scale = FALSE)
expint(x, order = 1L, scale = FALSE) expint_E1(x, scale = FALSE) expint_E2(x, scale = FALSE) expint_En(x, order, scale = FALSE) expint_Ei(x, scale = FALSE)
x |
vector of real numbers. |
order |
vector of non-negative integers; see Details. |
scale |
logical; when |
Abramowitz and Stegun (1972) first define the exponential integral as
An alternative definition (to be understood in terms of the Cauchy principal value due to the singularity of the integrand at zero) is
The exponential integral can also generalized to order
as
for ;
a real number (non-negative when
).
The following relation holds:
where is the incomplete gamma function
implemented in
gammainc
.
By definition, ,
.
Function expint
is vectorized in both x
and
order
, whereas function expint_En
expects a single value
for order
and will only use the first value if order
is
a vector.
Non-integer values of order
will be silently coerced to
integers using truncation towards zero.
The value of the exponential integral.
Invalid arguments will result in return value NaN
, with a warning.
The C implementation is based on code from the GNU Software Library https://www.gnu.org/software/gsl/.
Vincent Goulet [email protected]
Abramowitz, M. and Stegun, I. A. (1972), Handbook of Mathematical Functions, Dover.
## See section 5.3 of Abramowitz and Stegun expint(1.275, order = 1:10) expint(10, order = 1:10) * 1e5 expint(c(1.275, 10), order = c(1, 2)) expint_E1(1.275) # same as above expint_E2(10) # same as above ## Figure 5.1 of Abramowitz and Stegun curve(expint_Ei, xlim = c(0, 1.6), ylim = c(-3.9, 3.9), ylab = "y") abline(h = 0) curve(expint_E1, add = TRUE) x <- 1.5 text(x, c(expint_Ei(x), expint_E1(x)), expression(Ei(x), E[1](x)), adj = c(0.5, -0.5)) ## Figure 5.2 of Abramowitz and Stegun plot(NA, xlim = c(-1.6, 1.6), ylim = c(0, 1), xlab = "x", ylab = expression(E[n](x))) n <- c(10, 5, 3, 2, 1, 0) for (order in n) curve(expint_En(x, order), add = TRUE) x <- c(0.1, 0.15, 0.25, 0.35, 0.5, 0.7) text(x, expint(x, n), paste("n =", n), adj = c(-0.2, -0.5))
## See section 5.3 of Abramowitz and Stegun expint(1.275, order = 1:10) expint(10, order = 1:10) * 1e5 expint(c(1.275, 10), order = c(1, 2)) expint_E1(1.275) # same as above expint_E2(10) # same as above ## Figure 5.1 of Abramowitz and Stegun curve(expint_Ei, xlim = c(0, 1.6), ylim = c(-3.9, 3.9), ylab = "y") abline(h = 0) curve(expint_E1, add = TRUE) x <- 1.5 text(x, c(expint_Ei(x), expint_E1(x)), expression(Ei(x), E[1](x)), adj = c(0.5, -0.5)) ## Figure 5.2 of Abramowitz and Stegun plot(NA, xlim = c(-1.6, 1.6), ylim = c(0, 1), xlab = "x", ylab = expression(E[n](x))) n <- c(10, 5, 3, 2, 1, 0) for (order in n) curve(expint_En(x, order), add = TRUE) x <- c(0.1, 0.15, 0.25, 0.35, 0.5, 0.7) text(x, expint(x, n), paste("n =", n), adj = c(-0.2, -0.5))
The incomplete gamma function .
gammainc(a, x)
gammainc(a, x)
a |
vector of real numbers. |
x |
vector of non-negative real numbers. |
As defined in 6.5.3 of Abramowitz and Stegun (1972), the incomplete gamma function is
for real and
.
For non-negative values of , we have
where is the function implemented
by R's
gamma()
and is the
cumulative distribution function of the gamma distribution (with scale
equal to one) implemented by R's
pgamma()
.
Also, ,
,
where
is the exponential integral implemented in
expint
.
The value of the incomplete gamma function.
Invalid arguments will result in return value NaN
, with a warning.
The C implementation is based on code from the GNU Software Library https://www.gnu.org/software/gsl/.
Vincent Goulet [email protected]
Abramowitz, M. and Stegun, I. A. (1972), Handbook of Mathematical Functions, Dover.
## a > 0 x <- c(0.2, 2.5, 5, 8, 10) a <- 1.2 gammainc(a, x) gamma(a) * pgamma(x, a, 1, lower = FALSE) # same ## a = 0 a <- 0 gammainc(a, x) expint(x) # same ## a < 0 a <- c(-0.25, -1.2, -2) sapply(a, gammainc, x = x)
## a > 0 x <- c(0.2, 2.5, 5, 8, 10) a <- 1.2 gammainc(a, x) gamma(a) * pgamma(x, a, 1, lower = FALSE) # same ## a = 0 a <- 0 gammainc(a, x) expint(x) # same ## a < 0 a <- c(-0.25, -1.2, -2) sapply(a, gammainc, x = x)