Gauss_Legen {sphunif} | R Documentation |
Gauss–Legendre quadrature
Description
Convenience for computing the nodes and weights
of the Gauss–Legendre quadrature formula
in
:
.
Usage
Gauss_Legen_nodes(a = -1, b = 1, N = 40L)
Gauss_Legen_weights(a = -1, b = 1, N = 40L)
Arguments
a , b |
scalars giving the interval |
N |
number of points used in the Gauss–Legendre quadrature. The
following choices are supported: |
Details
For functions, Gauss–Legendre quadrature
can be very efficient. It is exact for polynomials up to degree
.
The nodes and weights up to were retrieved from
NIST and have
precision.
For
onwards, the nodes and weights were computed with the
gauss.quad
function from the
statmod
package (Smyth, 1998), and have precision.
Value
A matrix of size c(N, 1)
with the nodes
(
Gauss_Legen_nodes
) or the corresponding weights
(
Gauss_Legen_weights
).
References
NIST Digital Library of Mathematical Functions. Release 1.0.20 of 2018-09-15. F. W. J. Olver, A. B. Olde Daalhuis, D. W. Lozier, B. I. Schneider, R. F. Boisvert, C. W. Clark, B. R. Miller, and B. V. Saunders, eds. https://dlmf.nist.gov/
Smyth, G. K. (1998). Numerical integration. In: Encyclopedia of Biostatistics, P. Armitage and T. Colton (eds.), Wiley, London, pp. 3088-3095.
Examples
## Integration of a smooth function in (1, 10)
# Weights and nodes for integrating
x_k <- Gauss_Legen_nodes(a = 1, b = 10, N = 40)
w_k <- Gauss_Legen_weights(a = 1, b = 10, N = 40)
# Check quadrature
f <- function(x) sin(x) * x^2 - log(x + 1)
integrate(f, lower = 1, upper = 10, rel.tol = 1e-12)
sum(w_k * f(x_k))
# Exact for polynomials up to degree 2 * N - 1
f <- function(x) (((x + 0.5) / 1e3)^5 - ((x - 0.5)/ 5)^4 +
((x - 0.25) / 10)^2 + 1)^20
sum(w_k * f(x_k))
integrate(f, lower = -1, upper = 1, rel.tol = 1e-12)
## Integration on (0, pi)
# Weights and nodes for integrating
th_k <- Gauss_Legen_nodes(a = 0, b = pi, N = 40)
w_k <- Gauss_Legen_weights(a = 0, b = pi, N = 40)
# Check quadrature
p <- 4
psi <- function(th) -sin(th / 2)
w <- function(th) sin(th)^(p - 2)
integrate(function(th) psi(th) * w(th), lower = 0, upper = pi,
rel.tol = 1e-12)
sum(w_k * psi(th_k) * w(th_k))
# Integral with Gegenbauer polynomial
k <- 3
C_k <- function(th) drop(Gegen_polyn(theta = th, k = k, p = p))
integrate(function(th) psi(th) * C_k(th) * w(th), lower = 0, upper = pi,
rel.tol = 1e-12)
th_k <- drop(Gauss_Legen_nodes(a = 0, b = pi, N = 80))
w_k <- drop(Gauss_Legen_weights(a = 0, b = pi, N = 80))
sum(w_k * psi(th_k) * C_k(th_k) * w(th_k))