---
title: "Multiple integrals in arbitrary orthogonal coordinates systems"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Multiple integrals in arbitrary orthogonal coordinates systems}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(calculus)
```

The package integrates seamlessly with [cubature](https://cran.r-project.org/package=cubature) for efficient numerical integration in `C`. The function [`integral`](https://calculus.eguidotti.com/reference/integral.html) provides the interface for multidimensional integrals of `functions`, `expressions`, and `characters` in arbitrary [orthogonal coordinate systems](https://calculus.eguidotti.com/articles/differential-operators.html). If the package [cubature](https://cran.r-project.org/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 $q_1\dots q_n$ the integral is computed as:

$$
\int J\cdot f(q_1\dots q_n) dq_1\dots dq_n
$$

where $J=\prod_i h_i$ is the Jacobian determinant of the transformation and is equal to the product of the scale factors $h_1\dots h_n$.

## Examples

Univariate integral $\int_0^1xdx$:

```{r}
i <- integral(f = "x", bounds = list(x = c(0,1)))
i$value
```

that is equivalent to:

```{r}
i <- integral(f = function(x) x, bounds = list(x = c(0,1)))
i$value
```

Univariate integral $\int_0^1yxdx|_{y=2}$:

```{r}
i <- integral(f = "y*x", bounds = list(x = c(0,1), y = 2))
i$value
```

Multivariate integral $\int_0^1\int_o^1yxdxdy$:

```{r}
i <- integral(f = "y*x", bounds = list(x = c(0,1), y = c(0,1)))
i$value
```

Area of a circle $\int_0^{2\pi}\int_0^1dA(r,\theta)$

```{r}
i <- integral(f = 1, 
              bounds = list(r = c(0,1), theta = c(0,2*pi)), 
              coordinates = "polar")
i$value
```

Volume of a sphere $\int_0^\pi\int_0^{2\pi}\int_0^1dV(r,\theta,\phi)$

```{r}
i <- integral(f = 1, 
              bounds = list(r = c(0,1), theta = c(0,pi), phi = c(0,2*pi)), 
              coordinates = "spherical")
i$value
```

As a final example consider the electric potential in spherical coordinates $V=\frac{1}{4\pi r}$ arising from a unitary point charge:

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

The electric field is determined by the gradient of the potential^[https://en.wikipedia.org/wiki/Electric_potential] $E = -\nabla V$: 

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

Then, by Gauss's law^[https://en.wikipedia.org/wiki/Gauss%27s_law], the total charge enclosed within a given volume is equal to the surface integral of the electric field $q=\int E\cdot dA$ where $\cdot$ 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 $\int E_rdA$. The following code computes this surface integral on a sphere with fixed radius $r=1$:

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

As expected $q=\int E\cdot dA=\int E_rdA=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](https://doi.org/10.18637/jss.v104.i05)

A BibTeX entry for LaTeX users is

```bibtex
@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},
}
```