Crates.io | quadrature |
lib.rs | quadrature |
version | 0.1.2 |
source | src |
created_at | 2016-12-12 04:29:02.800192 |
updated_at | 2017-01-09 19:00:34.509155 |
description | This provides several fast numerical integration methods. This library is pure safe rust, and cross-platform. The double exponential algorithm is naturally adaptive, and does not allocate. |
homepage | |
repository | https://github.com/Eh2406/quadrature |
max_upload_size | |
id | 7548 |
size | 54,990 |
This library provides fast numerical integration of one dimensional, real valued, functions over finite intervals. It is pure safe rust, and cross-platform.
The primary function is quadrature::integrate
, witch uses the double exponential algorithm. It is a port of the Fast Numerical Integration from c++ to rust. The original code is by John D. Cook, and is licensed under the BSD.
The double exponential algorithm is naturally adaptive, it stops calling the integrand when the error is reduced to below the desired threshold. It also does not allocate. No box, no vec, etc. It has a hard coded maximum of approximately 350 function evaluations. This guarantees that the algorithm will return. The error in the algorithm decreases exponentially in the number of function evaluations, specifically O(exp(-cN/log(N))). So if 350 function evaluations is not giving the desired accuracy than the programmer probably needs to give some guidance by splitting up the range at singularities or other preparation techniques.
The clenshaw_curtis
module provides a integrate
function with the same signature as quadrature::integrate
.
The implemented variant of clenshaw curtis quadrature is adaptive, however the weights change for each adaptation. This unfortunately means that the sum needs to be recalculated for each layer of adaptation.
It also does not allocate on the heap, however it does use a [f64; 129]
to store the function values. It has a hard coded maximum of approximately 257 function evaluations. This guarantees that the algorithm will return.
The clenshaw curtis algorithm exactly integrates polynomials of order N. This implementation starts with an N of approximately 5 and increases up to an N of approximately 257. In general the error in the algorithm decreases exponentially in the number of function evaluations. In summery clenshaw curtis will in general use more stack space and run slower than the double exponential algorithm, unless clenshaw curtis can get the exact solution.
I have been testing against rust 1.0
with:
> rustup override set 1.0.0
> cargo test
> rustup override set nightly
> cargo test
> cargo bench
It is also tested on travis . I think bumping rust version is a breaking change, and will be respected in semver.