Code covered by the BSD License  

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
Faddeeva Package: complex error functions

4.75
4.8 | 4 ratings Rate this file 12 Downloads (last 30 days) File Size: 50.1 KB File ID: #38787 Version: 1.5
image thumbnail

Faddeeva Package: complex error functions

by

 

26 Oct 2012 (Updated )

C++ MEX plugins to compute error functions (erf, erfc, erfi, erfcx, Faddeeva, ...) of complex args

| Watch this File

File Information
Description

C++ source code for compiled plugins (MEX files) to compute various error functions for complex arguments:

** Faddeeva_erf(z) -- the error function
** Faddeeva_erfc(z) = 1 - erf(z) -- complementary error function
** Faddeeva_erfi(z) = -i erf(iz) -- imaginary error function
** Faddeeva_erfcx(z) = exp(z^2) erfc(z) -- scaled complementary error function
** Faddeeva_w(z) = exp(-z^2) erfc(-iz) -- Faddeeva function
** Faddeeva_Dawson(z) = 0.5 sqrt(pi) exp(-z^2) erfi(z) -- Dawson function

From e.g. the Faddeeva function, one can also obtain the Voigt functions and other related functions.

Assuming you have a C++ compiler (and have configured it in MATLAB with mex -setup), compile by running the included Faddeeva_build.m script in MATLAB:

  Faddeeva_build

All of the functions have usage of the form:
  w = Faddeeva_w(z)
or optionally Faddeeva_w(z, relerr), where relerr is a desired relative error (default: machine precision). z may be an array or matrix of complex or real numbers.

This code may also be downloaded from

  http://ab-initio.mit.edu/Faddeeva

along with documentation and other versions. As described in the source code, this implementation uses a combination of algorithms for the Faddeeva function: a continued-fraction expansion for large |z| [similar to G. P. M. Poppe and C. M. J. Wijers, "More efficient computation of the complex error function," ACM Trans. Math. Soft. 16 (1), pp. 38–46 (1990)], and a completely different algorithm for smaller |z| [Mofreh R. Zaghloul and Ahmed N. Ali, "Algorithm 916: Computing the Faddeyeva and Voigt Functions," ACM Trans. Math. Soft. 38 (2), 15 (2011).]. Given the Faddeeva function, we can then compute the other error functions, although we must switch to Taylor expansions and use other tricks in certain regions of the complex plane to avoid cancellation errors or other floating-point problems.

Acknowledgements

This file inspired Voigt Model Fit.

MATLAB release MATLAB 7.14 (R2012a)
Other requirements C++ compiler.
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (8)
16 May 2016 Janos

Janos (view profile)

This is a fantastic implementation. This code works about 2000x faster for me (when tested with large multidimensional arrays) than the built-in Matlab erfi function.

28 Apr 2016 Karan Gill

Alternatively, the Symbolic Math Toolbox provides the error and dawson functions for complex inputs.

Take the error function for example:

>> double(erf(sym(1+1i)))
ans =
1.3162 + 0.1905i

You could define an anonymous function to make it easier:

>> erfCmplx = @(x) double(erf(sym(x)))
erfCmplx =
@(x)double(erf(sym(x)))

>> erfCmplx(1+1i)
ans =
1.3162 + 0.1905i

The Symbolic Math Toolbox functions are:
erf: http://www.mathworks.com/help/symbolic/erf.html
erfc: http://www.mathworks.com/help/symbolic/erfc.html
erfcinv: http://www.mathworks.com/help/symbolic/erfcinv.html
erfi: http://www.mathworks.com/help/symbolic/erfi.html
erfinv: http://www.mathworks.com/help/symbolic/erfinv.html
dawson: http://www.mathworks.com/help/symbolic/dawson.html

Comment only
10 Feb 2016 Brian

Brian (view profile)

 
28 Feb 2014 Ian

Ian (view profile)

One update I would really like to see in this package is the derivative functions, at least for W(z). As pointed out in Zaghloul and Ali, the derivative functions of W(z) (equations 21-23) become numerically unstable near dV/dx = 0 (V=real(W(z)), at the peak of the Voigt function. This can cause problems when trying to compute analytical Jacobians for doing nonlinear fits of the Voigt function to optical spectra.

Since you are already using the Zaghloul and Ali algorithm in this region, it would be helpful to also use their method to output a function, say Faddeeva_dw(z) = dV/dx + i*dL/dx (L=imag(W(z)). The corresponding y derivatives can then be trivially computed.

Comment only
27 Feb 2014 Ian

Ian (view profile)

Works as advertised and is extremely fast.

12 Feb 2013 Niklas

Niklas (view profile)

 
15 Dec 2012 Steven G. Johnson

It won't work with lcc, since that is a C compiler, not a C++ compiler. The failure to compile with Visual C++ is a bug, which is fixed in the latest release on my web site (and which should appear on Matlab Central shortly).

Comment only
11 Dec 2012 alan

alan (view profile)

Hello, Love this program. I have it up and running on my mac to simulate voigt broadening. Im trying to add this functionality to a lab computer running win32 matlab 7.12.0 (R2011a), but I cannot successfully compile with mex.

With Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2011a\sys\lcc: lcc preprocessor error: .\Faddeeva.hh:30 .\Faddeeva_mex.cc:35 Faddeeva_w_mex.cc:3 Could not find include file complex

full verbose: http://pastebin.com/YyLYYe8C

With Microsoft Visual C++ 2010 Express in C:\Program Files\Microsoft Visual Studio 10.0: Faddeeva.cc Faddeeva.cc(184) : error C2124: divide or mod by zero Faddeeva.cc(822) : error C3861: 'copysign': identifier not found C:\PROGRA~1\MATLAB\R2011A\BIN\MEX.PL: Error: Compile of 'Faddeeva.cc' failed.

full verbose: http://pastebin.com/K4LPd9FN

The only instances of complex.h are in a pythonwx folder not related to matlab. I see that it was released for R2012a. Does the package need a specific C++ compiler?

Comment only
Updates
29 Oct 2012 1.1

Improve accuracy in Re[w(z)] taken by itself.

30 Oct 2012 1.3

note how to compute erfi using Faddeeva function

05 Nov 2012 1.4

Now includes separate plugins for all of the error functions.

17 Dec 2012 1.5

portability fixes, slight accuracy improvements

Contact us