use crate::math::PI;
use crate::StrError;
pub(super) type NoArgs = u8;
#[allow(unused)]
pub(super) struct TestFunction {
pub name: &'static str, pub f: fn(f64, &mut NoArgs) -> Result<f64, StrError>, pub g: fn(f64, &mut NoArgs) -> Result<f64, StrError>, pub h: fn(f64, &mut NoArgs) -> Result<f64, StrError>, pub at_x: f64, pub tol_g: f64, pub tol_g_err: f64, pub tol_g_rerr: f64, pub improv_tol_g_diff: f64, pub tol_h: f64, pub tol_h_one_sided: f64, }
#[allow(dead_code)]
pub(super) fn get_functions() -> Vec<TestFunction> {
vec![
TestFunction {
name: "x",
f: |x, _| Ok(x),
g: |_, _| Ok(1.0),
h: |_, _| Ok(0.0),
at_x: 0.0,
tol_g: 1e-15,
tol_g_err: 1e-15,
tol_g_rerr: 1e-15,
improv_tol_g_diff: 1e-15,
tol_h: 1e-13,
tol_h_one_sided: 1e-11,
},
TestFunction {
name: "x²",
f: |x, _| Ok(x * x),
g: |x, _| Ok(2.0 * x),
h: |_, _| Ok(2.0),
at_x: 1.0,
tol_g: 1e-12,
tol_g_err: 1e-13,
tol_g_rerr: 1e-11,
improv_tol_g_diff: 1e-12,
tol_h: 1e-9,
tol_h_one_sided: 1e-7,
},
TestFunction {
name: "exp(x)",
f: |x, _| Ok(f64::exp(x)),
g: |x, _| Ok(f64::exp(x)),
h: |x, _| Ok(f64::exp(x)),
at_x: 2.0,
tol_g: 1e-11,
tol_g_err: 1e-5,
tol_g_rerr: 1e-10,
improv_tol_g_diff: 1e-10, tol_h: 1e-8,
tol_h_one_sided: 1e-6,
},
TestFunction {
name: "exp(-x²)",
f: |x, _| Ok(f64::exp(-x * x)),
g: |x, _| Ok(-2.0 * x * f64::exp(-x * x)),
h: |x, _| Ok(-2.0 * f64::exp(-x * x) + 4.0 * x * x * f64::exp(-x * x)),
at_x: 2.0,
tol_g: 1e-13,
tol_g_err: 1e-6,
tol_g_rerr: 1e-13,
improv_tol_g_diff: 1e-11, tol_h: 1e-11,
tol_h_one_sided: 1e-8,
},
TestFunction {
name: "1/x",
f: |x, _| Ok(1.0 / x),
g: |x, _| Ok(-1.0 / (x * x)),
h: |x, _| Ok(2.0 / (x * x * x)),
at_x: 0.2,
tol_g: 1e-8,
tol_g_err: 1e-3,
tol_g_rerr: 1e-11,
improv_tol_g_diff: 1e-9, tol_h: 1e-8,
tol_h_one_sided: 1e-7,
},
TestFunction {
name: "x⋅√x",
f: |x, _| Ok(x * f64::sqrt(x)),
g: |x, _| Ok(1.5 * f64::sqrt(x)),
h: |x, _| Ok(0.75 / f64::sqrt(x)),
at_x: 25.0,
tol_g: 1e-10,
tol_g_err: 1e-9,
tol_g_rerr: 1e-9,
improv_tol_g_diff: 1e-10,
tol_h: 1e-7,
tol_h_one_sided: 1e-6,
},
TestFunction {
name: "sin(1/x)",
f: |x, _| Ok(f64::sin(1.0 / x)),
g: |x, _| Ok(-f64::cos(1.0 / x) / (x * x)),
h: |x, _| Ok(2.0 * f64::cos(1.0 / x) / (x * x * x) - f64::sin(1.0 / x) / (x * x * x * x)),
at_x: 0.5,
tol_g: 1e-10,
tol_g_err: 1e-4,
tol_g_rerr: 1e-11,
improv_tol_g_diff: 1e-10,
tol_h: 1e-9,
tol_h_one_sided: 1e-8,
},
TestFunction {
name: "cos(π⋅x/2)",
f: |x, _| Ok(f64::cos(PI * x / 2.0)),
g: |x, _| Ok(-f64::sin(PI * x / 2.0) * PI / 2.0),
h: |x, _| Ok(-f64::cos(PI * x / 2.0) * PI * PI / 4.0),
at_x: 1.0,
tol_g: 1e-12,
tol_g_err: 1e-6,
tol_g_rerr: 1e-12,
improv_tol_g_diff: 1e-10, tol_h: 1e-14,
tol_h_one_sided: 1e-7,
},
]
}