MatLens · Ecuaciones y modelos

Absorción de rayos X (XANES / EXAFS)

Análisis XANES y EXAFS de matlens/core/xas.py. Energías en eV, k en Å⁻¹, R en Å. Constante E - E_0 = K\,k^2 con K = \hbar^2/2m_e = 3.8099821 eV·Å² (valor de la constante KTOE, el mismo que usan IFEFFIT/Larch; con CODATA 2018, \hbar^2/2m_e = 3.80998 eV·Å²). Bordes tabulados para guess_edge (tolerancia ±60 eV): Bearden & Burr, Rev. Mod. Phys. 39 (1967) 125, doi:10.1103/RevModPhys.39.125.

Origen físico. El coeficiente de absorción \mu(E) salta en el borde cuando la energía del fotón alcanza la de ligadura de un nivel interno (K, L₃). La región XANES (hasta unos 50 eV sobre el borde) refleja los estados vacíos y la geometría local: la posición del borde crece con el estado de oxidación (más carga efectiva en el núcleo) y los pre-picos de los metales de transición son transiciones 1s→3d, débiles y sensibles a la valencia y la simetría. En la región EXAFS el fotoelectrón, de número de onda k = \sqrt{2m_e(E-E_0)}/\hbar, se retrodispersa en los vecinos e interfiere consigo mismo, y la oscilación relativa \chi(k) codifica distancias, números de coordinación y desorden.

μ(E) a partir de los canales

Código: matlens/core/xas.py::mu_from_channels

\mu_\text{trans}(E) = \ln\frac{\lvert I_0\rvert}{\lvert I_t\rvert}, \qquad \mu_\text{fluo}(E) = \frac{I_f}{I_0}

Supuestos: transmisión con muestra homogénea y espesor adecuado (sin efecto de huecos ni armónicos); fluorescencia de muestra diluida o delgada. En fluorescencia de muestras concentradas la autoabsorción atenúa las oscilaciones y la línea blanca; MatLens no la corrige. Los puntos no finitos o con energía repetida se eliminan y el eje se ordena (_clean).

E0 y normalización (Athena)

Código: matlens/core/xas.py::find_e0, matlens/core/xas.py::pre_edge

E_0 es el máximo de d\mu/dE (gradiente numérico, excluyendo el 2 % de cada extremo), refinado con una parábola por tres puntos si el vértice cae a menos de un paso.

\mathrm{pre}(E) = \frac{a + bE}{E^{n_v}} \;\;\text{(recta ajustada a } \mu E^{n_v}\text{ en } [E_0+\mathrm{pre}_1, E_0+\mathrm{pre}_2])
\Delta\mu_0 = \mathrm{post}(E_0) - \mathrm{pre}(E_0), \qquad \mu_\text{norm} = \frac{\mu - \mathrm{pre}}{\Delta\mu_0}
\mu_\text{flat} = \mu_\text{norm} - \left(\frac{\mathrm{post}-\mathrm{pre}}{\Delta\mu_0} - 1\right) \quad (E > E_0)

\mathrm{post} es un polinomio de orden n_\text{norm} en E-E_0 ajustado en [E_0+\mathrm{norm}_1, E_0+\mathrm{norm}_2]. Valores por defecto: \mathrm{pre}_1 = \max(-200, E_\text{min}-E_0), \mathrm{pre}_2 = -30 (como máximo -5), \mathrm{norm}_2 = final de los datos, \mathrm{norm}_1 = \min(150, \mathrm{norm}_2/3), n_\text{norm} = 2 si el intervalo supera 350 eV, 1 si supera 50 eV, si no 0; n_v = 0. Ajustes por mínimos cuadrados no ponderados. Altura de la línea blanca: máximo de \mu_\text{norm} en [E_0, E_0+30]; energía a media altura: primer cruce de \mu_\text{norm} = 0.5 desde E_0 - 30 (interpolación lineal).

Límites. El máximo de la derivada es una convención: con varios rasgos en el borde (pre-picos intensos, hombros) puede saltar de uno a otro y desplazar E_0 varios eV; para comparar valencias conviene fijar E_0 o usar la energía a media altura. El salto depende de los intervalos pre y post elegidos, y con él toda la normalización (alturas de línea blanca, LCF). Si el salto resulta nulo o no finito, error «Salto de borde nulo: revisa los rangos de normalización». No se propaga incertidumbre a E_0 ni al salto.

Referencia: Ravel & Newville, J. Synchrotron Rad. 12 (2005) 537, doi:10.1107/S0909049505012719.

Ejemplo resuelto: normalización

Borde sintético: arcotangente de salto 1.3 centrada en 7112.0 eV (semianchura 1.5 eV), pre-borde lineal con pendiente −2×10⁻⁵ /eV, ligera caída post-borde y ruido gaussiano σ = 0.002 (semilla fija), malla de 0.5 eV entre 6900 y 7700 eV. pre_edge(E, mu) con los valores por defecto:

MagnitudMatLens
E_0 (eV)7112.047
\Delta\mu_01.278
pre₁, pre₂ (eV)-200, -30
norm₁, norm₂ (eV)150, 587.5
n_\text{norm}2
energía a media altura (eV)7112.022
máximo en [E_0, E_0+30] (eV, altura)7142, 0.9843

El salto recuperado difiere ligeramente de 1.3 porque el polinomio post-borde extrapolado a E_0 absorbe la cola lenta de la arcotangente y la caída post-borde; el borde sintético no tiene línea blanca, así que el máximo en [E_0, E_0+30] cae al final de ese intervalo.

Pre-pico (Wilke et al.) y relación Fe³⁺/ΣFe

Código: matlens/core/xas.py::fit_pre_edge, matlens/core/xas.py::fe_redox_from_centroid

Línea base polinómica (orden 3 por defecto) ajustada a los puntos de la ventana de base fuera de la ventana del pico; el residuo se ajusta con n gaussianas de área A_i:

G_i(E) = \frac{A_i}{\sigma_i\sqrt{2\pi}}\exp\!\left[-\frac{(E-E_i)^2}{2\sigma_i^2}\right]

o pseudo-Voigt (1-\eta)G + \eta L con \eta = 0.5 y la misma FWHM (\gamma = \sigma\sqrt{2\ln 2}). Restricciones: A_i \ge 0, E_i dentro de la ventana, \sigma_i \in [0.3, 2.5] eV; inicio \sigma_i = 0.6 eV, centros equiespaciados (o en el máximo si n=1). Resultado:

\bar{E} = \frac{\sum_i A_i E_i}{\sum_i A_i}, \qquad I = \sum_i A_i
x_{\mathrm{Fe^{3+}}} = \frac{i_2(\bar{E}-E_2)}{i_2(\bar{E}-E_2) + i_3(E_3-\bar{E})}

con E_2 = 7112.1 eV, E_3 = 7113.5 eV e intensidades de los extremos i_2 = i_3 = 1 por defecto (interpolación lineal); el resultado se acota a [0,1]. Los errores estándar de centros y áreas son los de lmfit (1σ).

La ventana de base por defecto es [\text{lo}-8,\ \text{hi}+4] eV; si fuera de la ventana del pico quedan menos de n_\text{base}+2 puntos, error. Área inicial: integral de la parte positiva del residuo repartida entre los componentes. Se informa \chi^2_\text{red}. La fórmula de Fe³⁺/ΣFe viene de que el centroide de una mezcla es (x\,i_3E_3 + (1-x)\,i_2E_2)/(x\,i_3 + (1-x)\,i_2); supone que el pre-pico de la muestra es una mezcla de los dos extremos con la misma coordinación que la calibración. La coordinación (tetraédrica u octaédrica) cambia la intensidad y algo el centroide, y Wilke et al. muestran que el centroide solo no separa valencia y coordinación. La calibración de energía (Fe metálico a 7112.0 eV) debe ser la misma que la de los valores de referencia.

Referencia: Wilke, Farges, Petit, Brown & Martin, Am. Mineral. 86 (2001) 714.

Estado de oxidación desde la posición del borde

Código: matlens/core/xas.py::oxidation_state_from_edge

Regresión lineal ponderada V = a + bE sobre los patrones (E_j, V_j, \sigma_{E,j}) con pesos w_j = 1/(b_0\sigma_{E,j})^2, siendo b_0 la pendiente de un primer ajuste no ponderado (\sigma_E = 0.15 eV por defecto).

u^2(V) = \mathbf{x}^\top \mathbf{C}\,\mathbf{x} + (b\,\sigma_{E,s})^2 + \frac{\sum_j r_j^2}{m-2}\;\;(m>2), \qquad \mathbf{x} = (1, E_s)

con \mathbf{C} la covarianza de (a,b) y r_j los residuos de los m patrones. Incertidumbre 1σ (k=1).

La relación lineal energía–valencia (ley de Kunzl) es empírica y solo vale entre compuestos de ligandos y coordinación parecidos; los patrones deben medirse con la misma calibración de energía y la misma definición de energía de borde que la muestra. Se necesitan al menos dos patrones con energías distintas (errores «Se necesitan al menos dos patrones» y «Los patrones tienen la misma energía»).

Referencia: Capehart et al., Phys. Rev. B 52 (1995) 8; Wilke et al. (2001).

Ejemplo resuelto: valencia por posición del borde y por pre-pico

Patrones de Fe (energía de borde, valencia): (7112.0, 0), (7120.5, 2), (7124.1, 3) con \sigma_E = 0.15 eV; muestra a 7122.0 eV. oxidation_state_from_edge:

  • pendiente b = 0.2457 /eV, ordenada a = -1747.2
  • valencia = 2.436 ± 0.096 (k = 1; incluye la dispersión de los patrones respecto a la recta, que aquí domina porque el Fe metálico no sigue la misma relación lineal).

Pre-pico: un centroide de 7112.9 eV da fe_redox_from_centroid = 0.5714 (Fe³⁺/ΣFe, intensidades iguales de los extremos).

Combinación lineal (LCF)

Código: matlens/core/xas.py::lcf, matlens/core/xas.py::lcf_combinations

\min_{w_i \ge 0}\; \sum_E \Big[y(E) - \sum_i w_i\,r_i(E)\Big]^2 + \lambda^2\Big(\sum_i w_i - 1\Big)^2, \qquad \lambda = 10^3\sqrt{N}\,\mathrm{rms}(y)

resuelto por NNLS (la restricción \sum w_i = 1 es una ecuación adicional fuertemente ponderada; se desactiva con sum_to_one=False). Las referencias se interpolan linealmente sobre la malla de la muestra en el intervalo común.

R = \frac{\sum (y - \hat{y})^2}{\sum y^2}, \qquad u(w_i) = \sqrt{\left[(\mathbf{A}^\top\mathbf{A})^{-1}\right]_{ii}\,\chi^2/\nu}

(\nu = N - n_\text{ref}, solo para pesos activos, 1σ). Las fracciones son w_i/\sum w. lcf_combinations prueba todos los subconjuntos de hasta 3 referencias y los ordena por R.

Límites e incertidumbre. Las incertidumbres de los pesos salen de la covarianza lineal sin restricción, escalada por \chi^2/\nu; no tienen en cuenta la restricción de suma ni la correlación entre referencias parecidas, y no incluyen el error de no disponer de la referencia correcta (sesgo de modelo). Un factor R pequeño no prueba que las referencias sean las especies presentes. Los errores de calibración de energía entre muestra y referencias (unas décimas de eV) sesgan los pesos; MatLens no ajusta desplazamientos de energía en la LCF. Con menos de n_\text{ref}+2 puntos comunes, error.

Referencia: Ravel & Newville (2005).

Ejemplo resuelto: combinación lineal

Muestra sintética y = 0.3\,r_A + 0.7\,r_B + ruido σ = 0.003 con dos referencias normalizadas (bordes en 7120 y 7124 eV con líneas blancas distintas). lcf:

Referenciapeso w_iu(w_i) (1σ)fracción
A0.29960.000840.2996
B0.70040.000830.7004

\sum w = 1, factor R = 1.3e-05, \chi^2_\nu = 1e-05. lcf_combinations ordena:

Combinaciónfactor R
A + B1.3e-05
B0.00536
A0.0292

Fondo EXAFS (AUTOBK) y transformadas

Código: matlens/core/xas.py::autobk, matlens/core/xas.py::ftwindow, matlens/core/xas.py::xftf

\chi(k) = \frac{\mu(k) - \mu_0(k)}{\Delta\mu_0}, \qquad k = \sqrt{(E-E_0)/K}

\mu_0(k) es un B-spline cúbico con N = \max(4, 1 + \lfloor 2R_\text{bkg}\Delta k/\pi\rfloor) coeficientes y nudos uniformes, cuyos coeficientes minimizan (mínimos cuadrados, scipy.optimize.least_squares, inicio: ajuste spline directo a \mu) las partes real e imaginaria de \tilde\chi(R) para R < R_\text{bkg} más términos de anclaje ("clamps") en los 3 primeros y últimos puntos (R_\text{bkg} = 1 Å, k^w con w=2, dk = 0.1 por defecto; malla \Delta k = 0.05 Å⁻¹, N_\text{FFT} = 2048). Con xraylarch se puede usar su autobk.

Nota (código frente a la descripción anterior): en autobk el anclaje inferior está desactivado por defecto (clamp_lo = 0) y solo el superior está activo (clamp_hi = 1, sobre los nclamp = 3 últimos puntos), con escala \delta k\,\max(k_\text{max},1)^w/\sqrt\pi. Los nudos interiores están espaciados uniformemente en k entre k_\text{min} y k_\text{max} (por defecto k_\text{min} = 0 y k_\text{max} = final de los datos), y \chi(R) se evalúa para los índices R < R_\text{bkg} (int(1.01 + Rbkg/δR) puntos). R_\text{bkg} debe ser menor que la mitad de la distancia al primer vecino; si es mayor, el fondo absorbe parte de la primera capa.

Ventana de Hanning con rampas de anchura dk: \sin^2[\tfrac{\pi}{2}(k-k_1)/dk] de k_\text{min}-dk/2 a k_\text{min}+dk/2, 1 en la meseta y \cos^2 simétrica en k_\text{max}.

\tilde\chi(R_m) = \frac{\delta k}{\sqrt{\pi}}\sum_n \chi(k_n)\,k_n^{w}\,W(k_n)\,e^{-2ik_nR_m}, \qquad \delta R = \frac{\pi}{\delta k\,N_\text{FFT}}

El núcleo e^{-2ik_nR_m} = e^{-2\pi i nm/N} es el de la FFT directa (numpy.fft.fft), el mismo que usa xftf_fast de Larch, de modo que las partes real e imaginaria de \tilde\chi(R) coinciden con Larch/Athena. Algunas presentaciones escriben la integral con e^{+2ikR}; el módulo \lvert\tilde\chi(R)\rvert es el mismo en ambos convenios y solo cambia el signo de la parte imaginaria.

Referencia: Newville, Līviņš, Yacoby, Rehr & Stern, Phys. Rev. B 47 (1993) 14126, doi:10.1103/PhysRevB.47.14126.

Ajuste de capas (dispersión simple)

Código: matlens/core/xas.py::ScatteringPath.chi, matlens/core/xas.py::fit_shells, matlens/core/xas.py::read_feff_dat, matlens/core/xas.py::path_from_reference

\chi(k) = \sum_j \frac{S_0^2 N_j A_j(k')}{k' R_j^2}\, e^{-2\sigma_j^2 k'^2}\sin\!\left[2k'R_j + \phi_j(k')\right], \qquad k' = \sqrt{k^2 - \Delta E_0/K}
SímboloSignificadoUnidades
S_0^2factor de reducción de amplitud (fijo, 0.9 por defecto)—
N_jnúmero de coordinación (\ge 0)—
R_jdistancia (R_\text{eff} \pm 0.5)Å
\sigma_j^2factor de Debye–Waller ([-0.005, 0.05], inicio 0.005)Ų
\Delta E_0desplazamiento de energía, compartido por defecto ([-15, 15])eV
A_j, \phi_jamplitud y fase de retrodispersión— , rad

De FEFF: A = \lvert f\rvert \cdot \mathrm{red}\cdot e^{-2R_\text{eff}/\lambda}, \phi = 2\phi_c + \phi_f. De un compuesto de referencia (filtrado de Fourier con peso k^2): A = \lvert z\rvert\,R^2 e^{2\sigma^2k^2}/(k\,N S_0^2) y \phi = \arg z + \pi/2 - 2kR.

Objetivo (lmfit, no ponderado): partes real e imaginaria de la FT de (\chi_\text{datos}-\chi_\text{modelo}) en [R_\text{min}, R_\text{max}] (espacio R, por defecto k = 3–12 Å⁻¹, R = 1–3 Å, w = 2) o k^w(\chi_\text{datos}-\chi_\text{modelo}) en espacio k. Inicio: $N = $ degeneración del camino, R = R_\text{eff}.

R_\text{factor} = \frac{\sum \lvert\mathrm{res}\rvert^2}{\sum \lvert\mathrm{datos}\rvert^2}, \qquad N_\text{idp} = \frac{2\,\Delta k\,\Delta R}{\pi}

Incertidumbres: errores estándar de lmfit (1σ, escalados por \chi^2_\nu).

Validez: solo dispersión simple; A(k) y el término de recorrido libre se toman a la R de referencia (válido para \lvert\Delta R\rvert \lesssim 0.1 Å); sin cumulantes más allá de \sigma^2. Frente a Larch en lámina de Cu el N resulta ≈8 % menor (R concuerda en ~0.01 Å). Con xraylarch instalado y caminos FEFF se usa feffit (matlens/core/xas.py::fit_shells_larch).

Derivación de la ecuación EXAFS. En la aproximación de dispersión simple y onda plana, la onda saliente se retrodispersa en un átomo a distancia R con amplitud f(k) y vuelve con fase 2kR + \phi(k); la interferencia modula \mu en proporción a \sin(2kR+\phi)/(kR^2) (decaimiento esférico 1/R^2). La suma sobre N vecinos equivalentes con desorden gaussiano da el factor de Debye–Waller e^{-2\sigma^2k^2}; el recorrido libre medio finito del fotoelectrón da e^{-2R/\lambda(k)} (incluido en A) y las excitaciones multielectrónicas el factor S_0^2. S_0^2 y N están totalmente correlacionados, por eso S_0^2 se fija. El desorden no gaussiano (anarmonicidad, distribuciones asimétricas) requiere cumulantes de tercer y cuarto orden, que el ajuste integrado no incluye: sin ellos R sale corto y N bajo.

Restricciones y criterio. El número de parámetros variables no debe superar N_\text{idp} (criterio de Stern / Nyquist); MatLens informa N_\text{idp} pero no lo impone. Los parámetros se fijan con fix (nombres N{i}, R{i}, s2{i}, dE0 o dE0{i}). Los errores de lmfit no incluyen la incertidumbre de S_0^2, de las amplitudes y fases ni la del fondo.

Referencia: Stern, Sayers & Lytle, Phys. Rev. B 11 (1975) 4836, doi:10.1103/PhysRevB.11.4836.

Ejemplo resuelto: ajuste de una capa

Camino sintético de dispersión simple (R_\text{eff} = 2.00 Å, degeneración 6) con A(k) = 0.9\,e^{-0.01k^2} + 0.1 y \phi(k) = -0.6k + 1.2; datos generados con S_0^2 = 0.9, N = 6, R = 2.03 Å, \sigma^2 = 0.0060 Ų, \Delta E_0 = 1.5 eV y ruido σ = 0.002. fit_shells con los valores por defecto (espacio R, k = 3–12 Å⁻¹, R = 1–3 Å, k^2):

ParámetroAjuste (±1σ)Verdadero
N6.004 ± 0.0136
R (Å)2.0298 ± 0.000162.03
\sigma^2 (Ų)0.006032 ± 2.3e-050.0060
\Delta E_0 (eV)1.466 ± 0.0241.5

Factor R = 0.000176, N_\text{idp} = 11.46. Máximo de \lvert\tilde\chi(R)\rvert en 1.75 Å (sin corregir la fase, por eso menor que R).

Avisos de validez. El módulo no emite avisos warning/invalid; los errores de entrada se lanzan como excepciones con los textos citados arriba. El ajuste integrado lleva siempre la nota «Ajuste EXAFS integrado (dispersión simple): N ≈ −8 % frente a Larch en lámina de Cu; instale xraylarch (extra «xas») para usar feffit, la vía recomendada».

Generado desde MatLens c0ab138. ← Todas las técnicas