c ++中的虚构错误函数

时间:2012-08-03 21:23:27

标签: c++ math

是否有可用的GPL库或一段代码实现了虚构的错误函数:

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

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

3 个答案:

答案 0 :(得分:9)

实时和复杂参数的所有常用错误函数的免费/开源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中的模板对此没有帮助。)

答案 1 :(得分:3)

在发现Boost不支持erf函数的复数后,我做了一些搜索。我发现每年有几百美元的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的一些代码示例,请参阅embedding Python in C++。请注意,这确实增加了在系统上安装Python和SciPy的要求,但我没有看到许多实现不是基于订阅的并且采用了复杂的参数,因此您可能会被限制为其他语言包,而无需自己实现。

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

如果您正在使用C ++,那么请尝试查看Boost的数学库(erf定义为here并且boost支持复数,因此您应该能够直接使用复数值来执行它的右侧erfi的计算:i * erf(i * x)。

答案 2 :(得分:-1)

对于x的实际值,您可以使用GSL,它实现Dawson function