sequential_integration/engine/integrators/
first_integrator.rs1use 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}