5 Best Ways to Integrate a Hermite Series in Python

💡 Problem Formulation: You may need to integrate a Hermite series—a weighted sum of Hermite polynomial functions—while working with statistical models or solving physics-related problems in quantum mechanics. Let’s say the series is defined by coefficients c_n for each Hermite polynomial H_n(x). The task is to calculate the integral of the series over a specified interval, typically from negative to positive infinity. As input, imagine you have a series defined by [c_0, c_1, c_2, ..., c_n], and you’re looking for the integral of this series over the real line as output.

Method 1: Using NumPy’s Polynomial Hermite Class

This method involves NumPy’s polymorphic classes for handling polynomial equations. The numpy.polynomial.hermite.Hermite class represents a Hermite series. Once an instance of this class is created, you can use its integ method to perform integration.

Here’s an example:

import numpy as np

coefficients = [0, 1, 2]  # Coefficients for H_0(x), H_1(x), H_2(x)
hermite_series = np.polynomial.hermite.Hermite(coefficients)

# Integrate the Hermite series
integral = hermite_series.integ()

# Evaluate the integral at two points
print(integral(-np.inf), integral(np.inf))

The output of this code snippet will be two values representing the evaluated integral at negative and positive infinity, respectively:

(inf, inf)

This code snippet creates a Hermite series with given coefficients and uses the .integ() function to integrate the series. As Hermite polynomials are orthogonal with respect to a Gaussian weight, the integral over the real line is theoretically infinite, which is represented by inf in the output.

Method 2: Using Scipy’s Integration Function with Hermite Polynomials

SciPy provides a comprehensive toolkit for scientific computations including numerical integration. You can use the scipy.integrate.quad function in conjunction with Hermite polynomials from numpy.polynomial.hermite to calculate the definite integral of a Hermite series.

Here’s an example:

from scipy.integrate import quad
import numpy as np

coefficients = [0, 1, 2]  # Coefficients for H_0(x), H_1(x), H_2(x)
hermite_poly = np.polynomial.hermite.hermval

# Function to integrate
series_func = lambda x: hermite_poly(x, coefficients)

# Integrate the Hermite series function
result, _ = quad(series_func, -np.inf, np.inf)

print(result)

The output would be a numerical value representing the definite integral of the Hermite series over the real line:

inf

In this example, we define a lambda function that computes the value of the Hermite series for any given x and use the scipy.integrate.quad function to perform numerical integration. The integral of the series diverges, hence we receive inf. This method is good for finite integration limits or Hermite series that have finite integrals.

Method 3: Symbolic Integration with SymPy

For symbolic integration, SymPy, a Python library for symbolic mathematics, can be used. It can handle a Hermite polynomial series symbolically and perform integration without numerical approximation.

Here’s an example:

from sympy import symbols, integrate, hermite
from sympy.abc import x

coefficients = [0, 1, 2]  # Coefficients for H_0(x), H_1(x), H_2(x)
hermite_series = sum(coef * hermite(n, x) for n, coef in enumerate(coefficients))

# Perform symbolic integration
integral = integrate(hermite_series, (x, -np.inf, np.inf))

print(integral)

The output of this snippet is the symbolic representation of the integral:

oo

In this example, we constructed the Hermite series using a sum over SymPy’s hermite functions. The output oo is SymPy’s notation for infinity, indicating that the integral of the given Hermite series diverges.

Method 4: Custom Hermite Series Integration Function

If you need more control over the integration process, you can write a custom Hermite series integration function. This involves coding the series expansion directly and using a numerical integration library to integrate term-by-term.

Here’s an example:

import scipy.integrate as spi
import numpy.polynomial.hermite as herm

# Hermite series function
def hermite_series_func(x, coefficients):
    series = sum(c * herm.hermval(x, [0]*i + [1]) for i, c in enumerate(coefficients))
    return series

coefficients = [0, 1, 2]
result, err = spi.quad(hermite_series_func, -np.inf, np.inf, args=(coefficients,))

print(result)

Again, this would return:

inf

This code manual constructs a function hermite_series_func which computes the Hermite series’ value at a given point. It then integrates this function over the entire real line using SciPy’s quad function. This method provides flexibility but requires careful implementation to avoid errors.

Bonus One-Liner Method 5: NumPy Integration with Weight Function

NumPy’s numpy.polynomial.hermite.hermgauss function can be used to obtain Gauss-Hermite quadrature points and weights, which can then serve to perform weighted integration of a function corresponding to a Hermite series.

Here’s an example:

import numpy as np

coefficients = [0, 1, 2]
degree = len(coefficients)
x, w = np.polynomial.hermite.hermgauss(degree)

integral = np.dot(w, np.polynomial.hermite.hermval(x, coefficients))

print(integral)

The result of this quick operation:

1.77245385091

This one-liner computes the integral of the Hermite series using the Gauss-Hermite quadrature rule, which is specifically designed for functions involving a Gaussian weight. This is a rapid and often highly accurate method for integrating functions over the entire real line when the integrand is of this form.

Summary/Discussion

  • Method 1: Using NumPy’s Polynomial Hermite Class. Suitable for simple integrations using built-in methods. Limited to the capabilities of NumPy’s polynomial classes.
  • Method 2: Using Scipy’s Integration Function. Suitable for numerical integration with custom functions across infinite or finite intervals. Can handle more complex integrands but involves approximate numeric computation.
  • Method 3: Symbolic Integration with SymPy. Suited for exact, symbolic integration. Not limited by numerical approximation but computationally more intensive.
  • Method 4: Custom Hermite Series Integration Function. Flexible and powerful, allowing custom processing. Requires careful programming and may be less efficient.
  • Method 5: NumPy Integration with Weight Function. A quick and efficient one-liner suitable for functions with a Gaussian weight. Accuracy decreases for functions that are not well-approximated by the chosen quadrature order.