bacon-sci 0.16.2

Scientific computing in Rust
Documentation
use crate::differentiate::*;

fn exp(f: f64) -> f64 {
    f.exp()
}

fn quadratic(f: f64) -> f64 {
    f.powi(2)
}

fn sin(f: f64) -> f64 {
    f.sin()
}

#[test]
fn deriv() {
    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = derivative(exp, i, 0.1);
        assert!(((d - i.exp()) / i.exp()).abs() < 0.01);
    }

    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = derivative(quadratic, i, 0.1);
        if 2.0 * i.abs() > 0.05 {
            assert!(((d - 2.0 * i) / (2.0 * i)).abs() < 0.05);
        } else {
            assert!((d - 2.0 * i).abs() < 0.05);
        }
    }

    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = derivative(sin, i, 0.1);
        if i.cos().abs() > 0.05 {
            assert!(((d - i.cos()) / i.cos()).abs() < 0.01);
        } else {
            assert!((d - i.cos()).abs() < 0.05);
        }
    }
}

#[test]
fn second_deriv() {
    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = second_derivative(exp, i, 0.1);
        assert!(((d - i.exp()) / i.exp()).abs() < 0.01);
    }

    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = second_derivative(quadratic, i, 0.1);
        assert!(((d - 2.0) / 2.0).abs() < 0.05);
    }

    for i in -1000..1000 {
        let i = i as f64 * 0.01;
        let d = second_derivative(sin, i, 0.1);
        if i.sin().abs() > 0.05 {
            assert!(((d + i.sin()) / i.sin()).abs() < 0.01);
        } else {
            assert!((d + i.sin()).abs() < 0.05);
        }
    }
}