use crate::algebra::abstr::Real;
use crate::analysis::integral::gauss_legendre::root_weight::RootWeight;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct GaussLegendre<T> {
root_weight: RootWeight<T>,
}
impl<T> GaussLegendre<T>
where
T: Real,
{
pub fn new(n: u8) -> GaussLegendre<T> {
GaussLegendre {
root_weight: RootWeight::new(n),
}
}
pub fn integrate<F>(&self, f: &F, a: T, b: T) -> T
where
F: Fn(T) -> T,
{
let sum = self.root_weight.iter().fold(T::zero(), |s, (x_i, a_i)| {
let x = (b - a) / T::from_f64(2.0) * x_i + (a + b) / T::from_f64(2.0);
s + f(x) * a_i
});
(b - a) / T::from_f64(2.0) * sum
}
}