use crate::numerical_integration::mode::*;
use crate::numerical_integration::iterative_integration;
use crate::numerical_integration::gaussian_integration;
use crate::numerical_integration::integrator::*;
use crate::utils::error_codes::*;
#[test]
fn test_booles_integration_1()
{
let func = | args: f64 | -> f64
{
return 2.0*args;
};
let integration_limit = [0.0, 2.0];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(100, IterativeMethod::Booles);
let val = integrator.get_single(&func, &integration_limit).unwrap();
assert!(f64::abs(val - 4.0) < 1e-14);
}
#[test]
fn test_booles_integration_2()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limit = [0.0, 1.0];
let point = [1.0, 2.0, 3.0];
let integrator = iterative_integration::MultiVariableSolver::from_parameters(100, IterativeMethod::Booles);
let val = integrator.get_single_partial(&func, 0, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 7.0) < 1e-25);
let integration_limit = [0.0, 2.0];
let val = integrator.get_single_partial(&func, 1, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 10.0) < 0.00001);
let integration_limit = [0.0, 3.0];
let val = integrator.get_single_partial(&func, 2, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 15.0) < 0.00001);
}
#[test]
fn test_booles_integration_3()
{
let func = | args: f64 | -> f64
{
return 6.0*args;
};
let integration_limits = [[0.0, 2.0], [0.0, 2.0]];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(20, IterativeMethod::Booles);
let val = integrator.get_double(&func, &integration_limits).unwrap();
assert!(f64::abs(val - 24.0) < 0.00001);
}
#[test]
fn test_gauss_legendre_quadrature_integration_1()
{
let func = | args: f64 | -> f64
{
return 4.0*args*args*args - 3.0*args*args;
};
let integration_limit = [0.0, 2.0];
let integrator = gaussian_integration::SingleVariableSolver::from_parameters(4, GaussianQuadratureMethod::GaussLegendre);
let val = integrator.get_single(&func, &integration_limit).unwrap();
assert!(f64::abs(val - 8.0) < 1e-14);
}
#[test]
fn test_gauss_legendre_quadrature_integration_2()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limit = [0.0, 1.0];
let point = [1.0, 2.0, 3.0];
let integrator = gaussian_integration::MultiVariableSolver::from_parameters(2, GaussianQuadratureMethod::GaussLegendre);
let val = integrator.get_single_partial(&func, 0, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 7.0) < 1e-14);
let integration_limit = [0.0, 2.0];
let val = integrator.get_single_partial(&func, 1, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 10.0) < 1e-14);
let integration_limit = [0.0, 3.0];
let val = integrator.get_single_partial(&func, 2, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 15.0) < 1e-14);
}
#[test]
fn test_gauss_legendre_quadrature_integration_3()
{
let func = | args: f64 | -> f64
{
return 6.0*args;
};
let integration_limits = [[0.0, 2.0], [0.0, 2.0]];
let integrator = gaussian_integration::SingleVariableSolver::from_parameters(2, GaussianQuadratureMethod::GaussLegendre);
let val = integrator.get_double(&func, &integration_limits).unwrap();
assert!(f64::abs(val - 24.0) < 1e-14);
}
#[test]
fn test_simpsons_integration_1()
{
let func = | args: f64 | -> f64
{
return 2.0*args;
};
let integration_limit = [0.0, 2.0];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(200, IterativeMethod::Simpsons);
let val = integrator.get_single(&func, &integration_limit).unwrap();
assert!(f64::abs(val - 4.0) < 0.05);
}
#[test]
fn test_simpsons_integration_2()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limit = [0.0, 1.0];
let point = [1.0, 2.0, 3.0];
let integrator = iterative_integration::MultiVariableSolver::from_parameters(200, IterativeMethod::Simpsons);
let val = integrator.get_single_partial(&func, 0, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 7.0) < 0.05);
let integration_limit = [0.0, 2.0];
let val = integrator.get_single_partial(&func, 1, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 10.0) < 0.05);
let integration_limit = [0.0, 3.0];
let val = integrator.get_single_partial(&func, 2, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 15.0) < 0.05);
}
#[test]
fn test_simpsons_integration_3()
{
let func = | args: f64 | -> f64
{
return 6.0*args;
};
let integration_limits = [[0.0, 2.0], [0.0, 2.0]];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(200, IterativeMethod::Simpsons);
let val = integrator.get_double(&func, &integration_limits).unwrap();
assert!(f64::abs(val - 24.0) < 0.05);
}
#[test]
fn test_simpsons_integration_4()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limits = [[0.0, 1.0], [0.0, 1.0]];
let point = [1.0, 1.0, 1.0];
let integrator = iterative_integration::MultiVariableSolver::from_parameters(200, IterativeMethod::Simpsons);
let val = integrator.get_double_partial(&func, [0, 1], &integration_limits, &point).unwrap();
assert!(f64::abs(val - 1.50) < 0.05);
}
#[test]
fn test_trapezoidal_integration_1()
{
let func = | args: f64 | -> f64
{
return 2.0*args;
};
let integration_limit = [0.0, 2.0];
let iterator = iterative_integration::SingleVariableSolver::from_parameters(100, IterativeMethod::Trapezoidal);
let val = iterator.get_single(&func, &integration_limit).unwrap();
assert!(f64::abs(val - 4.0) < 0.00001);
}
#[test]
fn test_trapezoidal_integration_2()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limit = [0.0, 1.0];
let point = [1.0, 2.0, 3.0];
let iterator = iterative_integration::MultiVariableSolver::from_parameters(100, IterativeMethod::Trapezoidal);
let val = iterator.get_single_partial(&func, 0, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 7.0) < 0.00001);
let integration_limit = [0.0, 2.0];
let val = iterator.get_single_partial(&func, 1, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 10.0) < 0.00001);
let integration_limit = [0.0, 3.0];
let val = iterator.get_single_partial(&func, 2, &integration_limit, &point).unwrap();
assert!(f64::abs(val - 15.0) < 0.00001);
}
#[test]
fn test_trapezoidal_integration_3()
{
let func = | args: f64 | -> f64
{
return 6.0*args;
};
let integration_limits = [[0.0, 2.0], [0.0, 2.0]];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(10, IterativeMethod::Trapezoidal);
let val = integrator.get_double(&func, &integration_limits).unwrap();
assert!(f64::abs(val - 24.0) < 0.00001);
}
#[test]
fn test_trapezoidal_integration_4()
{
let func = | args: &[f64; 3] | -> f64
{
return 2.0*args[0] + args[1]*args[2];
};
let integration_limits = [[0.0, 1.0], [0.0, 2.0]];
let point = [1.0, 2.0, 3.0];
let integrator = iterative_integration::MultiVariableSolver::from_parameters(10, IterativeMethod::Trapezoidal);
let val = integrator.get_double_partial(&func, [0, 1], &integration_limits, &point).unwrap();
assert!(f64::abs(val - 8.0) < 0.00001);
}
#[test]
fn test_error_checking_1()
{
let func = | args: f64 | -> f64
{
return 2.0*args;
};
let integration_limit = [10.0, 1.0];
let integrator = iterative_integration::SingleVariableSolver::default();
let result = integrator.get_single(&func, &integration_limit);
assert!(result.is_err());
assert!(result.unwrap_err() == INTEGRATION_LIMITS_ILL_DEFINED);
}
#[test]
fn test_error_checking_2()
{
let func = | args: f64 | -> f64
{
return 2.0*args;
};
let integration_limit = [0.0, 1.0];
let integrator = iterative_integration::SingleVariableSolver::from_parameters(0, IterativeMethod::Booles);
let result = integrator.get_single(&func, &integration_limit);
assert!(result.is_err());
assert!(result.unwrap_err() == INTEGRATION_CANNOT_HAVE_ZERO_ITERATIONS);
}
#[test]
fn test_error_checking_3()
{
let func = | args: f64 | -> f64
{
return 4.0*args*args*args - 3.0*args*args;
};
let integration_limit = [0.0, 2.0];
let integrator = gaussian_integration::SingleVariableSolver::from_parameters(0, GaussianQuadratureMethod::GaussLegendre);
let result = integrator.get_single(&func, &integration_limit);
assert!(result.is_err());
assert!(result.unwrap_err() == GAUSSIAN_QUADRATURE_ORDER_OUT_OF_RANGE);
}
#[test]
fn test_error_checking_4()
{
let func = | args: f64 | -> f64
{
return 4.0*args*args*args - 3.0*args*args;
};
let integration_limit = [0.0, 2.0];
let integrator = gaussian_integration::SingleVariableSolver::from_parameters(31, GaussianQuadratureMethod::GaussLegendre);
let result = integrator.get_single(&func, &integration_limit);
assert!(result.is_err());
assert!(result.unwrap_err() == GAUSSIAN_QUADRATURE_ORDER_OUT_OF_RANGE);
}