Processing math: 100%

Multiple integrals in arbitrary orthogonal coordinates systems

library(calculus)

The package integrates seamlessly with cubature for efficient numerical integration in C. The function integral provides the interface for multidimensional integrals of functions, expressions, and characters in arbitrary orthogonal coordinate systems. If the package cubature is not installed, the package implements a naive Monte Carlo integration by default. The function returns a list containing the value of the integral as well as other information on the estimation uncertainty. The integration bounds are specified via the argument bounds: a list containing the lower and upper bound for each variable. If the two bounds coincide, or if a single number is specified, the corresponding variable is not integrated and its value is fixed. For arbitrary orthogonal coordinates q1qn the integral is computed as:

Jf(q1qn)dq1dqn

where J=ihi is the Jacobian determinant of the transformation and is equal to the product of the scale factors h1hn.

Examples

Univariate integral 10xdx:

i <- integral(f = "x", bounds = list(x = c(0,1)))
i$value
#> [1] 0.5

that is equivalent to:

i <- integral(f = function(x) x, bounds = list(x = c(0,1)))
i$value
#> [1] 0.5

Univariate integral 10yxdx|y=2:

i <- integral(f = "y*x", bounds = list(x = c(0,1), y = 2))
i$value
#> [1] 1

Multivariate integral 101oyxdxdy:

i <- integral(f = "y*x", bounds = list(x = c(0,1), y = c(0,1)))
i$value
#> [1] 0.25

Area of a circle 2π010dA(r,θ)

i <- integral(f = 1, 
              bounds = list(r = c(0,1), theta = c(0,2*pi)), 
              coordinates = "polar")
i$value
#> [1] 3.141593

Volume of a sphere π02π010dV(r,θ,ϕ)

i <- integral(f = 1, 
              bounds = list(r = c(0,1), theta = c(0,pi), phi = c(0,2*pi)), 
              coordinates = "spherical")
i$value
#> [1] 4.188794

As a final example consider the electric potential in spherical coordinates V=14πr arising from a unitary point charge:

V <- "1/(4*pi*r)"

The electric field is determined by the gradient of the potential1 E=V:

E <- -1 %prod% gradient(V, c("r","theta","phi"), coordinates = "spherical")

Then, by Gauss’s law2, the total charge enclosed within a given volume is equal to the surface integral of the electric field q=EdA where denotes the scalar product between the two vectors. In spherical coordinates, this reduces to the surface integral of the radial component of the electric field ErdA. The following code computes this surface integral on a sphere with fixed radius r=1:

i <- integral(E[1], 
              bounds = list(r = 1, theta = c(0,pi), phi = c(0,2*pi)), 
              coordinates = "spherical")
i$value
#> [1] 1.000002

As expected q=EdA=ErdA=1, the unitary charge generating the electric potential.

Cite as

Guidotti E (2022). “calculus: High-Dimensional Numerical and Symbolic Calculus in R.” Journal of Statistical Software, 104(5), 1-37. doi:10.18637/jss.v104.i05

A BibTeX entry for LaTeX users is

@Article{calculus,
  title = {{calculus}: High-Dimensional Numerical and Symbolic Calculus in {R}},
  author = {Emanuele Guidotti},
  journal = {Journal of Statistical Software},
  year = {2022},
  volume = {104},
  number = {5},
  pages = {1--37},
  doi = {10.18637/jss.v104.i05},
}

  1. https://en.wikipedia.org/wiki/Electric_potential↩︎

  2. https://en.wikipedia.org/wiki/Gauss%27s_law↩︎