Skip to main content

Module mermin_fit

Module mermin_fit 

Source
Expand description

Fitting Mermin oscillators to an optical energy-loss function (the MELF-GOS fit).

§What is fitted

In the MELF-GOS method the optical ELF is represented by a weighted sum of Mermin-type energy-loss functions, whose parameters A_j, ħω_j, ħγ_j (intensity, position, width) are “determined by fitting the outer-shell ELF contribution to the available experimental optical spectrum” through the k = 0 form, in which the Mermin ELF is the Drude-Lorentz one:

ELF(E) = Σ_j A_j E ħγ_j / ([(ħω_j)² - E²]² + [E ħγ_j]²)

(P. de Vera et al., Int. J. Mol. Sci. 23, 6121 (2022), doi:10.3390/ijms23116121, PMC9181504, section 2.1.1, eqs. (3) and (5), read 2026-10-07; see super::mermin). The same paper says the consistency of the fit “is checked by fulfilling the Kramers-Kronig and f-sum rules”; this module reports the f-sum and P_eff of the fit next to those of the data (MerminFit). It does not say how the least-squares problem is solved, and the algorithm below is our own, built from textbook pieces that were not opened for this implementation:

  • the amplitudes enter linearly, so for fixed (ω_j, γ_j) they are the solution of a non-negative least-squares problem (Lawson-Hanson active-set algorithm, C. L. Lawson and R. J. Hanson, Solving Least Squares Problems, 1974, with each subproblem solved by Householder QR); amplitudes are therefore non-negative by construction;
  • the energies and widths are found by Levenberg-Marquardt iterations on (ln ω_j, ln γ_j) of the amplitude-eliminated residual (variable projection, G. H. Golub and V. Pereyra, 1973), with a central-difference Jacobian.

Every step is a fixed sequence of floating-point operations on the input table: the fit is deterministic and does not depend on the thread count.

§Limits

The fit is a local optimisation. The amplitudes of the start are ignored (they are solved for); the energies and widths of the start decide which local minimum is reached. The default start places the oscillators at the tallest local maxima of the tabulated ELF (completed by log-spaced energies), which is a heuristic; for real data the caller should inspect MerminFit::residuals and, if needed, supply a start. The threshold step Θ(E - E_th) of dV2022 eq. (3) is not fitted.

The whole tabulated ELF is fitted, inner-shell edges included, where dV2022 fits Mermin oscillators to the outer-shell ELF only (their eqs. (1) and (3); inner shells by GOS, eq. (2)) and checks the fit against the Kramers-Kronig and f-sum rules (after eq. (5)). The default of three oscillators is coarse for real data: for the committed Cu ELF it carries 57 % of the table’s f-sum and 67 % of its P_eff, and the Mermin IMFP is 18 to 34 % longer than the single-pole one on the table (#300; docs/validation.md, “Cu: the Mermin IMFP and the default oscillator fit”; the default is #306). The widths are bounded below by the local knot spacing (see fit_mermin_oscillators); without that bound, fits of the Cu ELF with 10 or 16 oscillators placed an oscillator far narrower than the knot spacing between two knots, which the residuals do not see and the sum rules do (#307). The floor does not stop the same fits from placing a very wide oscillator whose f-sum lies above the table (#311). Read MerminFit::f_sum_ev2 against MerminFit::data_f_sum_ev2 in any case.

§Closed-form sum rules of the fit

For the Drude-Lorentz sum the f-sum is (π/2) Σ A_j and P_eff = Σ A_j/(ħω_j)² (super::drude; the derivation there is ours, by residues, with a numerical cross-check), against the numerical sums of the data table over its tabulated range (super::sum_rules).

Structs§

MerminFit
The result of a fit: parameters, residuals and the sum rules. See the module docs.
MerminFitOptions
Settings of fit_mermin_oscillators.

Enums§

FitWeighting
How the residuals of the tabulated points are weighted in the fit.

Constants§

MAX_OSCILLATORS
Largest number of oscillators accepted.

Functions§

fit_mermin_oscillators
Fit a sum of Mermin oscillators to elf (see the module docs).