SharedTareas / Tarea 2.2 | Absorción y arrastre, cálculo de etapas y altura de relleno.sagews.htmlOpen in CoCalc
Soluciones a Tareas Masa 2
Problema N° 1

Problema N° 1

AuthorEsteban Richmond-Salazar
Date2019-04-08T23:41:26
Projectc8d6174e-82a9-4a2a-ba1f-b0b5a9e871b3
LocationTareas/Tarea 2.2 | Absorción y arrastre, cálculo de etapas y altura de relleno.sagews
Original fileTarea 2.2 | Absorción y arrastre, cálculo de etapas y altura de relleno.sagews

Problema N° 1

Valor: 10 puntos

Referencia: Adaptado de problema 12.D8 Wankat (2008)

Se van a procesar 12 kmol/h de una solución acuosa concentrada de amoniaco en una columna de arrastre. La alimentación contiene 2 kmol/h de amoniaco y 10 kmol/h de agua. Se desea que la corriente de agua a la salida contenga una fracción molar de amonico de 0,010. El gas de arrastre es aire puro, con una tasa de flujo de 9 kmol/h. La operación es a 40 °C y a 100,66 kPa. Suponga que el aire es insoluble, que el agua es no volátil y que el separador de arrastre es isotérmico.

Pesos moleculares: Amoniaco = 17 u, agua = 18 u, aire = 29 u.

Usando el método gráfico:

  1. Calcule la cantidad de etapas de equilibrio necesarias, incluyendo la fracción.
  2. Calcule la tasa mínima de flujo de aire.
# Datos de equilibrioX_W     = [0.40,  0.30, 0.25, 0.20, 0.15, 0.10, 0.075, 0.05, 0.04, 0.03, 0.025, 0.020, 0.016, 0.012, 0.0] # kg/kg, relación masap_A     = [ 719,   454,  352,  260,  179,  110,  79.7,   51, 40.1, 29.6,  24.4,  19.3,  15.3,  11.5, 0.0] # mmHghtml('<h2>Solución</h2>')# Datos del enunciadoL_entra     =  12     # kmol/hL_NH3_entra =   2     # kmol/hL_s         =  10       # kmol/hx_sale      =   0.010Y_entra     =   0G_s         =   9       # kmol/ht           =  40       # °Cp_t         = 100.66    # kPaM_NH3       =  17M_H2O       =  18M_aire      =  29# Cálculo de relaciones molX_entra = L_NH3_entra/L_sX_sale  = x_sale/(1-x_sale)# Conversión de datos de equilibrio a relaciones molaresXeq     = [X_W[i]*M_H2O/M_NH3 for i in range(len(X_W))]Yeq     = [p_A[i]/(p_t*760/101.325 - p_A[i]) for i in range(len(p_A))]# Descarto los datos correspondientes a concentraciones mucho mayores a las de operación para ajustar mejor a un polinomio.i       = 0n_i     = 0while i <= len(Xeq):    if Xeq[i] <= X_entra:        n_i=i-1        i = len(Xeq)    i += 1datos_eq = zip([Xeq[i] for i in range(n_i, len(Xeq))],[Yeq[i] for i in range(n_i, len(Yeq))])print "Ajuste de los datos de equilibrio"print "---------------------------------"# Se definen estas variables para ajustar a un polinomio de 3er grado%var X, a1, a2, a3, mmodelo(X) = a1*X+a2*X^2+a3*X^3ajuste    = find_fit(datos_eq, modelo, solution_dict = True)Y_eq(X)   = modelo(a1=n(ajuste[a1], digits=4), a2=n(ajuste[a2], digits=4), a3=n(ajuste[a3], digits=4))show(r'$Y^* = %s$' %Y_eq(X))print "Parte a): etapas de equilibrio"print "------------------------------"Y_op(X)   =  L_s/G_s*X - L_s/G_s*X_sale+Y_entraY_sale    =  Y_op(X_entra)print "Y_sale = %s mol/mol" %numerical_approx(Y_sale, digits=3)# Cálculo de las etapas idealesXY_etapas =  [(X_sale, Y_entra)]        # Primer punto de la escalera (X,Y)forget()Xi        =  X_salewhile Xi < X_entra:    Yi    =  Y_eq(Xi)    XY_etapas.append((Xi,Yi))         # Guarda el punto (X,Y*)    Xi    =  solve(Y_op(X)==Y_eq(Xi), X, to_poly_solve = True)[0].rhs()    XY_etapas.append((Xi,Yi))         # Guarda el punto (X,Y)N_p       = (len(XY_etapas)-3)/2 +(X_entra-XY_etapas[len(XY_etapas)-2][0])/(XY_etapas[len(XY_etapas)-1][0]-XY_etapas[len(XY_etapas)-2][0])# Gráficaplot (Y_eq, xmin=0, ymin=0, title = 'Relaciones mol', axes_labels = ['$X_{NH_3}$', '$Y_{NH_3}$'], legend_label='Curva de equilibrio', frame=True) \    + plot(Y_op, (X_sale,X_entra), color='red', legend_label='Curva de operac.') \    + scatter_plot(datos_eq, xmax = X_entra, ymax = Y_eq(X_entra)) \    + line([(X_sale, 0), (X_sale, Y_entra), (0, Y_entra)], color='purple') \    + line([(X_entra, 0), (X_entra, Y_eq(X_entra))], color='purple') \    + line(XY_etapas, color='green', legend_label='Etapas') \    + text (r'$N_p = $ %s' %N_p.n(digits=3),((X_entra+X_sale)/1.5,(Y_entra+Y_sale)/4))print "Parte b): flujo mínimo de aire"print "------------------------------"assume(X>=X_sale); assume(X<=X_entra)                # Define los límites de X dónde buscar la relación limitanteY_op_lim(m, X) = m*X - m*X_sale+Y_entra              # Línea de operación en términos de m = Ls/Gsm_lim = solve(Y_op_lim(m, X)==Y_eq(X), m)[0].rhs()   # Como hay varios puntos devuelve una función de Xforget()                                             # Elimina los límites de X puestos anteriormentemX_lim = find_local_minimum(m_lim, X_sale, X_entra)  # Devuelve [m_mín, X(m_mín)]Gs_min = numerical_approx(L_s/mX_lim[0], digits=3)# Gráficaplot (Y_eq, xmin=0, ymin=0, title = 'Flujo limitante', axes_labels = ['$X_{NH_3}$', '$Y_{NH_3}$'], legend_label='Curva de equilibrio', frame=True) \    + plot(Y_op_lim(mX_lim[0], X), (X_sale,X_entra), color='red', legend_label='Curva de operac. limitante') \    + scatter_plot(datos_eq, xmax = X_entra, ymax = Y_eq(X_entra)) \    + line([(X_sale, 0), (X_sale, Y_entra), (0, Y_entra)], color='purple') \    + line([(X_entra, 0), (X_entra, Y_eq(X_entra))], color='purple') \    + text (r'$L_{s}/G_{s,min} = $ %s' %n(mX_lim[0], digits=3),((X_entra+X_sale)/1.5,(Y_entra+Y_sale)/1.5)) \    + text (r'$G_{s,min} = $ %s kmol/h' %Gs_min,((X_entra+X_sale)/1.5,(Y_entra+Y_sale)/2))# ***** Final del código *****

Solución

Ajuste de los datos de equilibrio
---------------------------------
Y=24.26X3+0.5994X2+1.263XY^* = 24.26*X^3 + 0.5994*X^2 + 1.263*X
Parte a): etapas de equilibrio
------------------------------
Y_sale = 0.211 mol/mol
Parte b): flujo mínimo de aire
------------------------------

Problema N° 2

Valor: 15 puntos

Referencia: Problema 10.6-6 Geankoplis (1998)

Una corriente de gas contiene 4,0 % mol de NH3 y su contenido de amoniaco se reduce a 0,5 % mol en una torre de absorción rellena que opera a 293 K y 1,013*105 Pa. El flujo de agua pura de entrada es de 68,0 kmol/h y el flujo total de gas de entrada es de 57,8 kmol/h. El diámetro de la torre es 0,747 m. Los coeficientes de transferencia de masa de película son FGaF_G a = 0,0739 kmol/(s m3) y FLaF_L a = 0,169 kmol/(s m3). Determine lo siguiente por método gráfico:


  1. Calcule la altura de la torre usando coeficientes individuales de transferencia de masa, kyak_y a (FGaF_G a).
  2. Calcule la altura de la torre usando coeficientes globales de transferencia de masa, KyaK_y a (FOGaF_{OG} a).
html('<h2>Solución</h2>')y_entra     =    0.04y_sale      =    0.005T           =  293           # Kp_t         =    1.013*10^5  # PaL_s         =   68.0         # kmol/hx_entra     =    0G_entra     =   57.8         # kmol/hD_c         =    0.747       # mFGa         =    0.0739      # kmol/(s m³)FLa         =    0.169       # kmol/(s m³)# Datos de equilibriodatos_x_eq  =  [0,  0.0208,  0.0258,  0.0309,  0.0405,  0.0503,  0.0737,  0.096,   0.137,   0.175,   0.210,   0.241,   0.297]datos_p_NH3 =  [0, 12.0   , 15.0,    18.2   , 24.9   , 31.7   , 50.0   , 69.6  , 114    , 166    , 227    , 298    , 470    ] # mmHg# Conversión de presiones parciales a fracciones molaresdatos_y_eq  =  [pA/(p_t*760/101325) for pA in datos_p_NH3]# Datos de equilibrio en relaciones molaresdatos_X_eq  =  [x/(1-x) for x in datos_x_eq]datos_Y_eq  =  [pA/(p_t*760/101325-pA) for pA in datos_p_NH3]Y_entra     =  y_entra/(1-y_entra)Y_sale      =  y_sale/(1-y_sale)X_entra     =  x_entra/(1-x_entra)# Descarto los datos correspondientes a concentraciones mucho mayores a las de operación para ajustar mejor a un polinomio.i    =  0n_i  =  len(datos_y_eq)while i < n_i:     #len(datos_y_eq):    if datos_y_eq[i] >= y_entra:        n_i = i        #i = len(datos_y_eq)    i += 1Datos_eq = zip([datos_X_eq[i] for i in range(n_i+1)],[datos_Y_eq[i] for i in range(n_i+1)])datos_eq = zip([datos_x_eq[i] for i in range(n_i+1)],[datos_y_eq[i] for i in range(n_i+1)])# Ajuste de datos de equilibrio a polinomio de 3er grado%var x, X, xI, yI, a0, a1, a2, a3modelo(x) =  a1*x + a2*x^2 + a3*x^3ajuste    =  find_fit(datos_eq, modelo, solution_dict=True)       # En fracciones molaresy_eq(x)   =  modelo(a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3])ajuste    =  find_fit(Datos_eq, modelo, solution_dict=True)       # En relaciones molaresY_eq(X)   =  modelo(a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3])# Área de la columnaA_c       =  pi/4 * D_c^2     # m²show (r'$A_c = \frac{\pi}{4} D_c^2 = %s \text{ m}^2$' %(n(A_c, digits=4)))# Balance de masaG_s       =  G_entra*(1-y_entra)G_sale    =  G_s*(1+Y_sale)Y_op(X)   =  L_s/G_s * X -L_s/G_s * X_entra + Y_saley_op(x)   =  Y_op(x/(1-x))/(1+Y_op(x/(1-x)))X_sale    =  numerical_approx(solve(Y_op(X)==Y_entra, X)[0].rhs())x_sale    =  X_sale/(1+X_sale)# ***** Gráfica en relaciones molares *****plot(Y_op(X), xmin=X_entra, ymin=Y_sale, xmax=X_sale, ymax=Y_entra, legend_label='Curva de operac.', color = 'red') \    + plot(Y_eq(X), xmin=0, ymin=0, xmax=datos_X_eq[n_i], ymax=datos_Y_eq[n_i], title = 'Relaciones mol', axes_labels = ['$X_{NH_3}$', '$Y_{NH_3}$'], legend_label='Curva de equilibrio') \    + scatter_plot(Datos_eq, ymin=0)# Cálculo de las composiciones en la interfasex_BM(xI,xL) = ((1-xL)-(1-xI))/ln((1-xL)/(1-xI))y_BM(yI,yG) = ((1-yG)-(1-yI))/ln((1-yG)/(1-yI))kpxa(xI,xL) = FLa/x_BM(xI,xL)kpya(yI,yG) = FGa/y_BM(yI,yG)n_seg = 4         # Cantidad de segmentos para calcular Delta_y#@interact#def interactive_function(n_seg = slider(start = 3, stop = 20, step = 1, default=10, label = "Cantidad de segmentos")):Delta_y   =  (y_entra-y_sale)/n_seglista_y   =  [y_sale+Delta_y*i for i in range(n_seg+1)]lista_x   =  [find_root(y_op == yop, x_entra, x_sale) for yop in lista_y]lista_xI  =  []lista_yI  =  []# Para cada par (x,y) calcula (xI,yI)for i in range(n_seg+1):    xop = lista_x[i]    yop = lista_y[i]    # Valor preliminar de xI, yI    sol_I =  solve([yI == -FLa/FGa * xI + FLa/FGa * xop + yop, yI == y_eq(xI)], xI,yI, solution_dict = True)    xI0   =  sol_I[0][xI]    yI0   =  sol_I[0][yI]    # Itera para encontrar un mejor estimado de xI, yI    err_x =  1       # Error para x (primer valor es arbitrario)    err_y =  1       # Error para y    tol   =  1e-16   # Tolerancia deseada    it    =  0       # Número de iteraciones    while it < 10 and (err_x > tol or err_y > tol):        it += 1        sol_I = solve([yI == -kpxa(xI0,xop)/kpya(yI0,yop) * xI + kpxa(xI0,xop)/kpya(yI0,yop) * xop + yop, yI == y_eq(xI)], xI,yI, solution_dict = True)        err_x = abs(xI0-sol_I[0][xI])        err_y = abs(yI0-sol_I[0][yI])        xI0   = sol_I[0][xI]        yI0   = sol_I[0][yI]    lista_xI.append(xI0)    lista_yI.append(yI0)    if(it==10): print "Excesivas iteraciones"# Composiciones en los extremosx_tope   =  x_entrax_fondo  =  x_salexI_tope  =  lista_xI[0]xI_fondo =  lista_xI[n_seg]y_tope   =  y_saley_fondo  =  y_entrayI_tope  =  lista_yI[0]yI_fondo =  lista_yI[n_seg]yeq_tope =  y_eq(x_tope)yeq_fondo =  y_eq(x_fondo)xeq_tope  =  find_root(y_eq == y_tope, 0, 1)xeq_fondo =  find_root(y_eq == y_fondo, 0, 1)print "***** Parte (a), usando coeficientes individuales *****"# ***** Gráfica en fracciones molares *****# Líneas que muestran pendiente -k'x/k'ylxyI  =  line([(lista_x[0], lista_y[0]), (lista_xI[0], lista_yI[0])], color = 'gray')for i in range(n_seg):    lxyI = lxyI + line([(lista_x[i+1], lista_y[i+1]), (lista_xI[i+1], lista_yI[i+1])], color = 'gray')show(plot(y_op(x), xmin=x_entra, ymin=y_sale, xmax=x_sale, ymax=y_entra, legend_label='Curva de operac.', color = 'red') \    + plot(y_eq(x), xmin=0, ymin=0, xmax=datos_x_eq[n_i], ymax=datos_y_eq[n_i], title = 'Fracciones mol', axes_labels = ['$x_{NH_3}$', '$y_{NH_3}$'], legend_label='Curva de equilibrio') \    + scatter_plot(datos_eq, ymin=0) \    + lxyI )f = [1/(lista_y[i]-lista_yI[i]) for i in range(n_seg+1)]datos_f    =  zip(lista_y, f)f_int      =  spline(datos_f)integral_f =  numerical_integral(f_int, y_sale, y_entra)corr       =  1/2*ln((1-y_sale)/(1-y_entra))N_tG       =  integral_f[0]+corrshow(plot(f_int, xmin=y_sale, xmax=y_entra, axes_labels = ['$y_{NH_3}$', '$\\frac{1}{y_{NH_3}-y_{NH_3, I}}$'], fill = 'axis') \    + scatter_plot(datos_f) )show (r'$N_{tG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y_I}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = %s + %s = %s$' %(n(integral_f[0], digits=4),n(corr, digits=2),n(N_tG, digits=4)))H_tG  =  (G_entra/(3600*kpya(x_fondo,xI_fondo)*A_c) + G_sale/(3600*kpya(x_tope,xI_tope)*A_c))/2   # mh_c   =  H_tG * N_tG   # mshow (r'$H_{tG,prom} = %s \text{ m}$' %(n(H_tG, digits=4)))show (r'$h_{c} = H_{tG} N_{tG} = %s \text{ m}$' %(n(h_c, digits=3)))print "***** Parte (b), usando coeficientes globales *****"# ***** Gráfica en fracciones molares *****# Líneas verticaleslxyI  =  line([(lista_x[0], lista_y[0]), (lista_x[0], y_eq(lista_x[0]))], color = 'gray')for i in range(n_seg):    lxyI = lxyI + line([(lista_x[i+1], lista_y[i+1]), (lista_x[i+1], y_eq(lista_x[i+1]))], color = 'gray')show(plot(y_op, xmin=x_entra, ymin=y_sale, xmax=x_sale, ymax=y_entra, legend_label='Curva de operac.', color = 'red') \    + plot(y_eq(x), xmin=0, ymin=0, xmax=datos_x_eq[n_i], ymax=datos_y_eq[n_i], title = 'Fracciones mol', axes_labels = ['$x_{NH_3}$', '$y_{NH_3}$'], legend_label='Curva de equilibrio') \    + scatter_plot(datos_eq, ymin=0) \    + lxyI )f = [1/(lista_y[i]-y_eq(lista_x[i])) for i in range(n_seg+1)]datos_f = zip(lista_y, f)f_int      = spline(datos_f)integral_f = numerical_integral(f_int, y_sale, y_entra)corr       = 1/2*ln((1-y_sale)/(1-y_entra))N_tOG      = integral_f[0]+corrshow( plot(f_int, xmin=y_sale, xmax=y_entra, axes_labels = ['$y_{NH_3}$', '$\\frac{1}{y_{NH_3}-y_{NH_3}^*}$'], fill = 'axis') \    + scatter_plot(datos_f))show (r'$N_{tOG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y^*}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = %s + %s = %s$' %(n(integral_f[0], digits=4),n(corr, digits=2),n(N_tOG, digits=4)))# Cálculo del coeficiente globalshow(r'$\frac{1}{F_{OG}} = \frac{1}{F_G} \frac{(1-y_A)_{iM}}{(1-y_A)_{*M}} + \frac{m\prime(1-x_A)_{iM}}{F_L (1-y_A)_{*M}}$')m_tope   =  (yI_tope  - yeq_tope) /(xI_tope  - x_tope )m_fondo  =  (yI_fondo - yeq_fondo)/(xI_fondo - x_fondo)FOGa_tope  = 1/(1/FGa * y_BM(yI_tope, y_tope)/ y_BM(yeq_tope ,y_tope) + m_tope /FLa *x_BM(xI_tope, x_tope) /y_BM(yeq_tope, y_tope) )FOGa_fondo = 1/(1/FGa * y_BM(yI_fondo,y_fondo)/y_BM(yeq_fondo,y_fondo)+ m_fondo/FLa *x_BM(xI_fondo,x_fondo)/y_BM(yeq_fondo,y_fondo))show (r'$m\prime_{tope} = %s$' %(n(m_tope, digits=4)))show (r'$(F_{OG}a)_{tope} = %s$ kmol/(s m³)' %(n(FOGa_tope, digits=4)))show (r'$m\prime_{fondo} = %s$' %n(m_fondo, digits=4))show (r'$(F_{OG}a)_{fondo} = %s$ kmol/(s m³)' %n(FOGa_fondo, digits=4))H_tOG  =  (G_entra/(3600*FOGa_fondo*A_c) + G_sale/(3600*FOGa_tope*A_c))/2  # m, promediando en los extremosh_c    =  H_tOG * N_tOG # mshow (r'$H_{tOG,prom} = %s \text{ m}$' %(n(H_tOG, digits=4)))show (r'$h_{c} = H_{tOG} N_{tOG} = %s \text{ m}$' %(n(h_c, digits=3)))# ****** Final del código ******

Solución

Ac=π4Dc2=0.4383 m2A_c = \frac{\pi}{4} D_c^2 = 0.4383 \text{ m}^2
***** Parte (a), usando coeficientes individuales *****
NtG=ysaleyentra1yyI+12ln1yentra1ysale=4.558+0.018=4.576N_{tG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y_I}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = 4.558 + 0.018 = 4.576
HtG,prom=0.4789 mH_{tG,prom} = 0.4789 \text{ m}
hc=HtGNtG=2.19 mh_{c} = H_{tG} N_{tG} = 2.19 \text{ m}
***** Parte (b), usando coeficientes globales *****
NtOG=ysaleyentra1yy+12ln1yentra1ysale=3.411+0.018=3.429N_{tOG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y^*}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = 3.411 + 0.018 = 3.429
1FOG=1FG(1yA)iM(1yA)M+m(1xA)iMFL(1yA)M\frac{1}{F_{OG}} = \frac{1}{F_G} \frac{(1-y_A)_{iM}}{(1-y_A)_{*M}} + \frac{m\prime(1-x_A)_{iM}}{F_L (1-y_A)_{*M}}
mtope=0.7007m\prime_{tope} = 0.7007
(FOGa)tope=0.05657(F_{OG}a)_{tope} = 0.05657 kmol/(s m³)
mfondo=0.8663m\prime_{fondo} = 0.8663
(FOGa)fondo=0.05370(F_{OG}a)_{fondo} = 0.05370 kmol/(s m³)
HtOG,prom=0.6535 mH_{tOG,prom} = 0.6535 \text{ m}
hc=HtOGNtOG=2.24 mh_{c} = H_{tOG} N_{tOG} = 2.24 \text{ m}