是否有一个 GPL 库或一段免费可用的代码来实现想象的错误函数:
erfi(x)=-i*erf(i*x)
x
任何复数(或至少是实数)在哪里i
,虚数单位是哪里?
实数和复数参数的所有常用误差函数的免费/开源 C++ 实现,包括 erfi 和缩放 erfi(以消除 erfi 的指数增长)(Dawson 函数),包括对实数参数的 erfi 的优化,是可在http://ab-initio.mit.edu/Faddeeva获得
(请注意,此实现实际上用于即将发布的 SciPy 0.12 版本,替换早期版本中存在准确性问题的 complex-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 的要求,但我没有看到许多不基于订阅并采用复杂参数的实现,因此您可能会受限于其他语言包而没有自己实现它。
!EDIT下面显示的答案不扩展到复数编辑!
如果您使用 C++,请尝试查看 Boost 的数学库(此处定义了 erf,并且 boost 支持复数,因此您应该能够直接将其与复数一起使用以执行 erfi 计算的右侧:i*erf( i*x)。
对于 的实际值x
,您可以使用实现Dawson 函数的 GNU Scientific Library (GSL) 。将此函数的值乘以 2π -1/2 exp( x 2 ),得到 erfi( x )。