c++中的虚误差函数

imaginary error function in c++

本文关键字:误差 函数 c++      更新时间:2023-10-16

是否有一个GPL库或一段代码可以免费实现虚错误函数:

erfi(x)=-i*erf(i*x)

其中x是任何复数(或至少是实数),i是虚单位?

一个免费/开源的C++实现,用于实参数和复杂参数的所有常见错误函数,包括erfi和缩放的erfi(以抵消erfi的指数增长)(Dawson函数),包括对实参数的erfi的优化,可在http://ab-initio.mit.edu/Faddeeva

(请注意,这个实现实际上在即将发布的SciPy 0.12版本中使用,取代了早期版本中存在准确性问题的复杂erf代码:http://projects.scipy.org/scipy/ticket/1207)

(不幸的是,评估复杂参数的特殊函数并不像将复数插入实际参数的代码中那么简单,这就是为什么Boost的实值erf中的模板化在这里没有帮助的原因。)

在发现Boost不支持erf函数的复数后,我进行了更多的搜索。我发现了几个每年100美元的C++数学包,这不能满足你的需求。然后我查看了其他语言,发现Python中的SciPy包在其erf函数中确实支持复数。

>>> from scipy.special import erf
>>> from numpy import complex
>>> erfi = lambda z: complex(0.0, -1.0)*erf(complex(0.0, 1.0)*z)
>>> z_in = complex(0.75, 1.25)
>>> erfi(z_in)
(0.09511238... + 1.0828473...j)

这与wolphramalpha的erfi(0.75+1.25*i)完全匹配。

因此,要在C++中使用它,您可以通过Boost.Python、Cython或各种其他包来集成它。有关在C++中封装Python的一些代码示例,请参阅在C++中嵌入Python。请注意,这确实增加了在您的系统上安装Python和SciPy的要求,但我没有看到许多实现不是基于订阅的,并且需要复杂的参数,所以您可能会被限制在其他语言包中,而不自己实现它。

!编辑下面显示的答案不扩展到复数编辑

如果你使用C++,那么试着查看Boost的数学库(这里定义了erf,Boost支持复数,所以你应该能够直接将它与复数值一起使用,以执行erfi的右侧计算:i*erf(i*x)。

对于x的实际值,您可以使用GNU科学库(GSL),它实现了Dawson函数。将该函数的值乘以2π-1/2exp(x2),得到erfi(x)。