Esta sección resume las ecuaciones de análisis térmico (TGA, DSC y cinética) que MatLens evalúa en matlens/core/thermal.py. Las temperaturas de los datos están en °C salvo que el nombre indique K, las velocidades de calentamiento \beta en K/min y las masas en la unidad de los datos (% o mg). Constante de los gases: R = 8.314462618 J mol⁻¹ K⁻¹.
Grado de conversión a partir de la pérdida de masa
matlens/core/thermal.py::alpha_from_mass
| Símbolo | Unidades | Definición |
|---|---|---|
| \alpha | — | grado de conversión |
| m(T) | % o mg | masa suavizada (Savitzky–Golay, orden 3, ventana de unos N/50 puntos, mínimo 5) |
| m_0, m_f | % o mg | masa suavizada en el primer y el último punto del intervalo elegido [T_{lo}, T_{hi}] |
Se recorta \alpha a [0, 1] y se fuerza monótono no decreciente (máximo acumulado). Requiere al menos 10 puntos y pérdida no nula.
Referencia: implementación propia.
Grado de conversión a partir de un pico DSC
matlens/core/thermal.py::alpha_from_dsc
con integración trapezoidal en temperatura. B es una línea base lineal entre las medias de los primeros y últimos \max(3, N/25) puntos, o sigmoidal (la base se reparte proporcionalmente al área parcial acumulada, 20 iteraciones). \alpha se recorta a [0,1] y se hace monótono.
Referencia: implementación propia.
Velocidad de reacción
matlens/core/thermal.py::_rate
en s⁻¹, con d\alpha/dT por diferencias finitas sobre \alpha suavizado (Savitzky–Golay, ventana 11, orden 3) y T en K.
Kissinger
matlens/core/thermal.py::kissinger_from_peaks, matlens/core/thermal.py::kissinger, matlens/core/thermal.py::peak_temperature
| Símbolo | Unidades | Definición |
|---|---|---|
| \beta | K/min | velocidad de calentamiento |
| T_p | K | temperatura del máximo de d\alpha/dt |
| E_a | kJ/mol | energía de activación |
| A | s⁻¹ | factor preexponencial |
T_p se obtiene del máximo de d\alpha/dt con refinamiento parabólico de tres puntos. Recta por mínimos cuadrados ordinarios (sin pesos) de \ln(\beta/T_p^2) frente a 1/T_p con al menos 3 velocidades. Con pendiente s y ordenada b:
(el término -\ln 60 convierte A de min⁻¹ a s⁻¹ porque \beta está en K/min). Incertidumbre: u(E_a) = u(s)\,R, error típico de la regresión (k = 1); no se informa incertidumbre de \ln A.
Validez: supone que la posición del pico refleja una reacción de un solo paso; \ln A corresponde a un modelo de primer orden.
Referencia: H. E. Kissinger, Anal. Chem. 29 (1957) 1702.
Métodos isoconversionales: procedimiento común
matlens/core/thermal.py::isoconversional
Requiere al menos 3 curvas \alpha(T) a distintas \beta. Rejilla por defecto: \alpha = 0.05, 0.10, …, 0.95. Para cada \alpha se interpola linealmente T_{\alpha,i} (K) en cada curva (solo si \alpha está dentro de su intervalo) y se ajusta una recta por mínimos cuadrados ordinarios frente a 1/T_{\alpha,i} con al menos 3 puntos válidos. Incertidumbre de E_a(\alpha): error típico de la pendiente de la regresión (k = 1). Se informa también R^2, la media de E_a y la dispersión relativa (E_{\max} - E_{\min})/|\bar E|; si supera 0.25 se avisa de que los datos no corresponden a un paso único (matlens/core/thermal.py::step_warnings).
Referencia general: S. Vyazovkin et al., Thermochim. Acta 520 (2011) 1.
Ozawa–Flynn–Wall (OFW)
con \beta en K/min y logaritmo natural (aproximación de Doyle).
Referencias: T. Ozawa, Bull. Chem. Soc. Jpn. 38 (1965) 1881; J. H. Flynn y L. A. Wall, J. Res. NBS 70A (1966) 487.
Kissinger–Akahira–Sunose (KAS)
Es la forma KAS original (exponente 2, coeficiente 1).
Referencia: T. Akahira, T. Sunose, Res. Report Chiba Inst. Technol. (Sci. Technol.) 16 (1971) 22.
Starink
Aproximación integral más exacta que KAS y OFW para E_a/RT habituales (método "starink").
Referencia: M. J. Starink, Thermochim. Acta 404 (2003) 163.
Friedman
con d\alpha/dt en s⁻¹ interpolada linealmente a cada \alpha; los valores d\alpha/dt \le 0 se descartan.
Referencia: H. L. Friedman, J. Polym. Sci. C 6 (1964) 183.
Vyazovkin (método integral avanzado)
matlens/core/thermal.py::_isoconversional_vyazovkin, matlens/core/thermal.py::_vyazovkin_ea, matlens/core/thermal.py::_seg_integral
Para cada \alpha se usa solo el segmento [\alpha - \Delta\alpha, \alpha], donde \Delta\alpha es la mediana del paso de la rejilla (el primer segmento empieza en \max(\alpha_1 - \Delta\alpha, 0)). Con calentamiento lineal:
E_a es el valor que minimiza \Phi (en el código se minimiza \Phi(E) = \sum_i\sum_j J_i/J_j - n, equivalente). La integral se evalúa con cuadratura de Gauss–Legendre de 16 nodos, multiplicada por el factor común \exp(E/(R\,T_{\mathrm{ref}})) con T_{\mathrm{ref}} la media de los T_\alpha, para evitar desbordamientos; el factor se cancela en los cocientes. Minimización escalar acotada en 1 \le E_a \le 1000 kJ/mol (tolerancia 10^{-4} kJ/mol). Se necesitan al menos 3 curvas que cubran el segmento. En el E_a exacto, \Phi = n(n-1).
Incertidumbre: no se calcula; u(E_a) y R^2 se informan como NaN.
Referencias: S. Vyazovkin, J. Comput. Chem. 22 (2001) 178; Comité de Cinética del ICTAC, Thermochim. Acta 520 (2011) 1.
Coats–Redfern
matlens/core/thermal.py::coats_redfern
Método de ajuste de modelo con una sola velocidad de calentamiento:
Recta por mínimos cuadrados ordinarios de \ln(g(\alpha)/T^2) frente a 1/T en 0.05 \le \alpha \le 0.95 (por defecto; mínimo 5 puntos finitos) para cada modelo g(\alpha):
| Clave | Modelo | g(\alpha) |
|---|---|---|
| F1 | orden 1 | -\ln(1-\alpha) |
| F1.5 | orden 1.5 | 2\left[(1-\alpha)^{-1/2} - 1\right] |
| F2 | orden 2 | (1-\alpha)^{-1} - 1 |
| R2 | contracción de área | 1 - (1-\alpha)^{1/2} |
| R3 | contracción de volumen | 1 - (1-\alpha)^{1/3} |
| D1 | difusión 1D | \alpha^2 |
| D3 | difusión 3D (Jander) | \left[1 - (1-\alpha)^{1/3}\right]^2 |
| A2 | Avrami–Erofeev n = 2 | \left[-\ln(1-\alpha)\right]^{1/2} |
| A3 | Avrami–Erofeev n = 3 | \left[-\ln(1-\alpha)\right]^{1/3} |
E_a = -s\,R con u(E_a) = u(s)\,R (k = 1). Se descartan modelos con E_a \le 0 y se ordenan por R^2 decreciente. El factor preexponencial se calcula como
en s⁻¹, con \bar T la media de las temperaturas ajustadas.
Nota (diferencia con la literatura): MatLens no obtiene A de la ordenada de la recta de Coats–Redfern (A = \frac{\beta E_a}{R}e^{b}, despreciando 2RT/E_a), sino con la expresión anterior, de tipo Kissinger, evaluada en la temperatura media del intervalo. Además, \ln A así calculado no depende del modelo g(\alpha) salvo a través de E_a.
Referencia: A. W. Coats, J. P. Redfern, Nature 201 (1964) 68.
Escalones TGA: onset y endset
matlens/core/thermal.py::tga_steps, matlens/core/thermal.py::dtg
DTG: dm/dT de la masa suavizada (Savitzky–Golay, ventana 21, orden 3). Los escalones son picos de -dm/dT con prominencia mínima del 5 % del pico mayor; picos a menos de 8 °C o cuyo valle no baja de 0.5 veces el pico menor se fusionan. Los límites de cada escalón se fijan donde -dm/dT cae por debajo de \min(\max(0.01\,r_{\max}, 3\hat\sigma), 0.5\,r_{\max}), con \hat\sigma = 1.4826\,\mathrm{MAD}. Onset y endset son la intersección de la tangente en el máximo de DTG con las líneas base previa y posterior (ajustes lineales de unos \max(5, N/50) puntos):
Pérdida: \Delta m = m_{\mathrm{inicio}} - m_{\mathrm{fin}} evaluadas sobre las líneas base; en % de m_0 (mediana de los 5 primeros puntos). El balance de masa (matlens/core/thermal.py::tga_summary) avisa si la pérdida detectada difiere más de 2 puntos porcentuales de la total.
Referencia: ASTM E2550 / ISO 11358-1.
Estequiometría TGA
matlens/core/thermal.py::hydrate_water_count, matlens/core/thermal.py::expected_residue_pct
con w la fracción de pérdida de agua, M_{\mathrm{H_2O}} = 18.015 g/mol, M_{\mathrm{anh}}, M_r y M_p las masas molares del compuesto anhidro, del residuo y del precursor.
Referencia: implementación propia.
Entalpía de un pico DSC
matlens/core/thermal.py::dsc_peak
| Símbolo | Unidades | Definición |
|---|---|---|
| \Delta H | J/g | entalpía (se informa su valor absoluto y el signo como dirección) |
| \Phi | mW (o W/g si ya está normalizado) | flujo de calor |
| m | mg | masa de muestra (no se usa si los datos están normalizados) |
| t | s | tiempo, de la columna de tiempo o t = (T - T_{lo})/(\beta/60) |
Integración trapezoidal. Línea base lineal entre las medias de los primeros y últimos \max(3, N/25) puntos, o sigmoidal tangencial (ISO 11357-3), en la que la base se interpola proporcionalmente al área parcial acumulada (20 iteraciones). Onset y endset: cruce con cero de las tangentes en los puntos de máxima pendiente de la señal corregida antes y después del pico.
Referencia: ASTM E794 / ISO 11357-1; línea base sigmoidal ISO 11357-3.
Transición vítrea
matlens/core/thermal.py::glass_transition
Líneas base previa y posterior ajustadas al 20 % de los puntos en cada extremo. T_{g,\mathrm{mid}} es la temperatura donde la señal suavizada corta la recta media de ambas bases (semialtura del escalón extrapolado); T_{g,\mathrm{infl}} es el punto de máxima pendiente; onset y endset son las intersecciones de la tangente en la inflexión con cada línea base.
con \Delta\Phi la altura del escalón en T_{g,\mathrm{mid}} (W/g, dividida por la masa si no está normalizada) y \Delta c_p en J g⁻¹ K⁻¹.
Referencia: ASTM E1356 / ISO 11357-2.
Cristalinidad
matlens/core/thermal.py::crystallinity
con \Delta H_m y \Delta H_{cc} las entalpías de fusión y de cristalización en frío (J/g), w la fracción en masa del polímero y \Delta H_m^0 la entalpía del polímero 100 % cristalino (por defecto 293 J/g, PE; tabla: PP 207, PET 140, PLA 93, PCL 139, PA6 230 J/g).
En la operación DSC automática, \Delta H_{cc} se mide (si no se fija a mano): matlens/core/thermal.py::heating_segments separa un programa calentamiento–enfriamiento–calentamiento exportado en una sola tabla en rampas de calentamiento (cambio de signo de dT en el orden del archivo; se analiza la primera, o la indicada), y dsc_events/assign_dsc_events localizan los picos de ambos signos por prominencia (\geq 10 % del mayor) sobre la señal menos la recta entre los extremos. La fusión es el pico grande (\geq 25 % del mayor) de mayor temperatura; su signo define la dirección endotérmica (independiente del convenio «endo arriba/abajo» del equipo). La cristalización en frío es el mayor pico de signo opuesto por debajo de la ventana de fusión; T_g se busca por debajo de ella.
Referencias de \Delta H_m^0: B. Wunderlich, Thermal Analysis of Polymeric Materials (Springer, 2005); Brandrup, Immergut, Grulke, Polymer Handbook, 4.ª ed. (Wiley, 1999).
Tiempo de inducción a la oxidación (OIT)
matlens/core/thermal.py::oxidative_induction_time
Intersección de la tangente en el punto de máxima pendiente tras el cambio de gas con la línea base previa (media de los primeros \max(5, N/20) puntos):
en min.
Referencia: ASTM E1858 / ISO 11357-6.
Separación de rampas en programas calentamiento–enfriamiento–calentamiento
Código: matlens/core/thermal.py::heating_segments
Un programa DSC de varios segmentos exportado como una sola tabla repite cada temperatura; ordenarlo por T entrelazaría los segmentos y destruiría las integrales. Algoritmo exacto:
- Se conservan los índices con T finita (con menos de 8 se devuelve todo como un solo segmento).
- T se suaviza con una media móvil de w = \max(5, \lfloor N/200\rfloor) puntos, forzada a impar, con relleno por repetición del borde.
- Se toma el signo de cada \Delta T_s con una tolerancia de 10^{-4}\,(T_{\max}-T_{\min}): +1 calentamiento, -1 enfriamiento, 0 isoterma.
- Se corta en cada cambio de signo y se conservan solo los tramos de signo +1, en el orden del archivo; isotermas y enfriamientos se descartan.
- Se eliminan las rampas cuyo intervalo de temperatura sea menor que el 15 % (
min_frac) del de la rampa más larga.
La operación DSC automática analiza la primera rampa (primer calentamiento, con la historia térmica de la muestra) o la que indique el usuario.
Supuestos físicos y límites de validez de la cinética
- Ecuación de un solo paso. Todos los métodos parten de d\alpha/dt = A\,e^{-E_a/RT} f(\alpha) con A y E_a constantes. Si la reacción tiene varios pasos (paralelos o consecutivos) o cambia de mecanismo, los métodos isoconversionales lo muestran como una dependencia E_a(\alpha), y
step_warningsavisa cuando (E_{\max}-E_{\min})/|\bar E| > 0.25; Kissinger y Coats–Redfern dan entonces un valor aparente sin significado físico simple. - Calentamiento lineal. OFW, KAS, Starink, Kissinger y la integral de Vyazovkin suponen T = T_0 + \beta t. Con autocalentamiento o con programas no lineales solo Friedman (diferencial) sigue siendo correcto; MatLens no implementa la variante de Vyazovkin para programas arbitrarios de temperatura.
- Aproximaciones de la integral de temperatura. OFW usa la de Doyle (\ln p(x) \approx -5.331 - 1.052\,x, con x = E/RT), adecuada hacia x \approx 20–60; KAS usa p(x)\approx e^{-x}/x^2 y Starink p(x)\propto e^{-1.0008x}/x^{1.92}. El sesgo que introducen no forma parte de la incertidumbre informada (véase el ejemplo resuelto: OFW se desvía alrededor del 1 % y KAS del 0.2 % en el caso sintético).
- Kissinger supone que el máximo de d\alpha/dt ocurre a la misma conversión para todas las \beta (estrictamente cierto solo para orden 1); su \ln A corresponde a un modelo F1.
- Coats–Redfern con una sola velocidad no distingue modelos g(\alpha) que linealizan igual de bien (efecto de compensación): varios modelos dan R^2 \approx 1 con E_a muy distintas (en el ejemplo, F1, A2 y A3). Las recomendaciones del ICTAC desaconsejan obtener E_a con una sola \beta.
- Línea base DSC. La línea base lineal supone que la capacidad calorífica cambia linealmente a través del pico; si el pico coincide con un escalón de c_p (p. ej. fusión cerca de T_g) conviene la sigmoidal. Las entalpías no se corrigen por la constante de calibración del equipo: MatLens supone que el flujo de calor ya está calibrado.
Incertidumbre: qué se informa y qué no
| Resultado | Incertidumbre informada | Tipo |
|---|---|---|
| Kissinger E_a | u(s)\,R, error típico de la pendiente | analítica, k = 1 |
| Kissinger \ln A | ninguna | — |
| OFW, KAS, Starink, Friedman E_a(\alpha) | u(s)\,R/c, con c = 1.052, 1, 1.0008, 1 | analítica, k = 1 |
| Vyazovkin E_a(\alpha) | NaN (no se calcula) | — |
| Coats–Redfern E_a | u(s)\,R; \ln A sin incertidumbre | analítica, k = 1 |
| TGA, DSC, T_g, OIT, X_c | ninguna | — |
No se incluye: el sesgo de las aproximaciones de la integral de temperatura, la elección de la ventana de \alpha o de la línea base, la calibración de temperatura y de entalpía del equipo, el retardo térmico (que crece con \beta y desplaza T_p) ni la incertidumbre de la masa. Con 3–4 velocidades la regresión tiene 1–2 grados de libertad; un intervalo del 95 % exigiría el factor de Student (t_{0.975,1} \approx 12.7 con 3 puntos), que MatLens no aplica: el valor es k = 1.
Avisos de validez
Condiciones comprobadas en el código (los textos aparecen en la sección «Validity warnings» de esta página):
tga_summary: estado warning si la suma de las pérdidas de los escalones detectados difiere en más de 2 puntos porcentuales de la pérdida total 100\,(m_0 - m_\text{fin})/m_0 (pérdida temprana o ancha que el umbral de prominencia de la DTG no separó).step_warnings: aviso si la dispersión relativa de E_a(\alpha) supera 0.25 (no es un paso único).- Errores que impiden el cálculo (
ValueError, no se muestra ningún número): menos de 3 velocidades de calentamiento (isoconversional y Kissinger); menos de 10 puntos o pérdida nula al obtener \alpha de TGA; área nula al obtenerla de DSC; menos de 5 puntos entre los límites de \alpha (Coats–Redfern); menos de 20 puntos en TGA; falta la velocidad o la columna de tiempo, o la masa, endsc_peak; transición vítrea no encontrada en el rango; pérdida fuera de 0–100 % enhydrate_water_count; menos puntos de los necesarios tras el cambio de gas en OIT.
Referencias con DOI
DOI comprobados en Crossref: Kissinger, Anal. Chem. 29 (1957) 1702, doi:10.1021/ac60131a045; Ozawa, Bull. Chem. Soc. Jpn. 38 (1965) 1881, doi:10.1246/bcsj.38.1881; Flynn y Wall, J. Res. NBS 70A (1966) 487, doi:10.6028/jres.070A.043; Friedman, J. Polym. Sci. C 6 (1964) 183, doi:10.1002/polc.5070060121; Starink, Thermochim. Acta 404 (2003) 163, doi:10.1016/S0040-6031(03)00144-8; Coats y Redfern, Nature 201 (1964) 68, doi:10.1038/201068a0; Vyazovkin et al. (ICTAC), Thermochim. Acta 520 (2011) 1, doi:10.1016/j.tca.2011.03.034. Akahira y Sunose (1971) y Vyazovkin, J. Comput. Chem. 22 (2001) 178 se citan sin DOI (no verificado). Las normas ASTM/ISO se citan por su código.
Ejemplos resueltos
Generados por tools/gen_equation_examples.py (módulo tools/equation_examples/thermal.py) ejecutando las funciones de MatLens sobre casos sintéticos; no se editan a mano.
Ejemplo resuelto: cinética (Kissinger, isoconversionales, Coats–Redfern)
Caso sintético: reacción de primer orden (F1) con E_a = 150 kJ/mol y \ln A = 25 (A en s⁻¹), calentada a 2, 5, 10, 20 K/min; \alpha(T) exacto por integración numérica de d\alpha/dT = (A/\beta)e^{-E_a/RT}(1-\alpha) en una rejilla de 0.1 K entre 150 y 450 °C. Resultados de kissinger, isoconversional y coats_redfern:
| β (K/min) | T_p (K) |
|---|---|
| 2 | 576.137 |
| 5 | 592.417 |
| 10 | 605.338 |
| 20 | 618.816 |
Kissinger: E_a = 150 ± 6.5e-05 kJ/mol, \ln A = 25, R^2 = 1.
| Método | E_a (α = 0.2) | E_a (α = 0.5) | E_a (α = 0.8) |
|---|---|---|---|
| Kissinger–Akahira–Sunose | 149.73 ± 0.0042 | 149.71 ± 0.0043 | 149.7 ± 0.0044 |
| Ozawa–Flynn–Wall | 151.36 ± 0.063 | 151.66 ± 0.068 | 151.89 ± 0.071 |
| Starink (2003) | 149.99 ± 0.0014 | 149.99 ± 0.0013 | 149.98 ± 0.0013 |
| Friedman (diferencial) | 150 ± 1.5e-05 | 150 ± 4.9e-05 | 150 ± 0.00026 |
| Vyazovkin (integral avanzado) | nan | 150 | 150 |
(E_a en kJ/mol, ± error típico de la pendiente, k = 1; Vyazovkin no da incertidumbre.)
Coats–Redfern a 10 K/min, tres mejores modelos por R^2:
| Modelo | E_a (kJ/mol) | u(E_a) | \ln A | R^2 |
|---|---|---|---|---|
| F1 | 149.72 | 0.00033 | 25.69 | 1 |
| A2 | 69.951 | 0.0031 | 8.708 | 0.999999 |
| A3 | 43.363 | 0.004 | 2.822 | 0.999994 |
Las diferencias con el valor verdadero (150 kJ/mol) muestran el sesgo propio de cada aproximación de la integral de temperatura; no forman parte de la incertidumbre informada.
En este ejemplo Vyazovkin da NaN en \alpha = 0.2 porque con la rejilla 0.2/0.5/0.8 el primer segmento empieza en \max(0.2 - 0.3, 0) = 0, y ninguna curva cubre exactamente \alpha = 0; con la rejilla por defecto (paso 0.05) ese caso solo afecta al primer punto si las curvas no empiezan en \alpha = 0.
Ejemplo resuelto: escalones TGA y balance de masa
Caso sintético: dos escalones sigmoidales de 12 % (centro 120 °C, anchura 8 °C) y 30 % (450 °C, 15 °C) sobre 100 %, rejilla de 0.5 °C y ruido gaussiano \sigma = 0.01 % (semilla fija). Resultado de tga_steps y tga_summary:
| Escalón | Onset (°C) | T_{max} DTG (°C) | Endset (°C) | Pérdida (%) |
|---|---|---|---|---|
| 1 | 104.67 | 120.5 | 135.32 | 11.83 |
| 2 | 421.42 | 449.5 | 478.65 | 29.57 |
Balance: pérdida total 42 %, detectada 41.4 %, sin asignar 0.601 %, residuo 58 %; estado de validez ok.
Si el primer escalón fuera agua de hidratación de un compuesto anhidro de 160 g/mol, hydrate_water_count daría n_{H_2O} = 1.192.
Ejemplo resuelto: entalpía de un pico DSC
Caso sintético sin ruido: pico gaussiano de 2.0 mW de altura y \sigma = 4 K centrado en 150 °C sobre una línea base inclinada (0.5 mW + 0.002 mW/K), \beta = 10 K/min, masa 5 mg, integrado entre 120 y 180 °C con línea base lineal (dsc_peak). Área analítica: 2.0\cdot4\sqrt{2\pi}/(\beta/60) = 120.32 mJ, es decir 24.064 J/g.
| Magnitud | Valor |
|---|---|
| \lvert\Delta H\rvert (J/g) | 24.064 |
| dirección | 1 |
| T_{pico} (°C) | 150 |
| T_{onset} (°C) | 142 |
| T_{endset} (°C) | 158 |
| X_c con \Delta H_m^0 = 293 J/g (%) | 8.213 |
Ejemplo resuelto: separación de rampas
Programa calentamiento–enfriamiento–calentamiento 25 → 200 → 25 → 200 °C exportado como una sola tabla de 1198 filas. heating_segments devuelve:
| Rampa | primer índice | último índice | T inicial (°C) | T final (°C) |
|---|---|---|---|---|
| 1 | 0 | 399 | 25 | 200 |
| 2 | 798 | 1197 | 25 | 200 |
El enfriamiento se descarta; la operación DSC automática analiza la primera rampa salvo que se indique otra.