multicalc 0.10.0

Math for real-time embedded systems, in stable no_std Rust: state estimation, control, kinematics, Lie groups, autodiff, and linear algebra — from 64-bit servers to bare-metal microcontrollers
Documentation
//! Gaussian quadrature node and weight tables.
//!
//! The per-family data files are generated by
//! `scripts/build_gaussian_integration_tables.py`.

use crate::error::IntegrateError;
use crate::numerical_integration::GaussianQuadratureMethod;

pub mod hermite;
pub mod laguerre;
pub mod legendre;

/// Highest supported quadrature order.
pub const MAX_ORDER: usize = 30;

/// Returns the `(weight, abscissa)` pairs for a quadrature method and order.
///
/// ```
/// use multicalc::gaussian_tables::nodes;
/// use multicalc::numerical_integration::GaussianQuadratureMethod;
///
/// const PAIRS: &[(f64, f64)] = match nodes(GaussianQuadratureMethod::GaussLegendre, 4) {
///     Ok(t) => t,
///     Err(_) => panic!("order 4 must exist"),
/// };
/// assert_eq!(PAIRS.len(), 4);
/// ```
pub const fn nodes(
    method: GaussianQuadratureMethod,
    order: usize,
) -> Result<&'static [(f64, f64)], IntegrateError> {
    let table: &[&[(f64, f64)]] = match method {
        GaussianQuadratureMethod::GaussLegendre => &legendre::LEGENDRE,
        GaussianQuadratureMethod::GaussHermite => &hermite::HERMITE,
        GaussianQuadratureMethod::GaussLaguerre => &laguerre::LAGUERRE,
    };

    if order == 0 || order > MAX_ORDER {
        return Err(IntegrateError::QuadratureOrderOutOfRange);
    }
    Ok(table[order])
}