MatLens · Ecuaciones y modelos

UV-Vis y reflectancia difusa

Esta sección resume las ecuaciones que MatLens evalúa para obtener el gap óptico a partir de espectros UV-Vis(-NIR): conversión de unidades, señal de absorción (incluido Kubelka–Munk), gráfico de Tauc con selección objetiva de la región lineal, intersección con la línea base sub-gap y energía de Urbach.

Constantes, convenciones y flujo completo

ConstanteValorFuente
h6.62607015\times10^{-34} J·s (exacta)CODATA 2018
c299\,792\,458 m/s (exacta)CODATA 2018
e1.602176634\times10^{-19} C (exacta)CODATA 2018
hc/e1239.841984 eV·nm (HC_EV_NM, redondeo a 10 cifras de 1239.84198433\ldots)derivada de las tres anteriores

Orden de las operaciones en la receta uvvis.bandgap (matlens/recipes/ops.py::uvvis_bandgap):

  1. Eje x → energía (to_energy, unidad declarada o deducida por guess_x_unit).
  2. Señal S \propto \alpha (signal_to_alpha; Kubelka–Munk en DRS; \alpha en cm⁻¹ con absorption_coefficient si se da el espesor).
  3. En reflectancia o absorbancia DRS: máscara de señal válida (reflectance_mask, con r_floor dado en % y pasado como fracción) y rangos excluidos.
  4. En absorbancia o transmitancia: corte de saturación A \ge 3 (saturation_cut).
  5. Gráfico de Tauc y E_g (tauc_gap) para la transición declarada, o para directa e indirecta si no se declara.
  6. Validez combinada (máscara, ventana, R^2, rango, discrepancia con el sigmoide, transición no declarada).

Referencia de las constantes: E. Tiesinga, P. J. Mohr, D. B. Newell y B. N. Taylor, «CODATA recommended values of the fundamental physical constants: 2018», Rev. Mod. Phys. 93 (2021) 025010, doi:10.1103/RevModPhys.93.025010.

Conversión de longitud de onda a energía del fotón

Código: matlens/core/optics.py::to_energy, matlens/core/optics.py::wavelength_to_energy, matlens/core/optics.py::energy_to_wavelength.

E = h\nu = \frac{hc}{\lambda} = \frac{1239.841984\ \mathrm{eV\,nm}}{\lambda\,[\mathrm{nm}]}, \qquad E = \tilde{\nu}\,[\mathrm{cm^{-1}}] \times 1.239841984\times10^{-4}\ \mathrm{eV\,cm}
  • E: energía del fotón (eV).
  • \lambda: longitud de onda (nm); si el eje está en µm se usa \lambda\,[\mathrm{nm}] = 1000\,\lambda\,[\mu\mathrm{m}].
  • \tilde{\nu}: número de onda (cm⁻¹).
  • hc = 1239.841984 eV·nm (constante HC_EV_NM).

Si el usuario no indica la unidad, matlens/core/optics.py::guess_x_unit la deduce de la etiqueta del eje o, en su defecto, del valor máximo: eV si el máximo es menor que 15, nm si es como mucho 3300, y cm⁻¹ en otro caso.

Referencia: implementación propia.

Señal proporcional a la absorción y función de Kubelka–Munk

Código: matlens/core/optics.py::signal_to_alpha, matlens/core/optics.py::kubelka_munk.

Según el tipo de medida, la señal S \propto \alpha que entra en el análisis de Tauc es:

  • Absorbancia o coeficiente de absorción: S = A (o S = \alpha) sin cambios.
  • Transmitancia: S = -\log_{10} T, con T en fracción (se divide entre 100 si los datos están en %) y recortada a T \ge 10^{-6}.
  • Reflectancia difusa: S = F(R) (Kubelka–Munk).
  • Absorbancia de un accesorio DRS: primero R = 10^{-A} y después S = F(R).
F(R) = \frac{(1-R)^2}{2R}
  • R: reflectancia difusa como fracción (adimensional); se recorta al intervalo 10^{-6} \le R \le 1.
  • F(R): función de remisión de Kubelka–Munk (adimensional), proporcional a \alpha/s (coeficiente de absorción entre coeficiente de dispersión).

Los datos se interpretan como porcentaje si así se indica o, de forma automática, si su máximo es mayor que 1.5.

Selección automática de la señal (matlens/core/optics.py::pick_signal_column, guess_signal_kind): se descartan las columnas que son una segunda abscisa (nm junto a eV, o una copia estrictamente monótona de x o de 1/x con |r| > 0.99999) y las ya transformadas (p. ej. (F\,h\nu)^2); gana la columna nombrada como F(R)/\alpha, absorbancia, reflectancia o transmitancia, en ese orden, y una columna ya en F(R) no se vuelve a transformar. Sin nombre, una señal que crece hacia alta energía se toma como absorbancia; una que decrece, como reflectancia difusa (Kubelka–Munk), salvo que el nombre del archivo indique transmitancia.

Validez: F(R) \propto \alpha solo si el coeficiente de dispersión s no depende de la energía y la muestra es ópticamente gruesa.

Supuestos de Kubelka–Munk. La teoría de dos flujos de Kubelka y Munk (1931) describe una capa ópticamente gruesa (reflectancia R_\infty, sin contribución del fondo), dispersora difusa e iluminada de forma difusa, con absorción débil frente a la dispersión; Kortüm (1969) discute que la relación lineal F(R_\infty) \propto k solo se cumple para absorbentes débiles (en la práctica, muestras diluidas en un blanco no absorbente) y que en absorbentes fuertes la reflexión especular y el apartamiento de la difusión ideal la rompen. Makuła, Pacia y Macyk (2018) aplican F(R_\infty) a espectros DRS de fotocatalizadores en polvo para el gráfico de Tauc y recomiendan ajustar el borde fundamental con su línea base. Cuando R \to 0, F(R) \approx 1/(2R) diverge y amplifica el ruido: con R = 1\,\% \pm 0.3\,\%, F va de 38 a 71. Ahí F(R) no es fiable y un «borde» en esa zona es un artefacto del detector.

Ejemplo resuelto

Conversión con wavelength_to_energy (hc = 1239.841984 eV·nm):

λ (nm)E (eV)
2006.19921
387.53.19959
8001.5498

Función de remisión con kubelka_munk:

R (fracción)F(R)
0.80.025
0.30.81667
0.059.025
0.0149.005

Obsérvese la divergencia F \approx 1/(2R) cuando R \to 0.

Máscara de señal válida de reflectancia difusa (antes de Kubelka–Munk)

Código: matlens/core/optics.py::reflectance_mask, local_noise_sigma, reflectance_fraction; se aplica en matlens/recipes/ops.py::uvvis_bandgap a reflectancia y absorbancia DRS.

Ruido local. Para puntos ordenados por energía, los pseudo-residuos de segunda diferencia d_i = R_{i-1} - 2R_i + R_{i+1} tienen varianza 6\sigma^2 con ruido blanco y casi no contienen la señal suave (Gasser, Sroka y Jennen-Steinmetz, 1986, para puntos equiespaciados):

\sigma(E_j) = \frac{1.4826\ \mathrm{mediana}_{|E_i - E_j| \le 0.15\ \mathrm{eV}}\,|d_i|}{\sqrt{6}}, \qquad \sigma \leftarrow \max\!\left(\sigma,\ \sqrt{\overline{R_-^2}}\right)
  • La mediana de |d_i| (MAD respecto de cero) hace la estimación robusta frente a picos y a la curvatura del borde; la ventana de 0.3 eV es elección de MatLens.
  • R_-: lecturas negativas (al menos 5). Si la reflectancia real es ≈ 0, son la mitad inferior del ruido y su RMS estima \sigma cerca del cero.

Puntos excluidos (se informan como rangos de energía con su motivo):

  • R \le 0.
  • R < \max(3\sigma,\ R_\mathrm{piso}): no distinguible de cero (límite de detección 3.3\sigma de ICH Q2(R1), redondeado a 3\sigma). R_\mathrm{piso} (r_floor, en %) es un piso del detector declarado por el usuario; por defecto no hay.
  • \lambda < uv_cut_nm = 220 nm: extremo UV profundo, donde la energía de la lámpara de deuterio y la respuesta del equipo caen y domina la luz parásita (la relación de potencia parásita se mide según ASTM E387). El valor de 220 nm es elección de MatLens, no un valor de un manual; uv_cut_nm = 0 lo desactiva.
  • |\lambda - \lambda_\mathrm{lámpara}| \le 5 nm alrededor del cambio de lámpara declarado (lamp_change_nm; depende del equipo y debe tomarse de su manual). Sin declarar, no se excluye nada. Los 5 nm son elección de MatLens.

Región dominada por 1/R. Con la mediana móvil de R (±0.05 eV) sobre los puntos válidos, la primera energía por encima del máximo de reflectancia en que \tilde R < 10\sigma marca E_{1/R}; desde ahí hasta el final, la incertidumbre relativa de F,

\frac{\sigma_F}{F} = \frac{\sigma_R\,(1+R)}{R\,(1-R)} \approx \frac{\sigma_R}{R} > 10\ \%,

supera la de un valor cuantificable (límite de cuantificación 10\sigma de ICH Q2(R1)). Esa región se excluye de la búsqueda automática.

Plausibilidad del borde (tauc_gap(..., excluded=, suggested=)). Una ventana automática es no válida (no un aviso) si:

  • toca una región excluida (se solapa con ella o no queda ningún punto válido entre ambas);
  • empieza en el primer punto medido, o llega al último cuando el borde está a menos de 0.5 eV del final (el mismo margen de persistencia que exige la búsqueda del borde): el borde no está resuelto.

El resultado dice por qué y sugiere un rango: [E_s - 0.5,\ E_s + 0.3] eV recortado a los datos válidos, con E_s la energía de máxima caída de R suavizada (\min dR/dE) entre los puntos con R \ge 10\sigma. En un polvo, R cae sobre todo en el borde fundamental, mientras que en la zona 1/R apenas varía en valor absoluto.

Rango del usuario. e_min/e_max restringen el análisis; si se dan, se registran como parámetros declarados del método (Rango declarado (eV)) junto con los rangos excluidos (Rangos excluidos (eV)) y el ruido mediano (σ R (ruido)).

Con datos sin ruido apreciable que no se acercan a R = 0 ni al UV profundo, la máscara no excluye nada y el resultado es idéntico al de antes (tests/test_optics.py::test_drs_clean_spectrum_is_unchanged).

Limitaciones: el estimador supone ruido aproximadamente blanco. Si el software del equipo ya suavizó los datos, \sigma se subestima y conviene declarar r_floor. El criterio no corrige la reflexión especular ni el apartamiento de Kubelka–Munk en absorbentes fuertes; solo evita usar la zona donde F(R) no se puede medir.

Referencias:

  • P. Kubelka y F. Munk, «Ein Beitrag zur Optik der Farbanstriche», Z. Tech. Phys. 12 (1931) 593.
  • G. Kortüm, Reflectance Spectroscopy: Principles, Methods, Applications (Springer, 1969), doi:10.1007/978-3-642-88071-1.
  • P. Makuła, M. Pacia y W. Macyk, J. Phys. Chem. Lett. 9 (2018) 6814–6817, doi:10.1021/acs.jpclett.8b02892.
  • T. Gasser, L. Sroka y C. Jennen-Steinmetz, Biometrika 73 (1986) 625–633, doi:10.1093/biomet/73.3.625.
  • ICH Q2(R1), Validation of Analytical Procedures: Text and Methodology (2005).
  • ASTM E387, Standard Test Method for Estimating Stray Radiant Power Ratio of Dispersive Spectrophotometers by the Opaque Filter Method.

Umbrales (220 nm, 5 nm, 0.3 eV, ±0.05 eV, rango sugerido): elección de MatLens.

Ejemplo resuelto

Caso sintético: R(E) = 0.60/(1 + e^{(E-3.0)/0.06}) + 0.0005 con ruido \sigma_R = 0.002, 801 puntos entre 1.5 y 5.5 eV (225–827 nm). Resultado de reflectance_mask(E, R):

  • σ mediano estimado: 0.00196 (verdadero 0.002).
  • Inicio de la zona dominada por 1/R: 3.205 eV.
  • Puntos utilizables: 358 de 801.
  • Rango sugerido: 2.5–3.2 eV.
Rango excluido (eV)Motivo
3.205–5.5R < 10σ: F(R) dominada por 1/R

Gráfico de Tauc y exponente de transición n

Código: matlens/core/optics.py::tauc_transform, matlens/core/optics.py::tauc_gap.

(\alpha h\nu)^{1/n} = B\,(h\nu - E_g) \quad\Longrightarrow\quad T(E) = \max(S\,E,\ 0)^{1/n}
  • T(E): ordenada del gráfico de Tauc, en unidades de (S\cdot\mathrm{eV})^{1/n}. Los productos S\,E negativos se recortan a cero.
  • S: señal proporcional a \alpha (apartado anterior).
  • E = h\nu: energía del fotón (eV).
  • B: constante del borde (unidades arbitrarias).
  • E_g: gap óptico (eV).
  • n: exponente de la transición. MatLens usa el convenio (\alpha h\nu)^{1/n}:
    • n = 1/2: directa permitida (valor por defecto).
    • n = 2: indirecta permitida.
    • n = 3/2: directa prohibida.
    • n = 3: indirecta prohibida.

Origen de la ecuación. Cerca de un extremo de banda parabólico, la absorción interbanda es proporcional a la densidad conjunta de estados por el elemento de matriz de la transición. Para una transición directa permitida con elemento de matriz constante, \alpha(h\nu) \propto (h\nu - E_g)^{1/2}/h\nu; para una indirecta permitida (asistida por fonones), \alpha \propto (h\nu - E_g \pm E_p)^2/h\nu, donde E_p es la energía del fonón. Elevando \alpha h\nu a 1/n se obtiene una recta en h\nu cuyo corte es E_g. Tauc, Grigorovici y Vancu (1966) introdujeron la forma (\alpha h\nu)^{1/2} para el germanio amorfo; la generalización a cuatro exponentes es la de los textos de física de semiconductores (p. ej. Pankove, Optical Processes in Semiconductors, 1971, cap. 3).

Cuándo falla. La linealización supone bandas parabólicas, una única transición dominante y ninguna otra absorción en la misma zona. Deja de valer, o sesga E_g:

  • con absorción excitónica (un pico en el borde en lugar de una raíz cuadrada);
  • con dopado degenerado (desplazamiento de Burstein–Moss: se mide el borde óptico, no el gap fundamental);
  • con colas de Urbach o de defectos fuertes, que curvan el tramo bajo del gráfico;
  • con mezclas de fases o transiciones superiores cercanas (varios bordes);
  • en la transición indirecta, porque MatLens no separa E_p: el corte es E_g \mp E_p (una sola recta, sin las dos ramas de absorción y emisión de fonones);
  • cuando S no es proporcional a \alpha (película delgada con interferencias, DRS fuera de los supuestos de Kubelka–Munk, saturación).

matlens/core/optics.py::detect_transitions repite el análisis para varios valores de n (por defecto 1/2 y 2) y devuelve un resultado por cada uno, para compararlos.

Algoritmo de tauc_gap, paso a paso (en el orden del código):

  1. Ordenar por energía y quitar valores no finitos (_sorted_clean).
  2. Quitar los puntos de los rangos excluidos por la máscara (excluded).
  3. Recortar a e_min/e_max; exigir al menos 12 puntos.
  4. Suavizado opcional de S (Savitzky–Golay de orden 2, ventana smooth forzada a impar).
  5. Con baseline="subtract": elegir una primera ventana, ajustar la recta sub-gap en el espacio de la señal y restarla.
  6. Calcular T(E) y elegir la ventana (_fit_choice → _edge_windows), con N_\mathrm{min} = \max(6, \lfloor 0.01N\rfloor) puntos.
  7. Con "intersect"/"makula": recta sub-gap en el espacio de Tauc (_find_baseline).
  8. E_g, u_\mathrm{fit}, u_\mathrm{win} y estimación sigmoide independiente.
  9. Avisos, bloqueos de plausibilidad y validez (_tauc_validity).

No hay criterio de convergencia iterativo: todas las rectas son mínimos cuadrados ordinarios en forma cerrada (_linfit); el único ajuste iterativo es el sigmoide (curve_fit, hasta 20 000 evaluaciones, \delta E \in [10^{-3}, 2] eV, E_0 dentro de la ventana ±0.5 eV).

Preprocesado. Los datos se ordenan por energía, se descartan los valores no finitos y se recortan opcionalmente a [E_\mathrm{min}, E_\mathrm{max}]. Se exigen al menos 12 puntos. Si smooth es 3 o más, se aplica a S un filtro de Savitzky–Golay de orden 2 con ventana impar.

Selección de la región lineal (_edge_windows, _fit_choice). Sustituye a la regla anterior («la ventana más ancha entre las más pendientes con R^2 \ge 0.99»), que en los datos de desarrollo y en tres rondas de validación ciega elegía la parte alta y más empinada del gráfico de Tauc (por ejemplo, una transición más fuerte por encima del gap) y sobrestimaba E_g. Ahora se procede en tres pasos:

  1. Posición del borde. Se suavizan S y T con un filtro de Savitzky–Golay de orden 2 y ventana de unos 0.1 eV (al menos 7 puntos) y se derivan respecto a E. Son candidatos a borde los máximos locales de dS/dE (el punto de inflexión del borde de absorción, que es el centro E_0 del sigmoide de Zanatta y no depende de n) que cumplen:

    • la señal suavizada supera el 2 % de su rango, de modo que el ruido cerca de cero no cuenta;
    • el máximo es al menos el 20 % del mayor y tiene una prominencia de al menos el 10 %;
    • hay al menos 0.15 eV de datos por debajo (no son los primeros puntos del barrido);
    • la absorción persiste: S se mantiene \ge 0.9\,S(E_k) en los 0.5 eV siguientes. Una banda de defectos o impurezas sube y vuelve a bajar y no es un borde; la cola de Urbach no tiene máximo de dS/dE.

    El gap fundamental es el borde de menor energía que tenga una región lineal aceptable (paso 3). Si hay otros bordes por encima, se informan con un aviso (pueden ser una transición superior o, al revés, el primero puede ser de un dopante o una fase secundaria: el usuario puede fijar E_\mathrm{min}). Si ningún candidato tiene región lineal, se usa el de mayor pendiente y el resultado queda en aviso por R^2.

  2. Linealidad local. La pendiente de referencia D_0 es el máximo de dT/dE en los 0.1 eV por encima del borde. Para cada fracción f \in \{0.5, 0.6, 0.7, 0.8, 0.9\} la ventana es el tramo contiguo alrededor de ese punto en que |dT/dE - D_0| \le (1-f)\,D_0: la pendiente local apenas cambia. Por debajo la cola de Urbach (pendiente creciente) y por encima la saturación (pendiente decreciente) quedan fuera. Si el tramo tiene menos de \max(6,\ \lfloor 0.01\,N \rfloor) puntos o menos de min_width = 0.15 eV, se ensancha simétricamente.

  3. Prueba de residuos. Cada ventana se ajusta por mínimos cuadrados ordinarios, T = mE + b, y es aceptable si m > 0, R^2 \ge 0.99 (r2_min) y la subida m\,(E_\mathrm{fin} - E_\mathrm{ini}) es al menos min_rise = 0.10 del rango de T hasta 0.5 eV por encima del borde. Se usa la ventana de f = 0.7 si es aceptable o, si no, la aceptable de f más cercano.

El resultado guarda en criteria la regla (window_rule), el motivo (reason: edge_local_linear o edge_best_r2_not_linear), la energía del borde (edge_eV), la fracción usada, las fracciones aceptables y los otros bordes (other_edges_eV). Si el usuario fija una ventana, se ajusta solo esa: debe tener al menos 3 puntos y pendiente positiva.

Justificación: Makuła, Pacia y Macyk (J. Phys. Chem. Lett. 9 (2018) 6814) piden extrapolar la región lineal del borde de absorción fundamental, por encima del inicio, y cortar con la línea base; Escobedo-Morales et al. (Heliyon 5 (2019) e01505) automatizan la elección con segmentos lineales por R^2 \ge 0.990, exigiendo que el segmento de Tauc sea más pendiente que sus vecinos y admitiendo varios bordes en muestras mixtas; Viezbicke et al. (Phys. Status Solidi B 252 (2015) 1700) muestran, reajustando gráficos de Tauc publicados de ZnO, la dispersión que introduce la elección del tramo. Los umbrales concretos (0.1 eV de suavizado, 2 %, 20 %, 10 %, 0.5 eV, f) son elección de MatLens, comprobada con espectros sintéticos (tests/test_optics.py).

Gap: corte con el eje y con la línea base sub-gap

Código: matlens/core/optics.py::tauc_gap, matlens/core/optics.py::_find_baseline.

Sin línea base (baseline="none"), el gap es el corte de la recta con el eje de energía:

E_g = -\frac{b}{m}

Con intersección con la línea base (baseline="intersect"; "makula" se trata igual), se ajusta una segunda recta T = m_b E + b_b en la región sub-gap y se calcula el punto donde se cruzan las dos rectas:

E_g = \frac{b_b - b}{m - m_b}

La región sub-gap la forman los puntos con E \le E_\mathrm{lim} - 0.1 eV, donde E_\mathrm{lim} es el menor valor entre el inicio de la ventana del borde y el corte -b/m (este último solo cuenta si deja al menos 0.15 eV de datos por debajo). Hacen falta al menos 6 puntos que abarquen al menos 0.15 eV; si no los hay, se usa el corte con el eje y se emite un aviso.

Con sustracción (baseline="subtract"), primero se elige una ventana del borde en el espacio de Tauc. Después se ajusta una recta S_b(E) = m_s E + b_s en la región sub-gap, pero en el espacio de la señal, y se resta (S' = S - S_b). Por último se repite la selección de ventana sobre T' = \max(S' E,\ 0)^{1/n} y se toma el corte con el eje.

matlens/core/optics.py::manual_gap acepta una ventana o una recta (m, b) trazada por el usuario. En el caso de la recta, E_g = -b/m y la incertidumbre se informa como 0.

La opción "makula" es el mismo cálculo que "intersect" con el nombre de su fuente: Makuła, Pacia y Macyk (J. Phys. Chem. Lett. 9 (2018) 6814) recomiendan tomar E_g en la intersección de la recta de Tauc con el ajuste lineal de la pendiente por debajo de la absorción fundamental. La sustracción en la señal ("subtract") es un tratamiento distinto y no es el método de Makuła.

Incertidumbre (k = 1). El error de ajuste se obtiene del error de predicción de la recta en el punto E_g, dividido por la pendiente:

u_\mathrm{fit}(E_g) = \frac{s}{m}\sqrt{\frac{1}{N_w} + \frac{(E_g - \bar{E})^2}{S_{xx}}}, \qquad s = \sqrt{\frac{\sum_i r_i^2}{N_w - 2}}
  • N_w: número de puntos de la ventana.
  • \bar{E}: energía media de la ventana (eV).
  • S_{xx} = \sum_i (E_i - \bar{E})^2 (eV²).
  • r_i: residuos del ajuste.

El error por la elección de ventana, u_\mathrm{win}, es la desviación típica de los E_g de todas las ventanas aceptables (fracciones f). La incertidumbre total añade la discrepancia entre métodos (apartado «Incertidumbre» más abajo).

Con una ventana fijada por el usuario, u_\mathrm{win} = 0. La incertidumbre de la recta base no se propaga.

Validez (_tauc_validity):

  • El resultado no es válido si E_g \le 0, si no es finito o si queda fuera del rango medido.
  • Tampoco si la ventana automática toca una región excluida por la máscara o el límite de los datos (apartado «Máscara de señal válida»).
  • Se emite un aviso si R^2 < 0.99, si E_g > E_\mathrm{max} - 0.2 eV (gap cerca del borde del detector) o si Tauc y el ajuste sigmoide discrepan más de 0.10 eV.
  • En la operación de receta, también si el tipo de transición no está declarado.
  • Se supone una única transición dominante y un borde sin colas fuertes de Urbach ni de defectos.

Referencias: Makuła, Pacia & Macyk, J. Phys. Chem. Lett. 9 (2018) 6814; Escobedo-Morales et al., Heliyon 5 (2019) e01505; Viezbicke, Patel, Davis & Birnie, Phys. Status Solidi B 252 (2015) 1700. Umbrales: elección de MatLens.

Ejemplo resuelto

Caso sintético: S(E) = 3\sqrt{E - 3.20}/E + 0.04 para E > 3.20 eV (0.04 por debajo), 501 puntos entre 2.0 y 4.5 eV, ruido gaussiano \sigma = 0.003 (semilla fija). Gap verdadero: 3.20 eV, transición directa (n = 1/2). Resultado de tauc_gap(E, S, n=0.5, baseline="intersect"):

MagnitudValor
Borde localizado (edge_eV)3.24 eV
Ventana de ajuste3.21–3.56 eV
Pendiente m10.12
Ordenada b-32.25
R^20.99919
Recta base (Tauc) m_b, b_b0.008676, -0.0113
E_g (intersección)3.187 eV
E_g (corte con el eje, baseline="none")3.186 eV
u_\mathrm{fit}0.000762 eV
u_\mathrm{win}0.00385 eV
E_g^\mathrm{sig} (Zanatta)sin estimación
u_\mathrm{met}0 eV
u(E_g), k = 10.00392 eV
Validezok

Diferencia con el gap verdadero: -0.0127 eV, es decir -3.23 veces u(E_g). El borde es una ley de potencias sin meseta, así que el ajuste sigmoide no se acepta y u_\mathrm{met} = 0. La incertidumbre declarada no cubre el sesgo del modelo (aquí, el fondo plano y la ventana finita), solo el ruido y la elección de ventana.

Estimación independiente: ajuste sigmoide del borde (Zanatta)

Código: matlens/core/optics.py::sigmoid_edge.

S(E) = S_\mathrm{max} + \frac{S_\mathrm{min} - S_\mathrm{max}}{1 + \exp\!\left(\dfrac{E - E_0}{\delta E}\right)}, \qquad E_g^\mathrm{sig} = E_0 - k\,\delta E
  • E_0: energía a mitad del borde (eV); \delta E: anchura del borde (eV).
  • k = 0.3 para gap directo y k = 4.3 para indirecto (Zanatta, Sci. Rep. 9 (2019) 11225, Ec. 9). Para n = 3/2 y n = 3 no hay factor publicado y no se calcula.

El ajuste es no lineal (scipy.optimize.curve_fit) sobre E_0 \pm 0.25 eV, empezando en el borde elegido para Tauc y recentrado una vez en el E_0 ajustado (Zanatta usa un intervalo de unos 500 meV centrado entre el mínimo y el máximo de \alpha). Solo se acepta si el borde tiene forma sigmoide en la ventana: E_0 dentro de ella, 2\,\delta E < 0.25 eV, meseta superior S_\mathrm{max} \le 1.2\,\max S y R^2 \ge 0.99. Una ley de potencias sin meseta (p. ej. un borde indirecto ideal) no da estimación.

Si |E_g - E_g^\mathrm{sig}| > 0.10 eV (el doble de la tolerancia de la tarjeta), el resultado pasa a aviso y se emite un mensaje.

Incertidumbre

u(E_g) = \sqrt{u_\mathrm{fit}^2 + u_\mathrm{win}^2 + u_\mathrm{met}^2}, \qquad u_\mathrm{met} = \tfrac{1}{2}\,\lvert E_g - E_g^\mathrm{sig} \rvert
  • u_\mathrm{fit}: error de predicción de la recta en E_g (fórmula anterior).
  • u_\mathrm{win}: desviación típica de los E_g de todas las ventanas aceptables (las distintas fracciones f).
  • u_\mathrm{met}: la mitad de la discrepancia entre Tauc y el sigmoide (convenio de MatLens); es 0 si no hay estimación independiente o la ventana la fija el usuario.

Detalles del código: u_\mathrm{win} es la desviación típica poblacional (np.std, sin corrección N-1) de los E_g de las ventanas aceptables, y vale 0 si solo hay una; u_\mathrm{met} solo se suma si E_g^\mathrm{sig} cae a menos de 1 eV del rango medido. La combinación es en cuadratura y se da con k = 1; para un intervalo de aproximadamente el 95 % multiplíquese por 2 (k = 2), lo que supone normalidad. La propagación es analítica, no Monte Carlo.

Lo que la incertidumbre no incluye: la elección del exponente n, el error de la recta base sub-gap, la validez de Kubelka–Munk, la calibración del eje de longitud de onda del equipo y, en general, el sesgo del modelo (colas, excitones, varias fases).

En los espectros sintéticos de las pruebas, |E_g - E_g^\mathrm{verdadero}| \le 2u solo se cumple en torno a la mitad de los casos con sesgo (línea base, defectos, transiciones superiores): la incertidumbre no cubre los sesgos del modelo.

Entrada: saturación, transmitancia y espesor

Código: matlens/core/optics.py::saturation_cut, absorbance_like, absorption_coefficient; matlens/recipes/ops.py::uvvis_bandgap.

  • Saturación. Para absorbancia, absorbancia DRS o transmitancia se calcula la absorbancia decimal (A, o -\log_{10} T). Desde la primera energía con A \ge 3 (T \le 0.1 %, A_SATURATION) los datos están limitados por la luz parásita y se excluyen (E_\mathrm{max} efectiva), con un aviso.
  • Transmitancia mal declarada. Si la señal se declara absorbancia pero decrece con la energía y supera 1.5, se avisa de que parece transmitancia o reflectancia en %.
  • Espesor. Con thickness_nm = d > 0 y absorbancia o transmitancia, \alpha = \ln(10)\,A/d (cm⁻¹), sin corregir reflexiones. E_g no cambia por el factor de escala; solo las unidades.

Tipo de transición

El R^2 no decide entre directa e indirecta: ambas linealizan a menudo con R^2 > 0.99. El tipo debe declararse (transition) o deducirse del material (material, tabla KNOWN_TRANSITIONS con casos sin ambigüedad tomados de Sze & Ng, Physics of Semiconductor Devices, 3.ª ed., 2007, apéndice G; p. ej. TiO₂ anatasa no figura porque se discute).

Con transition = "auto" y sin material conocido se calculan las dos; Eg (eV) es la directa (n = 1/2, el valor por defecto de tauc_gap), se añaden Eg directa (eV) y Eg indirecta (eV) con sus σ, Transición declarada = no y la validez pasa a aviso («tipo de transición no declarado»). Las claves anteriores (Eg (eV), σ Eg (eV), R² Tauc, n Tauc, Transición) se mantienen; son nuevas Transición declarada, Ventana (eV), Eg sigmoide (eV), Validez y las dos anteriores. Antes, en auto se conservaba la transición de mayor R^2.

Energía de Urbach

Código: matlens/core/optics.py::urbach_energy.

\alpha(E) = \alpha_0 \exp\!\left(\frac{E - E_0}{E_U}\right) \quad\Longrightarrow\quad \ln S = \frac{1}{E_U}\,E + c, \qquad E_U = \frac{1}{m_U}
  • E_U: energía de Urbach (eV).
  • m_U: pendiente de \ln S frente a E (eV⁻¹).
  • c: ordenada en el origen (adimensional).

Solo se usan puntos con S > 0. Si no se da una ventana, se toman los puntos con 0.02\,S_\mathrm{ref} \le S \le 0.5\,S_\mathrm{ref} (y E < E_g si se conoce E_g), y de ellos el tramo contiguo más largo. Aquí S_\mathrm{ref} es S(E_g) interpolado o, si no se conoce E_g, \max S. El ajuste es lineal por mínimos cuadrados ordinarios, con al menos 4 puntos, y la pendiente debe ser positiva.

Incertidumbre (k = 1): u(E_U) = u(m_U)/m_U^2.

Referencia: implementación propia.

Ejemplo resuelto

Caso sintético: S = 0.8\,e^{(E-3.2)/0.060} (energía de Urbach verdadera 60 meV) con 1 % de ruido multiplicativo, 141 puntos entre 2.5 y 3.2 eV. urbach_energy(E, S) sin E_g (referencia \max S):

MagnitudValor
Ventana (2–50 % de S_\mathrm{ref})2.97–3.155 eV
Pendiente m_U16.67 eV⁻¹
E_U59.98 meV
u(E_U), k = 10.109 meV
R^20.99988

Origen y límites de Urbach. La regla empírica de Urbach (1953) describe la cola exponencial de absorción por debajo del gap, asociada al desorden estructural y térmico. Solo tiene sentido por debajo de E_g y por encima del fondo de dispersión o de defectos profundos: si la ventana automática (2–50 % de S_\mathrm{ref}) entra en el borde de Tauc o en el fondo, E_U resulta sesgado. u(E_U) procede solo de la pendiente del ajuste (k = 1) y no incluye la elección de la ventana. La función no emite avisos de validez; los errores (menos de 8 puntos con S>0, menos de 4 en la ventana, pendiente no positiva) detienen el cálculo.

Referencias adicionales (sin DOI comprobado en esta revisión): J. Tauc, R. Grigorovici y A. Vancu, Phys. Status Solidi 15 (1966) 627; F. Urbach, Phys. Rev. 92 (1953) 1324; J. I. Pankove, Optical Processes in Semiconductors (Prentice-Hall, 1971).

Nota (código frente a documentación): el docstring del módulo matlens/core/optics.py todavía describe la regla anterior de selección de ventana («las más pendientes y, de ellas, la más ancha»). Lo que se ejecuta es la regla del borde de menor energía con linealidad local descrita arriba (window_rule = max dT/dE, run with dT/dE >= f*max, R2 >= r2_min).

Generado desde MatLens c0ab138. ← Todas las técnicas