quad-rs 0.5.0

Adaptive Gauss-Kronrod Integration in Rust
Documentation
use num_complex::Complex;
use quad_rs::{
    CircularArc, Contour, ContourSegment, Integrable, IntegratorConfig, integrate_complex,
};

struct InverseZ;

impl Integrable for InverseZ {
    type Float = f64;
    type Input = Complex<f64>;
    type Output = Complex<f64>;

    fn integrand(&self, z: &Complex<f64>) -> Complex<f64> {
        Complex::new(1.0, 0.0) / *z
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let upper_semicircle = Contour::from_pieces(vec![ContourSegment::CircularArc(
        CircularArc::new(Complex::new(0.0, 0.0), 1.0, 0.0, std::f64::consts::PI),
    )]);

    let result = integrate_complex(InverseZ, upper_semicircle, IntegratorConfig::default())?;

    println!("Integral estimate: {}", result.integral);
    println!(
        "Expected:          {}",
        Complex::new(0.0, std::f64::consts::PI)
    );
    println!("Error estimate:    {}", result.error);

    Ok(())
}