SharedTareas / Tarea 3.1 | Problemas de sorción y método LUB.sagewsOpen in CoCalc
Soluciones a Tareas Masa 2

Problema N° 1

Valor: 18 puntos

Referencia: Datos del problema 12.1-1 de Geankoplis (1998)

A continuación se muestran los datos de la isoterma de adsorción de glucosa (en agua) utilizando alúmina.

cc/(g/cm³)
0.0040 0.0087 0.019 0.024 0.094 0.195
qq/(g/g) 0.026 0.053 0.075 0.082 0.123 0.129

q=mglucosa/maluˊminaq = m_{glucosa}/m_{alúmina}

  1. Ajuste a el modelo de Langmuir y Freundlich y justifique cuál de los dos modelos es mejor
  2. Suponga que va a realizar la purificación de 15 L de disolución 1,39 mol/L de glucosa utilizando una etapa con 25 kg de alúmina pura. ¿Cuál es la concentración final de la disolución?
  3. ¿Cuál es la concentración final de la disolución si utiliza 2 etapas a flujo cruzado, en ambas utilizando 25 kg de alumina pura?
  4. ¿Cuál es la cantidad de alúmina en cada etapa que minimiza la cantidad de carbón de la configuración anterior y cuánta alúmina se ahorraría usando el mínimo?
c       =  [0.004, 0.0087, 0.019, 0.024, 0.094, 0.195] # g/cm³, kg/L
q       =  [0.026, 0.053 , 0.075, 0.082, 0.123, 0.129] # g/g, kg/kg

html('<h2>Solución</h2>')

datos_eq = zip(c,q)            # Combina los datos de equilibrio
%var c_A, q_A_max, K_Ac, n

L        =   15         # [L]
c0       =    1.30      # [mol/L]     antes 1.39
M        =  180.1559    # [kg/kmol]
S1       =   20         # [kg]
q0       =    0         # [kg/kg]
S2       =   20         # [kg]

c0       =  c0*M/1000   # [kg/L]

html('<h3>Parte a) Ajustar a el modelo de Langmuir y Freundlich</h3>')

show("===== Isoterma de Langmuir =====")
qA_L(c_A) =  q_A_max*K_Ac*c_A / (1+K_Ac*c_A)
ajuste    =  find_fit(datos_eq, qA_L, solution_dict = True)
qA_L      =  qA_L(q_A_max= numerical_approx(ajuste[q_A_max], digits = 4), K_Ac= numerical_approx(ajuste[K_Ac], digits=4))

show(r"$K_{A,c} = $ ", numerical_approx(ajuste[K_Ac], digits=4), r" L/kg; $q_{A,máx} = $",  numerical_approx(ajuste[q_A_max], digits=4), " kg/kg")
show("$q_{A_L} = $", qA_L)

show("===== Isoterma de Freundlich =====")
qA_F(c_A) =  K_Ac*c_A^(1/n)
ajuste    =  find_fit(datos_eq, qA_F, solution_dict = True)
qA_F      =  qA_F(n= numerical_approx(ajuste[n], digits=4), K_Ac=numerical_approx(ajuste[K_Ac], digits=4))

show(r"$K_{A,c} = $ ", numerical_approx(ajuste[K_Ac], digits=4), r" L/kg; $n = $",  numerical_approx(ajuste[n], digits=4))
show("$q_{A_F} = $", qA_F)

# Gráfica
gr_datos  =  scatter_plot(datos_eq, axes_labels = ['$c_A$', '$q_A$'])
gr_Langm  =  plot(qA_L, xmin = 0, xmax = max(max(c),c0), legend_label = 'Langmuir', color = 'blue')
gr_Frlch  =  plot(qA_F, xmin = 0, xmax = max(c), legend_label = 'Freundlich', color = 'green')

show(gr_datos+gr_Langm+gr_Frlch)

html('<h3>Parte b) Una etapa</h3>')

def Calcula_etapa(W_L, W_S, c_entra, q_entra, q_isot):
    R.<c_sale> = QQ[]
    q_sale     = q_isot(c_sale)
    f          = c_sale - (W_S/W_L * (q_entra - q_sale) + c_entra)
    csale      = find_root(f, 0, c_entra)
    return [csale, q_sale(c_sale=csale)]


c1, q1    =  Calcula_etapa(L, S1, c0, q0, qA_L)

show (r'$c_1 = %s$ kg/L; $q_1 = %s$ kg/kg' %(numerical_approx(c1, digits = 3), numerical_approx(q1, digits=3)))

html('<h3>Parte c) Dos etapas a flujo cruzado, idénticas cantidades de sólido</h3>')

c2, q2    =  Calcula_etapa(L, S2, c1, q0, qA_L)
show (r'$c_2 = %s$ kg/L; $q_2 = %s$ kg/kg' %(numerical_approx(c2, digits = 3), numerical_approx(q2, digits=3)))

gr_etapa1 =  line([(c0,q0),(c1,q1),(c1,0)], color = 'purple', legend_label = 'Etapa 1')
gr_etapa2 =  line([(c1,q0),(c2,q2),(c2,0)], color = 'magenta', legend_label = 'Etapa 2')
show(gr_datos+gr_Langm+gr_etapa1+gr_etapa2)

html('<h3>Parte d) Dos etapas a flujo cruzado, calcular sólido mínimo</h3>')

S1m       =  L*(c0-c_A)/(qA_L(c_A) + q0)    # Alúmina requerida en la etapa 1 para obtnener una concentración c_A
S2m       =  L*(c_A-c2)/(qA_L(c_A=c2) + q0)     # Alúmina requerida en la etapa 2 con una concentración de entrada c_A
STm       =  S1m+S2m     # Alúmina total
S_Tm, c1  =  find_local_minimum(STm, c2, c0)
show (r"$S_{T}$ /kg $=$", STm)
show (r"$S_{T, mín}= %s$ kg; $c_{1}= %s$ kg/L" %(numerical_approx(S_Tm, digits=3), numerical_approx(c1, digits=3)))
show (r"$Ahorro = %s $ kg" %(numerical_approx(((S1+S2)-S_Tm), digits=3)))
show (r"$S_{1}= %s$ kg; $S_{2}= %s$ kg" %(numerical_approx(S1m(c1), digits=3), numerical_approx(S2m(c1), digits=3)))



html('<h3>Parte e) Una etapa con total obtenido en d)</h3>')

c1, q1    =  Calcula_etapa(L, S_Tm, c0, q0, qA_L)

show (r'$c_1 = %s$ kg/L; $q_1 = %s$ kg/kg' %(numerical_approx(c1, digits = 3), numerical_approx(q1, digits=3)))

# *** Final del código ***


Solución

Parte a) Ajustar a el modelo de Langmuir y Freundlich

===== Isoterma de Langmuir =====
KA,c=K_{A,c} = 61.43\displaystyle 61.43 L/kg; qA,maˊx=q_{A,máx} = 0.1413\displaystyle 0.1413 kg/kg
qAL=q_{A_L} = 8.678cA61.43cA+1\displaystyle \frac{8.678 \, c_{A}}{61.43 \, c_{A} + 1}
===== Isoterma de Freundlich =====
KA,c=K_{A,c} = 0.2282\displaystyle 0.2282 L/kg; n=n = 3.312\displaystyle 3.312
qAF=q_{A_F} = 0.2282cA0.3019\displaystyle 0.2282 \, c_{A}^{0.3019}

Parte b) Una etapa

c1=0.0783c_1 = 0.0783 kg/L; q1=0.117q_1 = 0.117 kg/kg

Parte c) Dos etapas a flujo cruzado, idénticas cantidades de sólido

c2=0.00939c_2 = 0.00939 kg/L; q2=0.0517q_2 = 0.0517 kg/kg

Parte d) Dos etapas a flujo cruzado, calcular sólido mínimo

STS_{T} /kg == 0.1152(61.43cA+1)(15cA3.51304005000000)cA+290.3cA2.725\displaystyle -\frac{0.1152 \, {\left(61.43 \, c_{A} + 1\right)} {\left(15 \, c_{A} - 3.51304005000000\right)}}{c_{A}} + 290.3 \, c_{A} - 2.725
ST,mıˊn=37.7S_{T, mín}= 37.7 kg; c1=0.0469c_{1}= 0.0469 kg/L
Ahorro=2.32Ahorro = 2.32 kg
S1=26.8S_{1}= 26.8 kg; S2=10.9S_{2}= 10.9 kg

Parte e) Una etapa con total obtenido en d)

c1=0.0237c_1 = 0.0237 kg/L; q1=0.0838q_1 = 0.0838 kg/kg
%html
<h1>
    Problema N° 2
</h1>
<p>
    <strong>Valor: 15 puntos</strong>
</p>
<p>
    <strong>Referencia: Adaptado de Problema 12.3-2 Geankoplis (1998)</strong>
</p>
<p>
    Mediante cribas moleculares se elimina vapor de agua del nitrógeno gaseoso en un lecho relleno a 28.3 °C. La altura de la columna es de 0.268 m y la densidad del lecho es 712.8 kg/m³. La concentración inicial del agua en el sólido es $q_{0} = m_{\mathrm{H_{2}O}}/m_{\mathrm{S}} = 0.01 \text{ kg/kg}$ y la velocidad de masa del nitrógeno gaseoso es de 4052 kg/(m² h).
</p>
<p>
    La concentración inicial de agua en el gas es $Y_0 = m_{\mathrm{H_{2}O}}/m_{\mathrm{N_2}} = 926*10^{-6} \text{ kg/kg}$.</p>
<p>
    A continuación se muestran los datos experimentales</p>
<p>
    Se desea una concentración de salida $Y = 0.02 Y_0$ en el punto de ruptura. Determine:</p>
<ol type = "a">
    <li>Tiempo del punto de ruptura, fracción de la capacidad total usada hasta el punto de ruptura, la altura del lecho sin utilizar, la capacidad de carga de saturación del sólido.
    <li>Si la columna se aumenta a 0.4 m, determine el nuevo tiempo de ruptura.
    <li>Calcule la altura que debería tener el lecho si el tiempo de ruptura se fija en 24 h pero con un flujo de nitrógeno de 6000 kg/(m² h), manteniendo diámetro constante e iguales características del sólido.
</ol>

Problema N° 2

Valor: 15 puntos

Referencia: Adaptado de Problema 12.3-2 Geankoplis (1998)

Mediante cribas moleculares se elimina vapor de agua del nitrógeno gaseoso en un lecho relleno a 28.3 °C. La altura de la columna es de 0.268 m y la densidad del lecho es 712.8 kg/m³. La concentración inicial del agua en el sólido es q0=mH2O/mS=0.01 kg/kgq_{0} = m_{\mathrm{H_{2}O}}/m_{\mathrm{S}} = 0.01 \text{ kg/kg} y la velocidad de masa del nitrógeno gaseoso es de 4052 kg/(m² h).

La concentración inicial de agua en el gas es Y0=mH2O/mN2=926106 kg/kgY_0 = m_{\mathrm{H_{2}O}}/m_{\mathrm{N_2}} = 926*10^{-6} \text{ kg/kg}.

A continuación se muestran los datos experimentales

Se desea una concentración de salida Y=0.02Y0Y = 0.02 Y_0 en el punto de ruptura. Determine:

  1. Tiempo del punto de ruptura, fracción de la capacidad total usada hasta el punto de ruptura, la altura del lecho sin utilizar, la capacidad de carga de saturación del sólido.
  2. Si la columna se aumenta a 0.4 m, determine el nuevo tiempo de ruptura.
  3. Calcule la altura que debería tener el lecho si el tiempo de ruptura se fija en 24 h pero con un flujo de nitrógeno de 6000 kg/(m² h), manteniendo diámetro constante e iguales características del sólido.
html('<h2>Solución</h2>')

# Datos experimentales
lista_t  = [0  , 9  , 9.2,  9.6, 10,  10.4,  10.8,  11.25,  11.5,  12,  12.5,  12.8] # [h]
#lista_t  = [0  , 4  , 4.2,  4.6,  5,   5.4,   5.8,   6.25,   6.5,   7,   7.5,   7.8] # [h]
lista_Y  = [0.6, 0.6, 2.6, 21  , 91, 235  , 418  , 630   , 717  , 855, 906  , 926  ] # [*10^-6 kg/kg]
datos_t_Y  = zip(lista_t, lista_Y)

# Datos adicionales
t       =   28.3      # [°C]
P       =    1        # [atm]
L       =    0.268    # [m]
rho_b   =  712.8      # [kg/m^3]
q_0     =    0.01     # [kg/kg]
G_s     = 4052        # [kg/(m^2 h)]
Y_0     =  926        # [*10^-6 kg/kg]
Y_rup   =    0.02*Y_0 # [*10^-6 kg/kg]

L_parte_b =    0.4  # [m]
t_rupt_c  =   24    # [h]
G_s_c     = 6000    # [kg/(m^2 h)]

# Ajuste de datos
lista_Yn    = [Y/Y_0 for Y in lista_Y]
datos_t_Yn  = zip(lista_t, lista_Yn)

a, b, t   = var('a, b, t')
modelo(t) = Y_0/2 * (1 + erf(a*t-b))
ajuste    = find_fit(datos_t_Y, modelo, initial_guess=[1, max(lista_t)], solution_dict = True)

Y(t)   = modelo(a=ajuste[a], b=ajuste[b])
Y(t)

# Cálculo de tiempos
t_sat   = max(lista_t)
t_ideal = numerical_approx(numerical_integral(1-Y/Y_0, 0, max(lista_t))[0], digits = 4)
t_rupt  = find_root(Y(t) == Y_rup, 0, t_sat)

print "t_rupt  =", numerical_approx(t_rupt, digits = 3), "h"
print "t_ideal =", t_ideal.numerical_approx(digits = 3), "h"
print "t_agot  =", t_sat.numerical_approx(digits = 3), "h"

# Cálculo de fracción sin utilizar
qA_rup = G_s*Y_0*10^-6/(L*rho_b) * numerical_integral(1-Y/Y_0, 0, t_rupt)[0] #+ q_0
print "qA_rupt =", qA_rup.numerical_approx(digits = 3), "kg/kg"
qA_max = G_s*Y_0*10^-6/(L*rho_b) * t_ideal + q_0
print "qA_max  =", qA_max.numerical_approx(digits = 3), "kg/kg"

f_util = qA_rup/qA_max
f_nout = 1-f_util
print "Fracción utilizada =", f_util.numerical_approx(digits = 3)
print "Fracción no utilizada =", f_nout.numerical_approx(digits = 3)

LES = L*f_util
LUB = L*f_nout
print "LUB =", LUB.numerical_approx(digits = 3), "m"

scatter_plot(datos_t_Yn, axes_labels = ["$t/(\mathrm{h})$", ""]) \
    + plot(Y/Y_0, xmin = 0, xmax=15, legend_label = "$Y/Y_0$", color = 'orange') \
    + plot(1-Y/Y_0, xmin = 0, xmax=15, legend_label = "$1-Y/Y_0$", color = 'purple') \
    + plot(unit_step(t-t_ideal), xmax = 15, legend_label = "$1-Y_{ideal}/Y_0$")

print "=== Parte b ==="
LES_b = L_parte_b - LUB
# LES_2/t_rup2 = LES/t_rup
t_rupt_b = LES_b/LES*t_rupt

print "LES =", LES_b.numerical_approx(digits = 3), "m"
print "t_rupt =", t_rupt_b.numerical_approx(digits = 3), "h"

print "=== Parte c ==="
LUB_c = LUB * G_s_c/G_s

# Despejando LES de q_max = m_sat/m_S = (G_s * Y0 * t_ideal)/(A_c * LES * rho_b)

LES_c = G_s*Y_0*10^-6*t_rupt_c/(rho_b*qA_max)
L_c = LES_c + LUB_c

print "Nuevo LUB =", LUB_c.numerical_approx(digits = 3), "m"
print "Nuevo LES =", LES_c.numerical_approx(digits = 3), "m"
print "Nueva L =", L_c.numerical_approx(digits = 3), "m"

# *** Final del código ***

Solución

463*erf(0.9522085536048622*t - 10.389243416543025) + 463 t_rupt = 9.39 h t_ideal = 10.9 h t_agot = 12.8 h qA_rupt = 0.184 kg/kg qA_max = 0.224 kg/kg Fracción utilizada = 0.821 Fracción no utilizada = 0.179 LUB = 0.0478 m
=== Parte b === LES = 0.352 m t_rupt = 15.0 h === Parte c === Nuevo LUB = 0.0708 m Nuevo LES = 0.563 m Nueva L = 0.634 m