||
在所考虑的物理问题中,文献中所提供的公式涉及到了复变量的互补误差函数erfc(z)。由于是第一次接触这个函数,出于效率的考虑,像往常那样,查阅Abramowitz和Stegun的Handbook of mathematical functions with formulas, graphs, and mathematical tables,试图找到数值上直接能用的表达式。不过结果不是很理想,虽然找到了个近似式,但里面涉及无穷级数,还是比较麻烦。
检索网络,发现Fortran原来自带误差函数erf(x)与互补误差函数erfc(x),惊喜之余却发现,它们只能计算实变量。不得已,继续检索网络,看看别人怎么做的。终于,在fortran, Error Function of Complex Argument (computer-programming-forum.com)这里发现了线索,在Collected Algorithms of the ACM (netlib.org)程序库中,680号算法中的WOFZ(z)子程序能够用来复变量的erfc计算!它的思路是,以复变量的实部和虚部作为输入量,计算一个叫做FADDEEVA函数的函数w(z),它满足w(z)=exp(-z^2)*erfc(-iz)。基于此,可以计算误差函数erfc(-iz)=w(z)/exp(-z^2)。如果令u=iz和u=x+iy,则z=-iu,因此就有erfc(u)=w(-iu)/exp(-(-iu)^2)。
由于这是个Fortran77格式的子程序,利用在线F77到F90的格式转换程序处理一下后,直接复制到我的主程序里进行调用测试。利用WolframAlpha在线计算检验,结果一致:
【例1】erfc(2.0+i*1.0)
Wolfram:
-0.00360634... + 0.0112590... i
WOFZ(z)结果:
erfc_c= ( -3.6063427256517490E-003, 1.1259006028815020E-002)
【例2】erfc(5.0+i*3.0)
Wolfram:
6.82089×10^-9 + 8.38729×10^-9 i
WOFZ(z)结果:
erfc_c= ( 6.8208922065736166E-009, 8.3872893117202845E-009)
不求做多大的事情,但求每天结束的时候都能感到今天有了一点点新收获,这种感觉真好!
【参考资料】
Algorithm 680: evaluation of the complex error function | ACM Transactions on Mathematical Software
fortran, Error Function of Complex Argument (computer-programming-forum.com)
Wolfram|Alpha: Computational Intelligence (wolframalpha.com)
【备用资料】
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-8 04:36
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社