TasGrid::getExoticQuadrature (const int num_levels, const double shift, std::function< double(double)> weight_fn, const int num_ref_points, const char *description, const bool is_symmetric=false)
Similar to getExoticQuadrature() but the weight function is defined by a lambda expression.
Detailed Description
Exotic Quadrature
The Exotic Quadrature module of Tasmanian offers a collection of functions for generating one dimensional quadrature rules with weight functions that are not strictly non-negative. The quadrature rules are loaded inside TasGrid::CustomTabulated objects and be used in calls to TasmanianSparseGrid::makeGlobalGrid() to extend those to a multidimensional context.
The integral of interest has the form and it differs from the classical Gaussian rules by allowing the weight function to be negative in portions of the domain. We still require that the weight is integrable and bounded from below, i.e., and .
The quadrature consists of two components, one is a quadrature that uses classical Gaussian construction using the root of polynomials that are orthogonal with respect to a shifted positive weight and a correction term using Gauss-Legendre rule scaled by -c. While the asymptotic convergence rate is inferior to that of Gauss-Legendre, for small number of points the accuracy of the combined quadrature rule can be significantly greater. This advantage is further magnified in a sparse grid context where reaching the asymptotic regime for Gauss-Legendre may require a prohibitive number of points due to the curse of dimensionality.
The weight can be defined either with a C++ lambda expression or a one-dimensional TasmanianSparseGrid object. The lambda expression will be evaluated at a large number of Gauss-Legendre points that will be used for a reference quadrature to build the orthogonal polynomial basis. In the case of a sparse grid object, only the loaded points and quadrature weights will be used, and no interpolation will be performed inbetween (i.e., we circumvent potential interpolation error).
Generates n levels of points and weights using orthogonal polynomials with respect to ref_points and ref_weights.
Given the reference points and weights, finds the roots of the first n + 1 orthogonal polynomials. The first polynomial is always constant, every following polynomial is chosen so that it is orthogonal with respect to all previous polynomials and the orthogonality (i.e., inner product integral) is computed with the reference quadrature points and weights.
Template Parameters
is_symmetric
indicates whether the weight function is symmetric or not, the algorithm makes slight modifications that improve stability in the symmetric case
Parameters
n
is the number of quadrature rules to construct
ref_points
are the points of the reference quadrature
ref_weights
are the weights of the reference quadrature multiplied by the shifted weight function
points_cache
on exit will be loaded so that points_cache[i] will be roots of the i+1-st orthogonal polynomial
weights_cache
on exit will be loaded with the quadrature weights corresponding to the points_cache
Constructs an exotic quadrature from a sparse grid object.
Constructs a set of one dimensional quadrature rules with respect to a 1D weight function approximated by grid.
Parameters
num_levels
is the number of levels that should be computed
shift
is a real-valued scalar that needs to be added to the weight function to make it positive
grid
has dimension 1 and at least one loaded point, should use as many points as possible for better accuracy (up to some point where numerical stability is lost)
description
is a human readable string that can be used to identify the quadrature rule (could be empty)
is_symmetric
indicates whether to assume that the weight is symmetric, which allows for some stability improvements; symmetric means "even" on [-1, 1], which leads to all odd power polynomials integrating to zero; the same holds for shifted domains so long as the weight is "even" with respect to the mid-point of the domain.
Returns
TasGrid::CustomTabulated object holding the points and weights for the different levels of the quadrature
Exceptions
std::invalid_argument
if grid doesn't have a single input and output or no loaded points, or if the value of the weight function plus the shift is not non-negative
The grid object is used in two ways: first, it defines a reference quadrature that will be used to compute the inner-product integrals that define orthogonal polynomials; second, it defines the values of the weight function at the quadrature points. Note that the values of the weight function will not be interpolated between the reference points.
Examples of symmetric weight functions are , , constant weight, and the Gauss-Chebyshev weights. On the other hand, is not symmetric in the context of this algorithm due to the shift that must be applied.
Similar to getExoticQuadrature() but the weight function is defined by a lambda expression.
Constructs a CustomTabulated object holding the points and weights for the different levels of the quadrature for the given parameter weight_fn. The num_ref_points parameter sets the number of reference points from a Gauss-Legendre quadrature that will be used to compute the inner-product integrals that define the orthogonal polynomials.