Processing math: 89%

Hermite polynomials

library(calculus)

Hermite polynomials are obtained by differentiation of the Gaussian kernel:

Hν(x,Σ)=exp(12xiΣijxj)(x)νexp(12xiΣijxj)

where Σ is a d-dimensional square matrix and ν=(ν1νd) is the vector representing the order of differentiation for each variable x=(x1xd). In the case where Σ=1 and x=x1 the formula reduces to the standard univariate Hermite polynomials:

Hν(x)=ex22(1)νdνdxνex22

The function hermite generates recursively all the Hermite polynomials of degree ν where |ν||ν|. The output is a list of Hermite polynomials of degree ν, where each polynomial is described as a list containing the character representing the polynomial, the order of the polynomial, and a data.frame containing the variables, coefficients and degrees of each term in the polynomial.

In the univariate case, for ν=2:

hermite(order = 2)
#> $`0`
#> $`0`$f
#> [1] "(1) * 1"
#> 
#> $`0`$order
#> [1] 0
#> 
#> $`0`$terms
#>   var coef degree
#> 0   1    1      0
#> 
#> 
#> $`1`
#> $`1`$f
#> [1] "(1) * x^1"
#> 
#> $`1`$order
#> [1] 1
#> 
#> $`1`$terms
#>   var coef degree
#> 0   1    0      0
#> 1 x^1    1      1
#> 
#> 
#> $`2`
#> $`2`$f
#> [1] "(-1) * 1 + (1) * x^2"
#> 
#> $`2`$order
#> [1] 2
#> 
#> $`2`$terms
#>   var coef degree
#> 0   1   -1      0
#> 1 x^1    0      1
#> 2 x^2    1      2

In the multivariate case, where for simplicity Σij=δij, x=(x1,x2), and |ν|=2:

hermite(order = 2, sigma = diag(2), var = c("x1", "x2"))
#> $`0,0`
#> $`0,0`$f
#> [1] "(1) * 1"
#> 
#> $`0,0`$order
#> [1] 0
#> 
#> $`0,0`$terms
#>     var coef degree
#> 0,0   1    1      0
#> 
#> 
#> $`0,1`
#> $`0,1`$f
#> [1] "(1) * x2^1"
#> 
#> $`0,1`$order
#> [1] 1
#> 
#> $`0,1`$terms
#>      var coef degree
#> 0,0    1    0      0
#> 0,1 x2^1    1      1
#> 1,0 x1^1    0      1
#> 
#> 
#> $`1,0`
#> $`1,0`$f
#> [1] "(1) * x1^1"
#> 
#> $`1,0`$order
#> [1] 1
#> 
#> $`1,0`$terms
#>      var coef degree
#> 0,0    1    0      0
#> 0,1 x2^1    0      1
#> 1,0 x1^1    1      1
#> 
#> 
#> $`0,2`
#> $`0,2`$f
#> [1] "(-1) * 1 + (1) * x2^2"
#> 
#> $`0,2`$order
#> [1] 2
#> 
#> $`0,2`$terms
#>           var coef degree
#> 0,0         1   -1      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2    1      2
#> 2,0      x1^2    0      2
#> 1,1 x1^1*x2^1    0      2
#> 
#> 
#> $`2,0`
#> $`2,0`$f
#> [1] "(-1) * 1 + (1) * x1^2"
#> 
#> $`2,0`$order
#> [1] 2
#> 
#> $`2,0`$terms
#>           var coef degree
#> 0,0         1   -1      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2    0      2
#> 2,0      x1^2    1      2
#> 1,1 x1^1*x2^1    0      2
#> 
#> 
#> $`1,1`
#> $`1,1`$f
#> [1] "(1) * x1^1*x2^1"
#> 
#> $`1,1`$order
#> [1] 2
#> 
#> $`1,1`$terms
#>           var coef degree
#> 0,0         1    0      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2    0      2
#> 2,0      x1^2    0      2
#> 1,1 x1^1*x2^1    1      2

If transform is not NULL, the variables var x are replaced with transform f(x) to compute the polynomials H_{ν}(f(x),\Sigma). For example:

f(x_1,x_2)= \begin{bmatrix} x_1+x_2,x_1-x_2 \end{bmatrix}

hermite(order = 2, sigma = diag(2), var = c("x1", "x2"), transform = c('x1+x2','x1-x2'))
#> $`0,0`
#> $`0,0`$f
#> [1] "(1) * 1"
#> 
#> $`0,0`$order
#> [1] 0
#> 
#> $`0,0`$terms
#>     var coef degree
#> 0,0   1    1      0
#> 
#> 
#> $`0,1`
#> $`0,1`$f
#> [1] "(-1) * x2^1 + (1) * x1^1"
#> 
#> $`0,1`$order
#> [1] 1
#> 
#> $`0,1`$terms
#>      var coef degree
#> 0,0    1    0      0
#> 0,1 x2^1   -1      1
#> 1,0 x1^1    1      1
#> 
#> 
#> $`1,0`
#> $`1,0`$f
#> [1] "(1) * x2^1 + (1) * x1^1"
#> 
#> $`1,0`$order
#> [1] 1
#> 
#> $`1,0`$terms
#>      var coef degree
#> 0,0    1    0      0
#> 0,1 x2^1    1      1
#> 1,0 x1^1    1      1
#> 
#> 
#> $`0,2`
#> $`0,2`$f
#> [1] "(-1) * 1 + (1) * x2^2 + (1) * x1^2 + (-2) * x1^1*x2^1"
#> 
#> $`0,2`$order
#> [1] 2
#> 
#> $`0,2`$terms
#>           var coef degree
#> 0,0         1   -1      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2    1      2
#> 2,0      x1^2    1      2
#> 1,1 x1^1*x2^1   -2      2
#> 
#> 
#> $`2,0`
#> $`2,0`$f
#> [1] "(-1) * 1 + (1) * x2^2 + (1) * x1^2 + (2) * x1^1*x2^1"
#> 
#> $`2,0`$order
#> [1] 2
#> 
#> $`2,0`$terms
#>           var coef degree
#> 0,0         1   -1      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2    1      2
#> 2,0      x1^2    1      2
#> 1,1 x1^1*x2^1    2      2
#> 
#> 
#> $`1,1`
#> $`1,1`$f
#> [1] "(-1) * x2^2 + (1) * x1^2"
#> 
#> $`1,1`$order
#> [1] 2
#> 
#> $`1,1`$terms
#>           var coef degree
#> 0,0         1    0      0
#> 0,1      x2^1    0      1
#> 1,0      x1^1    0      1
#> 0,2      x2^2   -1      2
#> 2,0      x1^2    1      2
#> 1,1 x1^1*x2^1    0      2

Cite as

Guidotti, E. (2020). “calculus: High dimensional numerical and symbolic calculus in R”. https://arxiv.org/abs/2101.00086

A BibTeX entry for LaTeX users is

@Misc{,
    title = {calculus: High Dimensional Numerical and Symbolic Calculus in R},
    author = {Emanuele Guidotti},
    year = {2020},
    eprint = {2101.00086},
    archiveprefix = {arXiv},
    primaryclass = {cs.MS},
    url = {https://arxiv.org/abs/2101.00086}
}