sequential_integration/engine/integrators/
first_integrator.rs

1use fehler::throws;
2
3use super::utils;
4use crate::{
5    engine::{
6        helper_equation_traits::EquationOfOneVariable,
7        quadrature::{FinalizeCalculation, GetQuadratureRange},
8        CalculationResult,
9    },
10    errors::Error,
11};
12
13pub struct FirstIntegrator;
14
15impl FirstIntegrator {
16    #[throws]
17    pub fn integrate<E: EquationOfOneVariable, G: GetQuadratureRange + FinalizeCalculation>(
18        a: f64,
19        b: f64,
20        h: f64,
21        equation: &E,
22        quadrature: &G,
23    ) -> f64 {
24        let borders_config = utils::BoundsConfigurator::configurate(a, b)?;
25
26        let mut result = CalculationResult::new();
27        let mut range = if let Some(range) = G::get_range_generator(borders_config.bounds, h)? {
28            range
29        } else {
30            return result.common;
31        };
32
33        loop {
34            let step = range.next()?;
35            result +=
36                equation.calculate(step, borders_config.bounds)? * borders_config.direction_coeff;
37
38            if step.is_last() {
39                break;
40            }
41        }
42
43        quadrature.finalize(result)?
44    }
45}