Janus 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
Stochastic Quadrature

Janus includes a dedicated Quadrature.hpp layer for probability-measure quadrature rules that feed directly into polynomial-chaos workflows. One-dimensional rules return nodes and weights on the probability measure, tensor-product grids preserve the standard Janus sample layout, and Smolyak sparse grids reduce point count for higher-dimensional problems. This is separate from quad(...) in Integrate.hpp, which is a definite-integral API; Quadrature.hpp is a structured collocation/projection API. Works in numeric mode.

Quick Start

#include <janus/janus.hpp>
// Build a 3rd-order Gauss rule for a uniform variable
// Integrate f(x) = x^2 against the uniform measure on [-1, 1]
double integral = 0.0;
for (Eigen::Index i = 0; i < rule.nodes.size(); ++i) {
integral += rule.weights(i) * rule.nodes(i) * rule.nodes(i);
}
// integral ~ 1/3 (second moment of uniform on [-1,1])
Umbrella header that includes the entire Janus public API.
UnivariateQuadratureRule stochastic_quadrature_rule(const PolynomialChaosDimension &dimension, int order, StochasticQuadratureRule rule=StochasticQuadratureRule::Gauss)
Build a one-dimensional stochastic quadrature rule with a fixed order.
Definition Quadrature.hpp:426
PolynomialChaosDimension legendre_dimension()
Create a uniform (Legendre) dimension on [-1, 1].
Definition PolynomialChaos.hpp:65

Core API

  • janus::stochastic_quadrature_rule(dim, order): Build a fixed-order quadrature rule for a given polynomial family.
  • janus::stochastic_quadrature_level(dim, level, rule_type): Build a refinement-level rule (supports nesting for bounded-support families).
  • janus::tensor_product_quadrature(rules): Combine 1D rules into an N-D tensor-product grid.
  • janus::smolyak_sparse_grid(dims, level, opts): Build a Smolyak sparse grid for multi-dimensional integration.
  • janus::StochasticQuadratureRule: Rule type selector (Gauss, ClenshawCurtis, GaussKronrod15, AutoNested).
  • janus::SmolyakQuadratureOptions: Options for merge tolerance and zero-weight tolerance.

Usage Patterns

Rule Types

The public selector is janus::StochasticQuadratureRule:

  • Gauss: family-appropriate Gauss rule
  • ClenshawCurtis: nested Clenshaw-Curtis-like rule on bounded support
  • GaussKronrod15: embedded 7/15-point Legendre rule reused from quad(...)
  • AutoNested: use Clenshaw-Curtis for bounded Legendre/Jacobi dimensions and Gauss otherwise

All returned weights sum to 1 because they integrate against the underlying probability measure rather than against raw dx.

One-Dimensional Rules

Build a fixed-order rule:

auto uniform_rule =
auto gaussian_rule =
PolynomialChaosDimension hermite_dimension()
Create a standard normal (Hermite) dimension.
Definition PolynomialChaos.hpp:57

Build a refinement-level rule:

auto coarse =
2,
auto fine =
4,
@ ClenshawCurtis
Nested Clenshaw-Curtis-like rule on bounded support.
Definition Quadrature.hpp:56
UnivariateQuadratureRule stochastic_quadrature_level(const PolynomialChaosDimension &dimension, int level, StochasticQuadratureRule rule=StochasticQuadratureRule::AutoNested)
Build a one-dimensional stochastic quadrature rule from a refinement level.
Definition Quadrature.hpp:456

fine.nodes contains every node from coarse.nodes, which makes incremental refinement practical for bounded-support dimensions.

Tensor-Product Grids

Combine one-dimensional rules:

auto grid = janus::tensor_product_quadrature({x_rule, y_rule});
StochasticQuadratureGrid tensor_product_quadrature(const std::vector< UnivariateQuadratureRule > &rules)
Build the tensor-product grid from a list of one-dimensional rules.
Definition Quadrature.hpp:493

The resulting grid uses:

  • grid.samples: N x d sample matrix
  • grid.weights: N probability weights

It plugs straight into Janus PCE projection:

2);
janus::pce_projection_coefficients(basis, grid, values);
Multidimensional polynomial chaos basis with fixed truncation/order.
Definition PolynomialChaos.hpp:456
JanusVector< Scalar > pce_projection_coefficients(const PolynomialChaosBasis &basis, const NumericMatrix &samples, const NumericVector &weights, const JanusVector< Scalar > &sample_values)
Compute PCE projection coefficients from weighted samples (vector).
Definition PolynomialChaos.hpp:554
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67

No manual samples.col(0) = nodes reshaping is required.

Smolyak Sparse Grids

For higher-dimensional problems:

3);
StochasticQuadratureGrid smolyak_sparse_grid(const std::vector< PolynomialChaosDimension > &dimensions, int level, SmolyakQuadratureOptions options={})
Build a Smolyak sparse grid on probability measures.
Definition Quadrature.hpp:554

By default, AutoNested means:

  • Legendre / Jacobi axes use nested Clenshaw-Curtis refinement
  • Hermite / Laguerre axes use family-appropriate Gauss rules

This keeps bounded dimensions nested while still supporting unbounded Gaussian / gamma-like variables.

You can tune merging behavior with SmolyakQuadratureOptions:

dims,
4,
.merge_tolerance = 1e-12,
.zero_weight_tolerance = 1e-14
});
@ AutoNested
Use Clenshaw-Curtis on bounded families, Gauss otherwise.
Definition Quadrature.hpp:58
Options for Smolyak sparse-grid construction.
Definition Quadrature.hpp:64

Legendre Embedded 7/15 Rule

StochasticQuadratureRule::GaussKronrod15 exposes the same embedded Legendre 7/15-point rule that quad(...) uses internally for adaptive definite integration.

That gives you a lightweight nested refinement path for one-dimensional uniform variables:

auto coarse =
1,
auto fine =
2,
@ GaussKronrod15
Embedded 7/15-point Legendre rule reused from quad(...).
Definition Quadrature.hpp:57

This is intentionally a small embedded rule, not a full Gauss-Patterson ladder.

See Also