Open in CoCalc
print "Problema N° 1" # Valor: 10 puntos # Referencia: Problema 15.D6 Wankat (2008) # ---------------------------------------- # Una columna de destilación trabaja a reflujo total, separando metanol y etanol. # La volatilidad relativa promedio es 1,69. La operación es a 101,3 kPa. # Se obtienen fracciones molares de metanol y_sale = 0,972 y y_entra = 0,016. # # a. Si hay 7,5 m de relleno, determine H_tOG promedio, para ello considere la siguiente expresión del N_tOG. # N_{tOG}= \frac{1}{1- \alpha } \ln \left( \frac{y_{entra}(1-y_{sale})}{y_{sale}(1-y_{entra})} \right)+ \ln \left( \frac{1-y_{entra}}{1-y_{sale}} \right) # b. Compruebe los resultados de la parte a mediante el cálculo gráfico usando un diagrama de McCabe-Thiele. # N_{tOG}= \int_{y_{entra}}^{y_{sale}} \frac{1}{y^{*}-y} \,dy # Para generar la curva de equilibrio se emplea la ecuación: y^{*}= \frac{ \alpha x}{1+\left( \alpha -1\right)x} %var x # Datos del enunciado alfa = 1.69 p_t = 101.3 # kPa y_entra = 0.016 y_sale = 0.972 h_c = 7.5 # m y_eq(x) = alfa*x/(1+(alfa-1)*x) y(x) = x print "Parte a)" N_tOG = 1/(1-alfa) * ln((y_entra*(1-y_sale))/(y_sale*(1-y_entra)))+ln((1-y_entra)/(1-y_sale)) H_tOG = h_c / N_tOG # Muestra el resultado formateado, lo que está entre símbolos de dólar se mostrará en formato matemático, para ello se escribe en LaTeX show (r'$N_{tOG} = \frac{1}{1-\alpha } \ln \left ( \frac{y_{entra} ( 1-y_{sale} )} {y_{sale} (1-y_{entra} )} \right ) + \ln \left (\frac{1-y_{entra}}{1-y_{sale}} \right ) = %s$' %n(N_tOG, digits=4)) show (r'$H_{tOG} = h_c / N_{tOG} = %s$ m' %n(H_tOG, digits=3)) print "Parte b)" plot(y_eq, x, 0, 1, thickness=2, axes_labels=['$x$','$y$'], title = 'Diagrama de McCabe-Thiele', fontsize=16) \ + plot(y, x, 0, 1, color = 'black') \ + line([(0, y_entra), (y_entra, y_entra)]) \ + text('$y_{entra}$', (-0.05, y_entra), fontsize=16) \ + line([(0, y_sale),(y_sale, y_sale)]) \ + text('$y_{sale}$', (-0.05, y_sale), fontsize=16) f = 1/(y_eq-y) N_tOG = integral_numerical(f,y_entra, y_sale)[0] H_tOG = h_c / N_tOG plot(f, y_entra, y_sale, axes_labels=['$y$','$\\frac{1}{(y^*-y)}$'], fill = 'axis', fontsize=16) \ + text('$y_{entra}$', (y_entra, -5), fontsize=16) \ + text('$y_{sale}$', (y_sale, -5), fontsize=16) \ + text('$N_{tOG} = %s$' %n(N_tOG, digits=4), (0.5,50), fontsize=16) \ + text('$H_{tOG} = %s$ m' %n(H_tOG, digits=3), (0.5,40), fontsize=16) integral_numerical(f,y_entra, y_sale) # ***** Final del código *****
Problema N° 1 Parte a)
NtOG=11αln(yentra(1ysale)ysale(1yentra))+ln(1yentra1ysale)=14.67N_{tOG} = \frac{1}{1-\alpha } \ln \left ( \frac{y_{entra} ( 1-y_{sale} )} {y_{sale} (1-y_{entra} )} \right ) + \ln \left (\frac{1-y_{entra}}{1-y_{sale}} \right ) = 14.67
HtOG=hc/NtOG=0.511H_{tOG} = h_c / N_{tOG} = 0.511 m
Parte b)
(14.669839458035776, 1.4712504881271106e-06)
print "Problema N° 2" # Valor: 10 puntos # Referencia: Problema 12.D8 Wankat (2008) # ---------------------------------------- # Se van a procesar 10,9 kmol/h de una solución acuosa concentrada de amoniaco en una columna de arrastre. La alimentación contiene 0,90 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. # # a. Calcule la cantidad de etapas de equilibrio necesarias, incluyendo la fracción. # b. Calcule la tasa mínima de flujo de aire. # Datos del enunciado L_entra = 10.9 # kmol/h L_NH3_entra = 0.90 # kmol/h L_s = 10 # kmol/h x_sale = 0.010 Y_entra = 0 G_s = 9 # kmol/h t = 40 # °C p_t = 100.66 # kPa M_NH3 = 17 M_H2O = 18 M_aire = 29 # Datos de equilibrio X_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 masa p_A = [ 719, 454, 352, 260, 179, 110, 79.7, 51, 40.1, 29.6, 24.4, 19.3, 15.3, 11.5, 0.0] # mmHg # Cálculo de relaciones mol X_entra = L_NH3_entra/L_s X_sale = x_sale/(1-x_sale) # Conversión de datos de equilibrio a relaciones molares Xeq = [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 = 0 n_i = 0 while i <= len(Xeq): if Xeq[i] <= X_entra: n_i=i-1 i = len(Xeq) i += 1 datos_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, m modelo(X) = a1*X+a2*X^2+a3*X^3 ajuste = find_fit(datos_eq, modelo) ajuste Y_eq(X) = modelo(a1=ajuste[0].rhs(),a2=ajuste[1].rhs(),a3=ajuste[2].rhs()) 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_entra Y_sale = Y_op(X_entra) # Cálculo de las etapas ideales XY_etapas = [(X_sale, Y_entra)] # Primer punto de la escalera (X,Y) forget() Xi = X_sale while 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áfica plot (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 limitante Y_op_lim(m, X) = m*X - m*X_sale+Y_entra # Línea de operación en términos de m = Ls/Gs solve(Y_op_lim(m, X)==Y_eq(X), m) # Encuentra los valores de m donde se igualan las ecuaciones m_lim = solve(Y_op_lim(m, X)==Y_eq(X), m)[0].rhs() # Como hay varios puntos devuelve una función de X forget() # Elimina los límites de X puestos anteriormente mX_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áfica plot (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 *****
Problema N° 2 Ajuste de los datos de equilibrio --------------------------------- [a1 == 1.1622481266398468, a2 == 3.584023125602682, a3 == 6.155802797375869]
Y=6.155802797375869X3+3.584023125602682X2+1.1622481266398468XY^* = 6.155802797375869*X^3 + 3.584023125602682*X^2 + 1.1622481266398468*X
Parte a): etapas de equilibrio ------------------------------
Parte b): flujo mínimo de aire ------------------------------ [m == 11/180948813492613392610*(10024966910517068438455*X^3 + 5836722588971025848730*X^2 + 1892766775495436291178*X)/(99*X - 1)]
print "Problema N° 3" # Valor: 10 puntos # Referencia: Problema 10.6-6 Geankoplis (1999) # # Una corriente de gas contiene 4,0 % de NH3 (fracción molar) y su contenido de amoniaco se reduce a 0,5 % en una torre de absorción rellena que opera a 293 K y 1,013*10⁵ 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 F_G a = 0,0739 kmol/(s m³) y F_L a = 0,169 kmol/(s m³). Determine lo siguiente por método gráfico: # # a. Calcule la altura de la torre usando k'ya (FGa). # b. Calcule la altura de la torre usando K'ya (FOGa). y_entra = 0.04 y_sale = 0.005 T = 293 # K p_t = 1.013*10^5 # Pa L_s = 68.0 # kmol/h x_entra = 0 G_entra = 57.8 # kmol/h D_c = 0.747 # m FGa = 0.0739 # kmol/(s m³) FLa = 0.169 # kmol/(s m³) # Datos de equilibrio datos_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, 15, 18.2, 24.9, 31.7, 50.0, 69.6, 114, 166, 227, 298 , 470 ] # mmHg # Conversión de presiones parciales a fracciones molares datos_y_eq = [pA/(p_t*760/101325) for pA in datos_p_NH3] # Datos de equilibrio en relaciones molares datos_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 = 0 n_i = len(datos_y_eq) while i < len(datos_y_eq): if datos_y_eq[i] >= y_entra: n_i=i i = len(datos_y_eq) 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)]) 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, a3 modelo(x) = a1*x + a2*x^2 + a3*x^3 ajuste = find_fit(datos_eq,modelo, solution_dict=True) y_eq(x)=modelo(a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3]) ajuste = find_fit(Datos_eq,modelo, solution_dict=True) Y_eq(X)=modelo(a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3]) # Área de la columna A_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 masa G_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_sale y_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 interfase x_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 = 5 # Cantidad de segmentos para calcular Delta_y Delta_y = (y_entra-y_sale)/n_seg lista_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 (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 err_y = 1 tol = 1e-16 it = 0 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" print "***** Parte (a), usando k'_y a *****" # ***** Gráfica en fracciones molares ***** # Líneas que muestran pendiente -k'x/k'y lxyI = 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) modelo(x) = a0+a1*x+a2*x^2+a3/x ajuste = find_fit(datos_f,modelo, solution_dict=True) f_int(x)=modelo(a0=ajuste[a0], a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3]) 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]+corr show(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_sale,lista_xI[n_seg])*A_c) + G_sale/(3600*kpya(x_entra,lista_xI[0])*A_c))/2 # m h_c = H_tG * N_tG # m show (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 K'_y a *****" # ***** Gráfica en fracciones molares ***** # Líneas verticales lxyI = 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(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]-y_eq(lista_x[i])) for i in range(n_seg+1)] datos_f = zip(lista_y, f) modelo(x) = a0+a1*x+a2*x^2+a3/x ajuste = find_fit(datos_f,modelo, solution_dict=True) f_int(x)=modelo(a0=ajuste[a0], a1=ajuste[a1], a2=ajuste[a2], a3=ajuste[a3]) 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]+corr show( 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))) x_tope = x_entra x_fondo = x_sale xI_tope = lista_xI[0] xI_fondo = lista_xI[n_seg] y_tope = y_sale y_fondo = y_entra yI_tope = lista_yI[0] yI_fondo = lista_yI[n_seg] # *** Verificar estos cálculos *** m_tope = (yI_tope-y_eq(x_tope))/(xI_tope-x_tope) m_fondo = (yI_fondo-y_eq(x_fondo))/(xI_fondo-x_fondo) Kpya_tope = 1/(1/kpya(yI_tope,y_tope)+m_tope/kpxa(xI_tope,x_tope)) Kpya_fondo = 1/(1/kpya(yI_fondo,y_fondo)+m_fondo/kpxa(xI_fondo,x_fondo)) show (r'$m_{tope} = %s, {K^\prime_{y}a}_{tope} = %s$ kmol/(s m³)' %(n(m_tope, digits=4),n(Kpya_tope, digits=4))) show (r'$m_{fondo} = %s, {K^\prime_{y}a}_{fondo} = %s$ kmol/(s m³)' %(n(m_fondo, digits=4),n(Kpya_fondo, digits=4))) H_tOG = (G_entra/(3600*Kpya_fondo*A_c) + G_sale/(3600*Kpya_tope*A_c))/2 # m h_c = H_tOG * N_tOG # m show (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 *************
Problema N° 3
Ac=π4Dc2=0.4383 m2A_c = \frac{\pi}{4} D_c^2 = 0.4383 \text{ m}^2
***** Parte (a), usando k'_y a *****
NtG=ysaleyentra1yyI+12ln1yentra1ysale=4.497+0.018=4.515N_{tG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y_I}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = 4.497 + 0.018 = 4.515
HtG,prom=0.4789 mH_{tG,prom} = 0.4789 \text{ m}
hc=HtGNtG=2.16 mh_{c} = H_{tG} N_{tG} = 2.16 \text{ m}
***** Parte (b), usando K'_y a *****
NtOG=ysaleyentra1yy+12ln1yentra1ysale=3.363+0.018=3.381N_{tOG} = \int_{y_{sale}}^{y_{entra}}{\frac{1}{y-y^*}} + \frac{1}{2} \ln{\frac{1-y_{entra}}{1-y_{sale}}} = 3.363 + 0.018 = 3.381
mtope=0.7007,Kyatope=0.05671m_{tope} = 0.7007, {K^\prime_{y}a}_{tope} = 0.05671 kmol/(s m³)
mfondo=0.8663,Kyafondo=0.05543m_{fondo} = 0.8663, {K^\prime_{y}a}_{fondo} = 0.05543 kmol/(s m³)
HtOG,prom=0.6421 mH_{tOG,prom} = 0.6421 \text{ m}
hc=HtOGNtOG=2.17 mh_{c} = H_{tOG} N_{tOG} = 2.17 \text{ m}