3 个版本
使用旧的 Rust 2015
0.0.3 | 2018 年 12 月 3 日 |
---|---|
0.0.2 | 2018 年 12 月 2 日 |
0.0.1 | 2018 年 12 月 2 日 |
#4 in #gsl
68KB
1.5K SLoC
Integrators
一个 Rust 包,提供了数值积分器的通用接口。它包括为 GSL 和 Cuba 库中的积分器实现的该接口。
GSL 包装器
在基于 Ubuntu 的系统上,这些包装器应与 libgsl-dev
一起工作。如果您不希望使用这些包装器,可以通过禁用 gsl
功能来禁用它们。这些算法只能积分一维积分。
有关完整列表的积分算法,请参阅 GSL 文档此处。目前,仅实现了四个包装器
- QAG 是一种通用的自适应积分算法,应该适用于大多数行为良好的函数。
- QNG 是一种类似通用的 非 自适应算法,应用一系列固定阶数的求积规则。此算法比 QAG 消耗更少的开销,因此可能为易于积分的函数提供性能提升。
- QAGS 是一种自适应的通用算法,可以处理某些类型的奇点。
- QAGP 与 QAGS 相同,但要求用户提供一个已知奇点位置的列表。
随着工作的进行,我将添加更多函数的包装器。
Cuba 包装器
Cuba 是一套高级的多维数值积分算法套件,包括蒙特卡洛和确定性方法。有关详细信息和使用说明,请参阅其文档此处。如果您不希望使用这些包装器,可以通过禁用 cuba
功能来禁用它们。
Cuba 有四种算法:Vegas、Suave、Cuhre 和 Divonne。目前,仅实现了前三种;最后一种有几个用于寻找奇点的额外参数,我还没有处理。
示例
此示例将使用 GSL 积分器在给定范围内对高斯函数进行积分。当然,在实际应用中,您可能需要找到 erf()
实现来调用,但这可以说明其用法。
extern crate integrators;
use integrators::{Integrator, Real};
fn integrate_gaussian(from: f64, to: f64, sigma: f64, mean: f64) -> f64 {
let normalization = (2f64 * ::std::f64::consts::PI).sqrt() * sigma;
integrators::gsl::QAG::new(1000)
.with_range(from, to)
.integrate(|x: Real| {
(-((x - mean) / (2f64 * sigma)).powi(2)).exp()
/ normalization
}, 1e-6, 1e-18)
.unwrap()
.value
}
fn main() {
let ranges: &'static [(Real, Real)] = &[(-0.3, 0.0), (0.0, 1.5),
(1.5, 3.2), (3.2, 5.9)];
for &(a, b) in ranges.iter() {
let integrated = integrate_gaussian(a, b, 1.0, 0.0);
println!("range: {}, {}", a, b);
println!("integrated: {}", integrated);
}
}
无运行时依赖
~0–2MB
~37K SLoC