use crate::algebra::abstr::Real;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::RootWeight;
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug)]
pub struct GaussKronrod<T> {
root_weight: RootWeight<T>,
}
impl<T> Default for GaussKronrod<T>
where
T: Real,
{
fn default() -> GaussKronrod<T> {
GaussKronrod {
root_weight: RootWeight::default(),
}
}
}
impl<T> GaussKronrod<T>
where
T: Real,
{
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_i_scaled = (b - a) / T::from_f64(2.0) * x_i + (a + b) / T::from_f64(2.0);
s + f(x_i_scaled) * a_i
});
(b - a) / T::from_f64(2.0) * sum
}
}