3 个不稳定版本
0.2.0 | 2022 年 10 月 25 日 |
---|---|
0.1.1 | 2022 年 10 月 14 日 |
0.1.0 | 2022 年 10 月 14 日 |
#460 in 数学
320 次每月下载
用于 rustquant
145KB
1.5K SLoC
此包允许计算
- 误差函数
erf(z)
的复部和实部z
$$ {\rm erf}(z) = \frac{2}{\sqrt{\pi}} \int_0^z e^{-t^2} dt $$
- 补余误差函数
erfc(z)
的复部和实部z
$$ {\rm erfc}(z) = 1 - {\rm erf}(z) $$
- 虚误差函数
erfi(z)
的复部和实部z
$$ {\rm erfi}(z) = -i\ {\rm erf}(i z) = \frac{2}{\sqrt{\pi}} \int_0^z e^{t^2} dt $$
- Dawson 函数
dawson(z)
的复部和实部z
$$ {\rm dawson}(z) = \frac{\sqrt{\pi}}{2} \ e^{-z^2} \ {\rm erfi}(z) = e^{-z^2} \int_0^z e^{t^2} dt $$
- Faddeeva 函数
w(z)
的复部和实部z
$$ {\rm w}(z) = e^{-z^2}\ {\rm erfc}(-i z) = e^{-z^2} \ \left(1 + \frac{2i}{\sqrt{\pi}} \int_0^z e^{t^2} dt \right) $$
- 缩放补余误差函数
erfcx(z)
的复部和实部z
$$ {\rm erfcx}(z) = e^{z^2} \ {\rm erfc}(z) = {\rm w}(i z) $$
- Faddeeva 函数的虚部
w_im(x)
的实部x
$$ {\rm w}\_{\rm im}(x) = {\rm Im}({\rm w}(x)) = e^{-x^2} {\rm erfi}(x) $$
此crate的实现是Steven G. Johnson的C/C++库Faddeeva在Rust中的移植。对于Complex<f64>
或f64
参数,函数以高效的方式计算到机器精度。这些函数可以正确处理NaN和无穷大(正负)参数。
示例
计算复数参数的错误函数可以像以下示例那样进行
use num::complex::Complex;
use errorfunctions::ComplexErrorFunctions;
fn main() {
let z = Complex::<f64>::new(1.21, -0.93);
println!("z = {}", z);
println!("erf(z) = {}", z.erf());
println!("erfc(z) = {}", z.erfc());
println!("erfcx(z) = {}", z.erfcx());
println!("erfi(z) = {}", z.erfi());
println!("w(z) = {}", z.w());
println!("dawson(z) = {}", z.dawson());
}
计算实数参数的错误函数可以像以下示例那样进行
use errorfunctions::RealErrorFunctions;
fn main() {
let x: f64 = 0.934;
println!("x = {}", x);
println!("erf(x) = {}", x.erf());
println!("erfc(x) = {}", x.erfc());
println!("erfcx(x) = {}", x.erfcx());
println!("erfi(x) = {}", x.erfi());
println!("Im(w(x)) = {}", x.w_im());
println!("dawson(x) = {}", x.dawson());
}
如果出于某种原因,您不需要机器精度,您可以指定所需的相对误差,如下所示
use num::complex::Complex;
use errorfunctions::*;
fn main() {
let z = Complex::<f64>::new(1.21, -0.93);
let relerror = 1.0e-3;
println!("z = {}", z);
println!("erf(z) = {}", erf_with_relerror(z, relerror));
println!("erfc(z) = {}", erfc_with_relerror(z, relerror));
println!("erfcx(z) = {}", erfcx_with_relerror(z, relerror));
println!("erfi(z) = {}", erfi_with_relerror(z, relerror));
println!("w(z) = {}", w_with_relerror(z, relerror));
println!("dawson(z) = {}", dawson_with_relerror(z, relerror));
}
设置relerror=0.0
返回机器精度。
Toml文件
请在您的Cargo.toml文件中包含以下行
[dependencies]
num = "0.4.0"
errorfunctions = "*"
其中*
是此errorfunctions
包的最新版本。
测试
原始Faddeeva代码中的大量单元测试也被移植到Rust中,并包含在此crate中。
致谢
由于这是对Steven G. Johnson的C++代码的几乎逐字逐句的Rust翻译,因此应归功于他。
依赖项
~465KB