Esta sección resume las ecuaciones que MatLens evalúa en el análisis de isotermas de adsorción de gases, tal como están implementadas en matlens/core/adsorption.py. Unidades internas: presión relativa p/p_0 (adimensional), cantidad adsorbida n en mmol/g, anchos de poro en nm, volúmenes de líquido en cm³/g y áreas en m²/g.
Constantes y conversión de unidades
| Símbolo | Valor en el código | Significado |
|---|---|---|
| R | 8.314462618 J mol⁻¹ K⁻¹ | constante de los gases |
| N_A | 6.02214076×10²³ mol⁻¹ | constante de Avogadro |
| V_{\mathrm{STP}} | 22414 cm³/mol | volumen molar del gas a 273.15 K y 101.325 kPa |
Conversión de cantidad adsorbida (matlens/core/adsorption.py::loading_factor_to_mmol): 1 cm³(STP)/g equivale a 10^3/V_{\mathrm{STP}} mmol/g; 1 mg/g equivale a 1/M mmol/g (M masa molar del adsorbato, g/mol).
Volumen de líquido adsorbido (matlens/core/adsorption.py::liquid_volume):
con V_{\mathrm{liq}} en cm³/g, n en mmol/g, M en g/mol y \rho_{\mathrm{liq}} (densidad del adsorbato líquido a la temperatura de análisis) en g/cm³. Valores por defecto de la tabla de adsorbatos: N₂ (77.35 K) \sigma = 0.162 nm², \rho = 0.8061 g/cm³, \gamma = 8.88 mN/m; Ar (87.3 K) \sigma = 0.142 nm², \rho = 1.40 g/cm³, \gamma = 13.2 mN/m; Kr (77.35 K) \sigma = 0.202 nm²; CO₂ (273.15 K) \sigma = 0.17 nm².
Área a partir de la capacidad de monocapa
matlens/core/adsorption.py::area_from_monolayer
| Símbolo | Unidades | Definición |
|---|---|---|
| S | m²/g | área específica |
| n_m | mmol/g | capacidad de monocapa |
| \sigma | nm² | área ocupada por una molécula en la monocapa (por defecto 0.162 nm², N₂) |
La capacidad de monocapa también se expresa como volumen de gas: v_m = n_m \cdot 10^{-3}\, V_{\mathrm{STP}} (cm³ STP/g).
BET (forma lineal)
matlens/core/adsorption.py::bet_transform, matlens/core/adsorption.py::_bet_evaluate, matlens/core/adsorption.py::bet_range
Origen y supuestos. Brunauer, Emmett y Teller extienden el equilibrio de Langmuir a infinitas capas: la primera capa se adsorbe con calor q_1 y todas las siguientes con el calor de licuefacción q_L, sin interacciones laterales y sobre una superficie energéticamente homogénea. Sumando la serie geométrica de capas se obtiene la isoterma
cuya reordenación es la forma lineal de abajo. Límites de validez: los supuestos fallan a baja presión en superficies heterogéneas (sitios de alta energía llenos primero) y por encima de p/p_0 \approx 0.3 (condensación capilar, número finito de capas); en microporos (isotermas tipo I) el "llenado de monocapa" no existe físicamente y el área BET es solo un área aparente, de ahí los criterios de Rouquerol. \sigma supone un empaquetamiento compacto de N₂ líquido; sobre superficies polares la orientación del cuadrupolo de N₂ hace que el valor real sea menor (motivo por el que ISO 9277 menciona Ar a 87 K).
Se ajusta por mínimos cuadrados ordinarios (sin pesos) la recta y = s\,x + b con x = p/p_0 e y = \dfrac{p/p_0}{n(1-p/p_0)}. De la pendiente s y la ordenada b:
| Símbolo | Unidades | Definición |
|---|---|---|
| n | mmol/g | cantidad adsorbida (rama de adsorción) |
| p/p_0 | — | presión relativa |
| n_m | mmol/g | capacidad de monocapa |
| C | — | constante BET |
| s, b | g/mmol | pendiente y ordenada de la recta BET |
Procedimiento: se descartan puntos no finitos, con p/p_0 \le 0, p/p_0 \ge 1 o n \le 0, y se ordenan por presión. En modo manual se usan los puntos con p_{lo} \le p/p_0 \le p_{hi} (mínimo 3). El ajuste se rechaza si s + b \le 0.
Incertidumbre (k = 1, propagación lineal a partir de la matriz de covarianza de la regresión, con \hat\sigma^2 = SS_{res}/(N-2)):
La incertidumbre de \sigma no se propaga.
Qué no incluye la incertidumbre. Es la incertidumbre estadística de la regresión lineal (k=1; multiplique por 2 para un intervalo de cobertura aproximado del 95 %). No incluye: la elección del rango (véase el mapa de ventanas, que la cuantifica aparte), el valor de \sigma, el error de p_0 y de la medida volumétrica, la correlación entre puntos, ni el sesgo del modelo BET (heterogeneidad, microporos). La transformación y = x/[n(1-x)] amplifica el ruido a x alto, y la regresión no pondera los puntos por ello.
Avisos que emite el código (en BETResult.warnings): menos de 5 puntos en el rango (ISO 9277 recomienda al menos 5); R^2 < 0.999; C < 5 (monocapa poco fiable); C > 500 (típico de microporos, área aparente). Un rango que no cumple los cuatro criterios de Rouquerol tiene ok = False. Errores (sin resultado): menos de 3 puntos en el rango manual o s + b \le 0.
Referencias: Brunauer, Emmett & Teller, J. Am. Chem. Soc. 60 (1938) 309, doi:10.1021/ja01269a023; ISO 9277:2022 §6.2 / Anexo C; Thommes et al. (IUPAC), Pure Appl. Chem. 87 (2015) 1051, doi:10.1515/pac-2014-1117.
Ejemplo resuelto
Caso sintético: isoterma BET ideal (infinitas capas) con n_m = 4.0 mmol/g y C = 120, 23 presiones de 10^{-3} a 0.99 y ruido relativo del 0.5 % (semilla 5); N₂, \sigma = 0.162 nm². Área verdadera S = 390.2 m²/g.
bet_auto(p, n) → rango p/p_0 = 0.001 – 0.3 (14 puntos), pendiente s = 0.2475 g/mmol, ordenada b = 0.002104 g/mmol, R^2 = 0.999919.
n_m = 4.007 \pm 0.0094 mmol/g (v_m = 89.82 cm³ STP/g), C = 118.6 \pm 5, S_\text{BET} = 390.9 \pm 0.91 m²/g (k=1).
Criterios de Rouquerol: 1: sí (C = 118.6); 2: sí (creciente; máximo de n(1−p/p₀) en p/p₀ = 0.95); 3: sí (p/p₀(n_m) = 0.08537; rango 0.001–0.3); 4: sí (1/(√C+1) = 0.08411; experimental = 0.08537 (-1.5 %)).
Avisos: ninguno.
Criterios de consistencia de Rouquerol
matlens/core/adsorption.py::_bet_evaluate, matlens/core/adsorption.py::rouquerol_transform, matlens/core/adsorption.py::rouquerol_max_index
Cada rango BET se evalúa con los cuatro criterios:
- C > 0 (y ordenada b > 0).
- n(1 - p/p_0) crece estrictamente con p/p_0 dentro del rango, y el límite superior del rango no sobrepasa la p/p_0 del máximo de n(1-p/p_0) calculado sobre toda la rama.
- La presión relativa experimental a la que la isoterma alcanza n_m, p_{\mathrm{exp}}, está dentro del rango. p_{\mathrm{exp}} se obtiene por interpolación lineal de p/p_0 frente a la envolvente monótona creciente de n.
- La presión de monocapa predicha por BET coincide con la experimental dentro de una tolerancia relativa del 10 %:
Referencias: Rouquerol, Llewellyn & Rouquerol, Stud. Surf. Sci. Catal. 160 (2007) 49, doi:10.1016/S0167-2991(07)80008-5; ISO 9277:2022 §6.2 / Anexo C; tolerancia del ±10 % según ISO 9277:2022 y BETSI (Osterrieth et al., Adv. Mater. 34 (2022) 2201502).
Criterio 2 en la práctica: el máximo de n(1-p/p_0) se busca en toda la rama limpia, no solo en la ventana de búsqueda; por tanto un rango puede fallar el criterio 2 aunque la transformada sea creciente dentro de él. El criterio 3 usa la envolvente monótona de n para que una isoterma ruidosa no produzca varias soluciones de n(p_\text{exp}) = n_m. Fundamento físico: n(1-p/p_0) decrece cuando la isoterma deja de crecer más deprisa que 1/(1-p/p_0), señal de que la multicapa está saturada (microporos llenos) y la ecuación BET ya no describe el dato; los criterios 3 y 4 exigen que la monocapa obtenida sea autoconsistente con la propia isoterma.
Búsqueda automática del rango BET
matlens/core/adsorption.py::bet_auto
Se recorren todos los rangos contiguos de puntos dentro de la ventana 5\times10^{-4} \le p/p_0 \le 0.35 (valores por defecto), primero con un mínimo de 5 puntos y, si ninguno cumple los cuatro criterios, con un mínimo de 3. Entre los rangos que cumplen los cuatro criterios se elige por este orden: R^2 \ge 0.999, mayor número de puntos y, después, mayor R^2. Si ningún rango cumple todo, se devuelve el que cumple los criterios 1, 2 y 3 con la menor desviación relativa del criterio 4 (y después el mayor número de puntos), marcado como no válido y con un aviso.
Mapa de ventanas BET
matlens/core/adsorption.py::bet_window_map
Se evalúan todos los rangos contiguos de al menos 5 puntos dentro de la misma ventana (5\times10^{-4} a 0.35) y se conservan los que cumplen los cuatro criterios de Rouquerol y tienen R^2 \ge 0.995. Se informan el área mínima, la mediana y la máxima, y la dispersión relativa:
donde \tilde S es la mediana. Una dispersión grande indica que el área BET de la isoterma está mal definida (típico de isotermas tipo I microporosas).
A diferencia de bet_auto, el mapa no baja a 3 puntos ni devuelve un rango de reserva: si ningún rango pasa, las tres áreas son NaN y el mapa está vacío. El umbral de linealidad del mapa (R^2 \ge 0.995) es más laxo que el preferido por bet_auto (0.999). La dispersión \delta_S es un indicador de la ambigüedad del rango, no una incertidumbre con nivel de confianza.
Referencia: en el espíritu de BETSI, Osterrieth et al., Adv. Mater. 34 (2022) 2201502, doi:10.1002/adma.202201502.
Nota (diferencia con BETSI): BETSI añade más filtros (p. ej. sobre el número de puntos y la selección final de un área); MatLens solo informa el mínimo, la mediana y el máximo de las áreas de los rangos válidos.
Ejemplo resuelto
Misma isoterma que el ejemplo anterior.
bet_window_map(p, n) → 42 rangos contiguos (≥ 5 puntos) cumplen los cuatro criterios con R^2 \ge 0.995; área mínima 387.1, mediana 390.9 y máxima 394.6 m²/g; dispersión relativa \delta_S = 1.92 %.
Langmuir
matlens/core/adsorption.py::langmuir_area
Recta por mínimos cuadrados ordinarios de (p/p_0)/n frente a p/p_0 en el rango elegido (mínimo 3 puntos). Con pendiente s y ordenada b:
| Símbolo | Unidades | Definición |
|---|---|---|
| n_m | mmol/g | capacidad de monocapa de Langmuir |
| K | — (en la escala de p/p_0) | constante de Langmuir; infinito si b \le 0 |
Se rechaza el ajuste si s \le 0. No se calcula incertidumbre. Validez: monocapa sin interacciones laterales; sobreestima el área de sólidos mesoporosos (isotermas II/IV) y solo es razonable, como área aparente, para isotermas tipo I.
Referencia: implementación propia.
Curvas de espesor estadístico t
matlens/core/adsorption.py::thickness_harkins_jura, matlens/core/adsorption.py::thickness_halsey, matlens/core/adsorption.py::thickness_carbon_black
Harkins–Jura (t en nm, \log_{10}):
Halsey (t en nm, logaritmo natural):
Negro de carbono (de Boer/Magee, STSA, ASTM D6556; t en nm, válida para 0.2 < p/p_0 < 0.5):
t-plot
matlens/core/adsorption.py::t_plot
Se calcula t(p/p_0) con el modelo elegido (por defecto Harkins–Jura) para los puntos con p/p_0 < 0.999 y se ajusta por mínimos cuadrados ordinarios la recta n = s\,t + b con los puntos cuyo espesor está en el rango 0.45 \le t \le 0.70 nm (por defecto; mínimo 3 puntos).
| Símbolo | Unidades | Definición |
|---|---|---|
| s | mmol g⁻¹ nm⁻¹ | pendiente del t-plot |
| b | mmol/g | ordenada en el origen |
| f | cm³/mmol | volumen de líquido por mmol, f = 10^{-3} M/\rho_{\mathrm{liq}} |
| V_{\mathrm{micro}} | cm³/g | volumen de microporos (líquido) |
| S_{\mathrm{ext}} | m²/g | área externa |
| S_{\mathrm{micro}} | m²/g | área de microporos (solo si se proporciona S_{\mathrm{BET}}) |
El factor 10^3 convierte cm³ g⁻¹ nm⁻¹ en m²/g. Si b < 0 se toma V_{\mathrm{micro}} = 0 y se avisa de que no hay microporosidad detectable.
Incertidumbre (k = 1, error típico de la regresión): u(S_{\mathrm{ext}}) = u(s)\,f\cdot10^3 y u(V_{\mathrm{micro}}) = u(b)\,f. No incluye el error de la curva t de referencia (que es la fuente dominante: las curvas Harkins–Jura, Halsey y de negro de carbono dan áreas externas distintas para el mismo dato) ni la elección del rango de t.
Fundamento y validez. Por encima del llenado de microporos, la adsorción en la superficie externa crece como una película de espesor t(p/p_0), igual que en un sólido no poroso de referencia; por eso n es lineal en t con pendiente proporcional al área externa y ordenada igual a la cantidad retenida en microporos. Falla si el rango de t incluye llenado de microporos (curvatura a t bajo) o condensación capilar en mesoporos (curvatura hacia arriba a t alto), y si la química superficial difiere de la del material para el que se calibró la curva t.
Avisos del código: ordenada negativa (no hay microporosidad detectable; V_\text{micro} = 0); curva de negro de carbono fuera de 0.2 < p/p_0 < 0.5 (se recuerda siempre que se elige ese modelo). Error: menos de 3 puntos en el rango de t.
Referencias: Lippens & de Boer, J. Catal. 4 (1965) 319, doi:10.1016/0021-9517(65)90307-6 (método t); Harkins & Jura, J. Am. Chem. Soc. 66 (1944) 1366, doi:10.1021/ja01236a048.
Ejemplo resuelto
Caso sintético: llenado de microporos de Langmuir (0.6 mmol/g, K = 500) más una superficie externa de 50 m²/g cuyo espesor sigue Harkins–Jura, n_\text{ext} = t\,S_\text{ext}/(f\cdot10^3); ruido relativo del 0.3 % (semilla 6); N₂ con f = 0.03475 cm³/mmol. Valores verdaderos: V_\text{micro} = 0.02085 cm³/g (casi saturado en el rango de ajuste), S_\text{ext} = 50 m²/g.
t_plot(p, n, N2) (Harkins–Jura, 0.45 \le t \le 0.70 nm, 5 puntos) → pendiente = 1.502 mmol g⁻¹ nm⁻¹, ordenada = 0.5634 mmol/g, R^2 = 0.99939; S_\text{ext} = 52.21 \pm 0.74 m²/g, V_\text{micro} = 0.01958 \pm 0.00041 cm³/g (k=1).
Gráfico αs
matlens/core/adsorption.py::alpha_s_plot
Con una isoterma de referencia no porosa de área conocida S_{\mathrm{ref}} (m²/g):
(n_{\mathrm{ref}} interpolada linealmente; presión de reducción 0.4 por defecto). Recta n = s\,\alpha_s + b con los puntos en 0.8 \le \alpha_s \le 1.6 (mínimo 3), y
Incertidumbre (k = 1): u(S_{\mathrm{ext}}) = u(s)\,S_{\mathrm{ref}}/n_{\mathrm{ref}}(0.4), u(V_{\mathrm{micro}}) = u(b)\,f.
Referencia: implementación propia.
Ecuación de Kelvin
matlens/core/adsorption.py::kelvin_radius
| Símbolo | Unidades | Definición |
|---|---|---|
| r_K | nm | radio del núcleo (core) de Kelvin |
| \gamma | N/m (se introduce en mN/m) | tensión superficial del líquido |
| V_m | m³/mol | volumen molar del líquido, V_m = M/\rho_{\mathrm{liq}}\cdot10^{-6} |
| T | K | temperatura de análisis |
| f_m | — | 1 para menisco hemisférico (desorción), 2 para menisco cilíndrico (adsorción) |
Corrección KJS opcional: r_K + 0.3 nm (Kruk–Jaroniec–Sayari, calibrada en MCM-41 de 2 a 6.5 nm).
Origen y validez. La ecuación de Kelvin iguala el potencial químico del vapor, RT\ln(p/p_0), con el del líquido bajo un menisco de curvatura media f_m/r (Young–Laplace, \Delta p = 2\gamma/r para el hemisferio, \gamma/r para el cilindro). Supone líquido incompresible con tensión superficial macroscópica y ángulo de contacto nulo. Pierde validez por debajo de unos 2 nm de diámetro (la tensión superficial y la densidad dejan de ser las del líquido macroscópico) y subestima el tamaño en ese intervalo, motivo de la corrección KJS y de los métodos DFT.
Ejemplo resuelto
N₂ a 77.35 K: \gamma = 8.88 mN/m, M = 28.01 g/mol, \rho = 0.8061 g/cm³ (tabla de adsorbatos de MatLens).
| p/p_0 | r_K hemisf. (nm) | r_K cilínd. (nm) | t H–J (nm) | D = 2(r_K+t) desorción (nm) |
|---|---|---|---|---|
| 0.4 | 1.047 | 0.5237 | 0.5691 | 3.233 |
| 0.6 | 1.879 | 0.9393 | 0.7395 | 5.236 |
| 0.8 | 4.301 | 2.15 | 1.034 | 10.67 |
| 0.9 | 9.109 | 4.554 | 1.324 | 20.87 |
BJH y Dollimore–Heal
matlens/core/adsorption.py::psd_mesopores
Poros cilíndricos. Se usa una sola rama (por defecto desorción) en el intervalo 0.35 \le p/p_0 \le 0.99, recorrida de mayor a menor presión. Para cada punto se calcula el espesor t (por defecto Harkins–Jura), el radio de Kelvin r_K y el radio de poro
Para cada intervalo i entre dos puntos consecutivos: \Delta V_i es la disminución del volumen de líquido adsorbido, \bar t_i, \bar r_{K,i}, \bar r_{p,i} son medias aritméticas de los extremos y \Delta t_i es la disminución del espesor.
BJH:
Dollimore–Heal:
con A_j = 2V_{p,j}/\bar r_{p,j} (área de pared; se informa en m²/g multiplicando por 10^3). Los volúmenes negativos se fijan a cero. Resultados por intervalo:
con D en nm, V_p en cm³/g y volumen acumulado sumado de anchos pequeños a grandes. El modo de la distribución se toma en el máximo de dV/d\log D suavizado con media móvil de 5 puntos.
Validez: en la rama de adsorción (menisco cilíndrico) el tamaño se sobreestima; la rama de desorción puede mostrar cavitación o bloqueo de poro hacia p/p_0 \approx 0.42 con N₂ a 77 K. No se calcula incertidumbre.
Referencias: Barrett, Joyner & Halenda, J. Am. Chem. Soc. 73 (1951) 373, doi:10.1021/ja01145a126; Dollimore & Heal, J. Appl. Chem. 14 (1964) 109 (sin DOI verificado); discretización de los artículos originales tal como la implementa psd_meso de pyGAPS (MIT).
Horvath–Kawazoe y Rege–Yang
matlens/core/adsorption.py::psd_horvath_kawazoe
Distribución de microporos calculada por pyGAPS 4.6 (MIT, © 2022 Paul Iacomi) mediante un envoltorio. MatLens usa los puntos con p/p_0 \le 0.2 (mínimo 5), parámetros de adsorbato solo para N₂ (77 K) y Ar (87 K), geometría ranura (carbono) o cilindro (óxidos), y convierte la distribución con dV/d\log w = (dV/dw)\,w\ln 10. Modelo semiempírico; ancho de poro efectivo; los parámetros de Ar son aproximados.
Referencia: implementación de pyGAPS (MIT).
Ajuste de kernel DFT
matlens/core/adsorption.py::psd_dft
El kernel K (mmol por cm³ de poro frente a p/p_0, anchos en nm) se interpola linealmente en presión, añadiendo el punto K(0, w) = 0. Se resuelve por mínimos cuadrados no negativos (NNLS) con pesos relativos y regularización de segunda diferencia:
(0.05 es el factor de suavizado por defecto; N_w número de anchos del kernel). Intervalo de presiones: 10^{-6} \le p/p_0 \le 0.99 limitado al del kernel, mínimo 6 puntos. dV/dw = V_w/\Delta w con \Delta w por diferencias centradas. Validez: solo para el adsorbato, la temperatura y el modelo de poro del kernel (por defecto el kernel N₂/77 K de poros en ranura de carbono incluido en pyGAPS, que se lee en tiempo de ejecución y no se redistribuye); no es un NLDFT/QSDFT comercial. No se calcula incertidumbre.
Referencia: implementación propia.
Volumen total de poro y ancho medio
matlens/core/adsorption.py::total_pore_volume, matlens/core/adsorption.py::mean_pore_width
Regla de Gurvich: V_{\mathrm{tot}} = V_{\mathrm{liq}}(n(p/p_0 = 0.99)) en la rama de adsorción (interpolación lineal; si el último punto está a menos de 0.01 del objetivo, se usa ese punto). Ancho medio para poros cilíndricos:
con \bar D en nm, V_{\mathrm{tot}} en cm³/g y S en m²/g.
Referencia: implementación propia.
Calor isostérico
matlens/core/adsorption.py::isosteric_heat
Clausius–Clapeyron a cantidad adsorbida constante:
Requiere al menos dos isotermas a temperaturas distintas con presión absoluta (bar). En cada isoterma se toma la envolvente monótona de n y se interpola \ln p linealmente en n sobre una rejilla de 30 cargas en el intervalo común. Para cada carga, recta por mínimos cuadrados ordinarios de \ln p frente a 1/T: q_{st} = -s\,R\cdot10^{-3} (kJ/mol, positivo), con u(q_{st}) = u(s)\,R\cdot10^{-3} (k = 1). Con solo dos temperaturas no hay estimación de error.
Referencia: implementación propia.
Constante de Henry
matlens/core/adsorption.py::henry_constant
Ajuste por el origen de los puntos de menor presión (los 6 primeros por defecto, o p \le p_{\max}):
y extrapolación virial: recta de \ln(n/p) frente a n, con K_{H,\mathrm{virial}} = e^{b}. K_H en mmol g⁻¹ bar⁻¹. No se calcula incertidumbre.
Referencia: implementación propia.
IAST binaria
matlens/core/adsorption.py::iast_binary
Presión de expansión reducida de cada isoterma pura, interpolada linealmente en p (tramo de Henry por debajo del primer punto y n constante por encima del último):
Se resuelve (método de Brent) \pi_1(P y_1/x_1) = \pi_2(P y_2/(1-x_1)) para la fracción molar adsorbida x_1, y
Se marca como extrapolado si alguna presión de referencia supera el máximo medido.
Referencia: implementación propia.