Funciones utilitarias varias

En este documento se presentan algunas funciones que pueden ser de utilidad en diferentes asignaturas.

Constantes de equilibrio líquido vapor - ecuación de McWilliams

La ecuación de McWilliams, es:

\[ \ln(K) = \dfrac{a_{T1}}{T^2}+\dfrac{a_{T2}}{T}+a_{T6}+a_{p1}\ln(p)+\dfrac{a_{p2}}{p^2}+\dfrac{a_{p3}}{p} \]

Donde la temperatura está en Rankine y la presión en libras fuerza por pulgada cuadrada (psi: pounds per square inch). Esta ecuación se ha programado en la función kMcWilliams, donde se han incorporado las constantes para 14 compuestos (tomadas de "Separation Process Engineering" de Phillip C. Wankat):

let kMcWilliams = (function() { // constantes conocidas de la ecuación de McWilliams const cMcW = [ ["metano",-292.860,0,8.2445,-.8951,59.8465,0], ["etileno",-600076.875,0,7.90595,-.84677,42.94594,0], ["etano",-687248.25,0,7.90694,-.8860,49.02654,0], ["propileno",-923484.6875,0,7.71725,-.87871,47.67624,0], ["propano",-970688.5625,0,7.15059,-.76984,0,6.90224], ["isobutano",-1166846,0,7.72668,-.92213,0,0], ["n-butano",-1280557,0,7.94986,-.96455,0,0], ["isopentano",-1481583,0,7.58071,-.93159,0,0], ["n-pentano",-1524891,0,7.33129,-.89143,0,0], ["n-hexano",-1778901,0,6.96783,-.84634,0,0], ["n-heptano",-2013803,0,6.52914,-.79543,0,0], ["n-octano",0,-7646.81641,12.48457,-.73152,0,0], ["n-nonano",-2551040,0,5.69313,-.67818,0,0], ["n-decano",0,-9760.45703,13.80354,-.71470,0,0] ]; // Ecuación de McWilliams return function({T, P, compuesto}={}) { let i = cMcW.findIndex(e=>e[0]==compuesto.toLowerCase()); if (i<0) throw new RangeError(`No existe la constante de McWilliams para el ${compuesto}.`); const [aT1, aT2, aT6, ap1, ap2, ap3] = cMcW[i].slice(1); return Math.exp(aT1/T**2+aT2/T+aT6+ap1*Math.log(P)+ap2/P**2+ap3/P); }; })();

Para calcular una constante de equilibrio, se manda a la función la temperatura (en R), la presión (en psi) y el nombre del compuesto. Por ejemplo, para calcular las constantes de equilibrio para el isopentano, n-pentano y n-hexano a 581.58 R y 14.7 psi, se escribe:

kMcWilliams({T:581.58, P:14.7, compuesto:"isopentano"})
kMcWilliams({T:581.58, P:14.7, compuesto:"n-pentano"})
kMcWilliams({T:581.58, P:14.7, compuesto:"n-hexano"})

Si el compuesto no está en la lista de constantes conocidas, simplemente se copia el código de la función, se pega en la calculadora o en cualquiera de las calculadoras insertadas en el texto (como la que se encuentra encima de este párrafo), se añaden las constantes del nuevo compuesto (incluido su nombre) y se evalúa la función, para que reemplace a la versión anterior de la función.

Cálculo de los puntos de burbuja y rocío

Para calcular los puntos de burbuja y rocío, calculando las constantes de equilibrio con la ecuación de McWilliams, se han programado las funciones tBurbujaMW, pBurbujaMW, tRocíoMW y pRocíoMW.

En el punto de burbuja, se debe cumplir:

\[ \sum_{i=1}^{n}{K_ix_i}-1 = \sum_{i=1}^{n}{y_i}-1=0 \]

En las funciones que calculan el punto de burbuja, se hace que, variando la temperatura o la presión, esta expresión sea cierta, es decir que la sumatoria menos 1 sea igual a cero. Con ese fin (para hacer variar la temperatura o la presión, hasta que la igualdad se cumpla) se emplea el método de Newton-Raphson:

function tBurbujaMW({Ti, P, compuestos, x}={}) { // Sumatoria de las fracciones molares en la fase gaseosa, menos 1. a la temperatura T. function sumyi(T) { let s = 0; for (let i=0; i<compuestos.length; i++) { Ki = kMcWilliams({T, P, compuesto:compuestos[i]}); s += Ki*x[i]; } return s-1; } // Resolución la función sumyi, con el método de Newton return sumyi.newton({xi:Ti, err:9}); }

function pBurbujaMW({Pi, T, compuestos, x}={}) { // Sumatoria de las fracciones molares en la fase gaseosa, menos 1, a la presión P. function sumyi(P) { let s = 0; for (let i=0; i<compuestos.length; i++) { Ki = kMcWilliams({T, P, compuesto:compuestos[i]}); s += Ki*x[i]; } return s-1; } // Resolución la función sumyi, con el método de Newton return sumyi.newton({xi:Pi, err:9}); }

Por ejemplo, para calcular el punto de burbuja de la siguiente mezcla, a una presión de 250 psi:

Compuestoxi
Etano0.03
Propano0.20
n-Butano0.37
n-Pentano0.35
n-Hexano0.05

Se escriben las siguientes instrucciones, donde se ha asumido una temperatura de burbuja inicial de 700 R:

compuestos = ["etano", "propano", "n-butano", "n-pentano", "n-hexano"]; x = [0.03, 0.2, 0.37, 0.35, 0.05];
Tb = tBurbujaMW({Ti:700, P:250, compuestos, x})

Por lo tanto, la temperatura de burbuja para esa mezcla es de 670.48 R, o 99.34 °C:

Qty(Tb,"tempR").to("tempC").scalar.round(2)

De igual forma, la presión de burbuja (en psi) para la misma mezcla, a una temperatura de 610 R, asumiendo una presión de burbuja inicial de 170 psi, es:

pBurbujaMW({Pi:170, T:610, compuestos, x})

En el punto de rocío, se debe cumplir:

\[ \sum_{i=1}^{n}{\dfrac{y_i}{K_i}}-1 = \sum_{i=1}^{n}{x_i}-1=0 \]

En las funciones que calculan el punto de rocío, se hace que, variando la temperatura o la presión, esta expresión sea cierta, es decir que la sumatoria menos 1 sea igual a cero. Con ese fin (para hacer variar la temperatura o la presión, hasta que la igualdad se cumpla) se emplea el método de Newton-Raphson:

function tRocíoMW({Ti, P, compuestos, y}={}) { // Sumatoria de las fracciones molares en la fase líquida, menos 1. a la temperatura T. function sumxi(T) { let s = 0; for (let i=0; i<compuestos.length; i++) { Ki = kMcWilliams({T, P, compuesto:compuestos[i]}); s += y[i]/Ki; } return s-1; } // Resolución la función sumxi, con el método de Newton return sumxi.newton({xi:Ti, err:9}); }

function pRocíoMW({Pi, T, compuestos, y}={}) { // Sumatoria de las fracciones molares en la fase líquida, menos 1, a la presión P. function sumxi(P) { let s = 0; for (let i=0; i<compuestos.length; i++) { Ki = kMcWilliams({T, P, compuesto:compuestos[i]}); s += y[i]/Ki; } return s-1; } // Resolución la función sumxi, con el método de Newton return sumxi.newton({xi:Pi, err:9}); }

Así para calcular la temperatura de rocío, a una presión de 250 psi, con una temperatura de rocío inicial asumida de 750 R, para la misma mezcla de los ejemplos anteriores, sólo que ahora la composición conocida corresponde a la fase gaseosa:

Compuestoyi
Etano0.03
Propano0.20
n-Butano0.37
n-Pentano0.35
n-Hexano0.05

Se escriben las siguientes instrucciones:

compuestos = ["etano", "propano", "n-butano", "n-pentano", "n-hexano"]; y = [0.03, 0.2, 0.37, 0.35, 0.05];
Tr = tRocíoMW({Ti:700, P:250, compuestos, y})
Qty(Tr,"tempR").to("tempC").scalar.round(2)

Igualmente, para la misma mezcla, la presión de rocío, para una temperatura de 740 R, asumiendo una presión de rocío inicial igual a 260 psi, es:

pRocíoMW({Pi:260, T:740, compuestos, y})

Composición líquido vapor - flash adiabático

El cálculo de la composición líquido-vapor, para un flash adiabático, a una temperatura, presión y composición inicial conocidas, empleando la ecuación de McWilliams par el cálculo de las constantes de equilibrio y la ecuación de Rachford-Rice, par el cálculo de la fracción molar de gas en la mezcla (φ = V/F):

\[ \large\sum_{i=1}^{n}\normalsize{\dfrac{z_i(1-K_i)}{1+\phi (K_i-1)}} = 0 \]

Así como las composiciones (una vez conocido el valor de φ):

\[ \begin{aligned} x_i &= \large\sum_{i=1}^{n}\normalsize{\dfrac{z_i}{1+\phi (K_i-1)}}\\[6mm] y_i &= K_i*x_i \end{aligned} \]

Ha sido programado en la función compLVMWR:

function compLVMWR({T, P, compuestos, z}) { // Cálculo de las constantes de equilibrio const K = []; for (compuesto of compuestos) { K.push(kMcWilliams({T, P, compuesto})) } // Ecuación de Rachford-Rice function rachford(phi) { let s = 0; for (let i=0; i<z.length; i++) { s += z[i]*(1-K[i])/(1+phi*(K[i]-1)); } return s; } // Cálculo del parámetro phi const phi = rachford.newton({xi:0.5, err:9}).round(9); // Cálculo de las composiciones líquido-vapor const x = [], y = []; for (let i=0; i<z.length; i++) { x.push(z[i]/(1+phi*(K[i]-1))); y.push(K[i]*x[i]); } // La función devuelve el parámetro phi y las composiciones en las fases líquido - vapor return {phi: phi.round(5), x: x.round(5), y: y.round(5)}; }

En esta función, primero se calculan las constantes de equilibrio para la temperatura (T) y presión (P) dadas, luego, se programa la ecuación de Rachford-Rice y se la resuelve con el método de Newton-Raphson. Finalmente, con las ecuaciones complementarias de Rachford-Rice, se calculan las composiciones en las fases líquido-gas.

Así, para la misma mezcla de los ejemplos anteriores, pero conociendo ahora las fracciones molares iniciales (z), a una temperatura de 720 R y una presión de 250 psi:

Compuestozi
Etano0.03
Propano0.20
n-Butano0.37
n-Pentano0.35
n-Hexano0.05

Se escriben las instrucciones:

compuestos = ["etano", "propano", "n-butano", "n-pentano", "n-hexano"]; z = [0.03, 0.2, 0.37, 0.35, 0.05];
compLVMWR({T:720, P:250, compuestos, z})