Mathematica中的复杂误差函数

cra*_*sic 6 wolfram-mathematica

复杂的误差函数 W(Z)被定义为e^(-x^2) erfc(-ix).使用上面定义的w(z)的问题是erfc倾向于爆发出更大的x(由指数变为0补充所以一切都保持很小),因此Mathematica恢复到使生命非常缓慢的任意精度计算.该功能用于实现voigt轮廓 - 一种常用于光谱学和其他相关领域的线形.现在,我恢复到曾经计算线形和使用插值来加快速度,但是这并没有让我改变线形参数(或适合他们)很容易.

scipy有一个很好的快速实现w(z)as scipy.special.wofz,我想知道Mathematica中是否有一个等价物.

Sim*_*mon 5

复杂的误差函数可以用Hermite"多项式"来编写H_{-1}(x):

In[1]:= FullSimplify[2 HermiteH[-1,I x] == Sqrt[Pi] Exp[-x^2] Erfc[I x]]
Out[1]= True
Run Code Online (Sandbox Code Playgroud)

并且评估不会遭受许多下溢和溢出

In[68]:= 2 HermiteH[-1, I x] /. x -> 100000.
Out[68]= 6.12323*10^-22 - 0.00001 I

In[69]:= Sqrt[Pi] E^-x^2 Erfc[I x] /. x -> 100000.
During evaluation of In[69]:= General::unfl: Underflow occurred in computation. >>
During evaluation of In[69]:= General::ovfl: Overflow occurred in computation. >>
Out[69]= Indeterminate
Run Code Online (Sandbox Code Playgroud)

也就是说,一些快速测试表明,Hermite函数的评估速度要比指数和误差函数的速度慢......