#faddeeva #dawson #errorfunction

errorfunctions

纯 Rust 包,用于计算误差函数、Dawson 函数和 Faddeeva 函数的实部和复部

3 个不稳定版本

0.2.0 2022 年 10 月 25 日
0.1.1 2022 年 10 月 14 日
0.1.0 2022 年 10 月 14 日

#460 in 数学

Download history 208/week @ 2024-03-11 134/week @ 2024-03-18 123/week @ 2024-03-25 234/week @ 2024-04-01 169/week @ 2024-04-08 175/week @ 2024-04-15 76/week @ 2024-04-22 148/week @ 2024-04-29 170/week @ 2024-05-06 173/week @ 2024-05-13 93/week @ 2024-05-20 47/week @ 2024-05-27 26/week @ 2024-06-03 140/week @ 2024-06-10 43/week @ 2024-06-17 103/week @ 2024-06-24

320 次每月下载
用于 rustquant

MIT 许可证

145KB
1.5K SLoC

此包允许计算

  1. 误差函数 erf(z) 的复部和实部 z

$$ {\rm erf}(z) = \frac{2}{\sqrt{\pi}} \int_0^z e^{-t^2} dt $$

  1. 补余误差函数 erfc(z) 的复部和实部 z

$$ {\rm erfc}(z) = 1 - {\rm erf}(z) $$

  1. 虚误差函数 erfi(z) 的复部和实部 z

$$ {\rm erfi}(z) = -i\ {\rm erf}(i z) = \frac{2}{\sqrt{\pi}} \int_0^z e^{t^2} dt $$

  1. 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 $$

  1. 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) $$

  1. 缩放补余误差函数 erfcx(z) 的复部和实部 z

$$ {\rm erfcx}(z) = e^{z^2} \ {\rm erfc}(z) = {\rm w}(i z) $$

  1. 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