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
double integral = 0.0;
for (Eigen::Index i = 0; i < rule.nodes.size(); ++i) {
integral += rule.weights(i) * rule.nodes(i) * rule.nodes(i);
}
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:
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);
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