| Hosted by CoCalc | Download
html("<h1>Problema N° 1</h1>") html("<p>A continuación se muestran los datos de la isoterma de adsorción de glucosa (en agua) utilizando alúmina.</p>") 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 show(table(rows=[[numerical_approx(ce, digits=3) for ce in c], [numerical_approx(qe, digits=3) for qe in q]], header_column=['$c$/(kg/L)', '$q$/(kg/kg)'], frame=True)) # q = m_glucosa/m_alúmina # # a. Ajuste a el modelo de Langmuir y Freundlich y justifique cuál de los dos modelos es mejor # b. 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? # c. ¿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? # d. ¿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? datos_eq = list(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] M = 180.156 # [kg/kmol] S1 = 20 # [kg] q0 = 0 # [kg/kg] S2 = 20 # [kg] c0 = c0*M/1000 # [kg/L] html("<h2>parte a) Ajustar a el modelo de Langmuir y Freundlich</h2>") 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("$K_{A,c} = %.4g$ L/kg; $q_{A,máx} = %.4g$ kg/kg" %(ajuste[K_Ac], ajuste[q_A_max])) show("$q_{A_L} = $", qA_L) show("===== Isoterma de Freundlich =====") qA_F(c_A) = K_Ac*c_A^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("$K_{A,c} = %.4g$ L/kg, $n = %.4g$" %(ajuste[K_Ac], ajuste[n])) 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("<h2>parte b) Una etapa</h2>") def Calcula_etapa(W_L, W_S, c_entra, q_entra, isoterma): R.<c_sale> = QQ[] q_sale = isoterma(c_A=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(W_L=L, W_S=S1, c_entra=c0, q_entra=q0, isoterma=qA_L) show (r'$c_1 = %.3g$ kg/L; $q_1 = %.3g$ kg/kg' %(c1, q1)) html("<h2>parte c) Dos etapas a flujo cruzado, idénticas cantidades de sólido</h2>") c2, q2 = Calcula_etapa(W_L=L, W_S=S2, c_entra=c1, q_entra=q0, isoterma=qA_L) show (r'$c_2 = %.3g$ kg/L; $q_2 = %.3g$ kg/kg' %(c2, q2)) 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("<h2>parte d) Dos etapas a flujo cruzado, calcular sólido mínimo</h2>") S1m = L*(c0-c_A)/(qA_L + 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) m_ahorro = (S1+S2)-S_Tm show ("$S_{T}$ /kg $=$", STm) show ("$S_{T, mín}= %.3g$ kg; $c_{1}= %.3g$ kg/L" %(S_Tm, c1)) show (r"$Ahorro = %.1f $ kg (%.3g kg/(100 kg))" %(m_ahorro, m_ahorro/(S1+S2)*100)) show ("$S_{1}= %.3g$ kg; $S_{2}= %.3g$ kg" %(S1m(c_A=c1), S2m(c_A=c1))) gr_etapa1 = line([(c0,q0),(c1,qA_L(c_A=c1)),(c1,0)], color = 'purple', legend_label = 'Etapa 1 opt') gr_etapa2 = line([(c1,q0),(c2,q2),(c2,0)], color = 'magenta', legend_label = 'Etapa 2 opt') show(gr_datos+gr_Langm+gr_etapa1+gr_etapa2) # *** Final del código ***

Problema N° 1

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

(c_A, q_A_max, K_Ac, n)

parte a) Ajustar a el modelo de Langmuir y Freundlich

===== Isoterma de Langmuir =====
KA,c=61.43K_{A,c} = 61.43 L/kg; qA,maˊx=0.1413q_{A,máx} = 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=0.2282K_{A,c} = 0.2282 L/kg, n=0.3019n = 0.3019
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.51304200000000)cA+290.3cA2.725\displaystyle -\frac{0.1152 \, {\left(61.43 \, c_{A} + 1\right)} {\left(15 \, c_{A} - 3.51304200000000\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.3Ahorro = 2.3 kg (5.79 kg/(100 kg))
S1=26.8S_{1}= 26.8 kg; S2=10.9S_{2}= 10.9 kg
print "Problema N° 2" # Referencia: Problema 17.D3 Wankat (2008) # # Una columna cromatográfica está rellena con una resina de intercambio iónico en su forma de calcio. La columna mide 0,75 m y la velocidad superficial es de 15 cm/min. A la columna se le alimenta una disolución de glucosa de 75 g/L, después de 2 min la concentración cambia a 100 g/L de glucosa. Encuentre el perfil de concentración de salida (idealizado) de la columna. cA = var('cA') L = 75 # [cm] u_s = 15 # [cm/min] t1 = 0 # [min] c1 = 75 # [g/L] t2 = 2 # [min] c2 = 100 # [g/L] # Datos adicionales eps_p = 0 eps_e = 0.4 rho_S = 2 # [kg/L] qA = 0.51*cA Kd = 1 # supuesto t0 = 0 # [min] c0 = 0 # [g/L] print "Usando modelo para onda de choque" DqDc (c_antes, c_desp) = (qA(c_desp)-qA(c_antes))/(c_desp-c_antes) u_inter = u_s / eps_e uA(c_antes,c_desp) = u_inter/(1 + (1-eps_e)/eps_e * Kd + (1-eps_e)*(1-eps_p)/eps_e * rho_S * DqDc(c_antes,c_desp)) u_sh1 = uA(c0, c1) u_sh2 = uA(c1, c2) t_s1 = t1 + L/u_sh1 t_s2 = t2 + L/u_sh2 line([(t0, c0),(t1,c0),(t1,c1),(t2,c1),(t2,c2),(t_s2,c2)], xmax = t_s2+2, axes_labels=['$t$/min','$c_F$/(g/L)']) show ("$u_{sh1} = $", numerical_approx(u_sh1, digits=4), " cm/min; $u_{sh2} = $", numerical_approx(u_sh2, digits=4), " cm/min") if(t_s1 <= t_s2): show("Las ondas de choque no coinciden") gr_onda1 = line([(t0,0),(t1,0),(t_s1, L)], legend_label='Onda de choque 1') gr_onda2 = line([(t0,0),(t2,0),(t_s2, L)], legend_label='Onda de choque 2', axes_labels=['$t$/min','$L$/cm'], color = 'green', xmax = t_s2+2,) gr_perfil = line([(t0,c0),(t_s1,c0),(t_s1,c1)]) + line([(t_s1,c1),(t_s2,c1),(t_s2,c2),(t_s2+2,c2)], axes_labels=['$t/\mathrm{min}$','$c_{sale}/\mathrm{(g/L)}$']) show(gr_onda1+gr_onda2) else: show("Las ondas de choque coinciden y se genera una tercera") t_inter = t2*u_sh2/(u_sh2-u_sh1) z_inter = u_sh1*t_inter u_sh3 = uA(c0, c2) show ("$u_{sh3} = $", numerical_approx(u_sh3, digits=4), " cm/min; $t_{inter} = $", numerical_approx(t_inter, digits=4), " min; $z_{inter} = $", numerical_approx(z_inter, digits=4), " cm") t_s3 = t_inter+(L-z_inter)/u_sh3 gr_onda1 = line([(t0,0),(t1,0),(t_inter, z_inter)], legend_label='Onda de choque 1') gr_onda2 = line([(t0,0),(t2,0),(t_inter, z_inter)], legend_label='Onda de choque 2', color = 'green') gr_onda3 = line([(t_inter,z_inter),(t_s3, L)], legend_label='Onda de choque 3', color = 'red', axes_labels=['$t$/min','$L$/cm'], xmax = t_s3+2) gr_perfil = line([(t0,c0),(t_s3,c0),(t_s3,c1),(t_s3+2,c1)], axes_labels=['$t/\mathrm{min}$','$c_{sale}/\mathrm{(g/L)}$']) show(gr_onda1+gr_onda2+gr_onda3) show(gr_perfil)
Problema N° 2 Usando modelo para onda de choque
ush1=u_{sh1} = 9.305\displaystyle 9.305 cm/min; ush2=u_{sh2} = 9.305\displaystyle 9.305 cm/min
Las ondas de choque no coinciden