Crates.io | quad-rs |
lib.rs | quad-rs |
version | |
source | src |
created_at | 2022-02-06 14:49:21.509892 |
updated_at | 2024-11-11 17:52:05.226509 |
description | Adaptive Gauss-Kronrod Integration in Rust |
homepage | https://github.com/cgubbin/quad-rs/ |
repository | https://github.com/cgubbin/quad-rs/ |
max_upload_size | |
id | 527872 |
Cargo.toml error: | TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
This crate provides an implementation of adaptive Gauss-Kronrod integration. It aims to provide a suite of integration methods including:
A problem to be integrated needs to implement the Integrable
trait. This has one method integrand
, which takes the integration variable as an argument and returns the integrand. The type of the integration variable Input
and the integrand Output
must also be defined.
use quad_rs::Integrable;
struct Problem {}
impl Integrable for Problem {
type Input = f64;
type Output = f64;
fn integrand(
&self,
input: &Self::Input,
) -> Result<Self::Output, quad_rs::EvaluationError<Self::Input>> {
Ok(input.exp())
}
}
To solve the problem an Integrator
is used
use quad_rs::Integrator;
let integrator = Integrator::default()
.with_maximum_iter(1000)
.relative_tolerance(1e-8);
let range = std::ops::Range {
start: (-1f64),
end: 1f64,
};
let solution = integrator.integrate(Problem {}, range).unwrap();
use quad_rs::{Integrable, Integrator};
struct Problem {}
impl Integrable for Problem {
type Input = f64;
type Output = f64;
fn integrand(
&self,
input: &Self::Input,
) -> Result<Self::Output, quad_rs::EvaluationError<Self::Input>> {
Ok(input.exp())
}
}
let integrator = Integrator::default()
.with_maximum_iter(1000)
.relative_tolerance(1e-8);
let range = std::ops::Range {
start: (-1f64),
end: 1f64,
};
let solution = integrator.integrate(Problem {}, range).unwrap();
let analytical_result = std::f64::consts::E - 1. / std::f64::consts::E;
approx::assert_relative_eq!(
solution.result.result.unwrap(),
analytical_result,
max_relative = 1e-10
)
use quad_rs::{Integrable, Integrator};
use num_complex::Complex;
use std::ops::Range;
struct Problem {}
impl Integrable for Problem {
type Input = Complex<f64>;
type Output = Complex<f64>;
fn integrand(
&self,
input: &Self::Input,
) -> Result<Self::Output, quad_rs::EvaluationError<Self::Input>> {
Ok(input.exp())
}
}
let integrator = Integrator::default()
.with_maximum_iter(1000)
.relative_tolerance(1e-8);
let range = Range {
start: Complex::new(-1f64, -1f64),
end: Complex::new(1f64, 1f64)
};
let solution = integrator.integrate(Problem {}, range).unwrap();
use quad_rs::{Integrable, Integrator};
use num_complex::Complex;
use std::ops::Range;
struct Problem {}
impl Integrable for Problem {
type Input = f64;
type Output = Complex<f64>;
fn integrand(
&self,
input: &Self::Input,
) -> Result<Self::Output, quad_rs::EvaluationError<Self::Input>> {
Ok(input.exp())
}
}
let integrator = Integrator::default()
.with_maximum_iter(1000)
.relative_tolerance(1e-8);
let range = Range {
start: (-1f64),
end: 1f64,
};
let solution = integrator
.integrate_real_complex(Problem {}, range)
.unwrap();
let result = solution.result.result.unwrap();
let analytical_result = std::f64::consts::E - 1. / std::f64::consts::E;
dbg!(&result, &analytical_result);
use quad_rs::{Contour, Direction, Integrable, Integrator}
use num_complex::Complex;
let x_range =-5f64..5f64;
let y_range = -5f64..5f64;
let contour = Contour::generate_rectangular(&x_range, &y_range, Direction::Clockwise);
struct Problem {}
impl Integrable for Problem {
type Input = Complex<f64>;
type Output = Complex<f64>;
fn integrand(
&self,
input: &Self::Input,
) -> Result<Self::Output, quad_rs::EvaluationError<Self::Input>> {
Ok(input.exp())
}
}
let integrator = Integrator::default()
.with_maximum_iter(1000)
.relative_tolerance(1e-8);
let solution = integrator.contour_integrate(Problem {}, contour).unwrap();