Voigt profile fits in Mathematica seem terribly slow. For an example data set with 81 points a corresponding fitting procedures for Voigt fits is >1000 times slower than for Gaussian or Lorentzian profile. How can Voigt profile fits be speed up?
Here is what I do. First we define the Voigt and Gaussian profile. As Mathematica often complains about δ
and σ
being <0, I use Abs instead of constraining the model as this proved faster. In addition I use the compile command to make the function even faster.
voigtprofile = Compile[{{δ, _Real, 0}, {σ, _Real, 0}, {A, _Real,0}, {ν0,_Real, 0}, {ν, _Real, 0}}, A PDF[VoigtDistribution[Abs@δ, Abs@σ], ν - ν0]];
gaussian[σ_, A_, ν0_, ν_] := Return[A PDF[NormalDistribution[ν0, σ], ν]];
Then I create noisy example data sets with a bit of noise:
noisyDataV = {#,
voigtprofile[0.15, 0.1, 1, 0, #] + RandomReal[{-0.1, 0.1}]} & /@ Range[-2, 2, 0.05];
noisyDataG = {#, gaussian[0.1, 1, 0, #] + RandomReal[{-0.1, 0.1}]} & /@
Range[-2, 2, 0.05];
And we use NonlinearModelFit to fit the data with excellent start parameters:
tv = AbsoluteTiming[vfit = NonlinearModelFit[noisyDataV,
voigtprofile[δ, σ,
A, ν0, ν], {{δ, 0.15}, {σ, 0.1}, {A,
1}, {ν0, 0}}, ν];]
tg = AbsoluteTiming[gfit = NonlinearModelFit[noisyDataG,
gaussian[σ,
A, ν0, ν], {{σ, 0.1}, {A, 1}, {ν0,
0}}, ν];]
And if we compare the required time for fit:
tv[[1]]/tg[[1]]
I get values between 1000 and 6000, which is terrible. In addition, selecting a fit Method
e.g. NMinimize
or other does at best yield the same result.
As this minimal example is just a very simple example, times scale up to unbearable long times for more realistic scenarios with real data. I'm glad for any hint on how to speed this simple example up.