#!/usr/bin/env python # coding: utf-8 # # Résolution d'un bilan matière sur un séparateur # # Nous considérerons un séparateur avec 1 entrée (numérotée 1) et deux sorties (numérotée 2 et 3) fonctionnant avec un mélange binaire de constituants A et B dont les compositions sont données par des fractions, $x_A$ et $x_B$. Les débits globaux sont notés $F_T$ et les partiels, $F_A$ et $F_B$. Si les fractions sont molaires alors les débits devront être exprimés en mole par unité de temps. Si les fractions sont massiques alors les débits devront être exprimés en masse par unité de temps. # # >Le bloc de code ci-dessous permet de dessiner le flowsheet et de faire apparaître les débits globaux et partiels ainsi que les compositions des trois courants. # In[451]: import numpy as np import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', '') #tracé du flowsheet def plot_flowsheet_sd(): fig, ax = plt.subplots(figsize=(5, 5)) xs, ys = 40, 40 #position du separateur lx, ly = 40, 20 #taille du separateur la, hla, hwa=25, 5,5 #taille des fleches ax.set_aspect( 1 ) plt.axis('off') plt.plot([xs,xs+lx,xs+lx,xs,xs],[ys,ys,ys+ly,ys+ly,ys]) plt.plot([xs,xs+lx],[ys,ys+ly],'b--') plt.arrow(xs-la-hla,ys+ly/2,la,0, head_width=hwa, head_length=hla, fc='k', ec='k') plt.arrow(xs+lx/2,ys,0,-la, head_width=hwa, head_length=hla, fc='k', ec='k') plt.arrow(xs+lx/2,ys+ly,0,la, head_width=hwa, head_length=hla, fc='k', ec='k') plt.text(45,48,'Séparateur',c='b', size=15) plt.text(xs-la-hla,ys+ly/2-5, r"$F_{T1}$", size=15) plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$", size=15) plt.text(xs-la-hla,ys+ly/2-15, r"$x_{B1}$", size=15) plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$", size=15) plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$", size=15) plt.text(xs+lx/2+5,ys-15, r"$x_{B2}$", size=15) plt.text(xs+lx/2+5,ys+ly+20-5, r"$F_{T3}$", size=15) plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$", size=15) plt.text(xs+lx/2+5,ys+ly+20-15, r"$x_{B3}$", size=15) plot_flowsheet_sd() #Ecriture des débits partiels plt.text(xs-la-hla,ys+ly/2-25, r"$F_{A1}=F_{T1}~x_{A1}$", color='r',size=12) plt.text(xs-la-hla,ys+ly/2-30, r"$F_{B1}=F_{T1}~x_{B1}$", color='g',size=12) plt.text(xs+lx/2+17,ys-10, r"$F_{A2}=F_{T2}~x_{A2}$", color='r',size=12) plt.text(xs+lx/2+17,ys-15, r"$F_{B2}=F_{T2}~x_{B2}$", color='g',size=12) plt.text(xs+lx/2+17,ys+ly+20-10, r"$F_{A3}=F_{T3}~x_{A3}$", color='r',size=12) plt.text(xs+lx/2+17,ys+ly+20-15, r"$F_{B3}=F_{T3}~x_{B3}$", color='g',size=12) plt.show() # Les équations, permettant de décrire les bilans de matière, sont les suivantes : # # **Bilan sur le débit global** # 1. $F_{T1}=F_{T2}+F_{T3}$ # # **Bilan sur les débits partiels de A et de B** # # 2. $F_{A1}=F_{A2}+F_{A3}$ soit $F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$ # 3. $F_{B1}=F_{B2}+F_{B3}$ soit $F_{T1}x_{B1}=F_{T2}x_{B2}+F_{T3}x_{B3}$ # # **Lien entre les différentes fractions molaires** # # 4. $x_{A1}+x_{B1}=1$ # 5. $x_{A2}+x_{B2}=1$ # 6. $x_{A3}+x_{B3}=1$ # # Il y a donc 6 équations pour 9 inconnues $F_{T1},F_{T2},F_{T3},x_{A1},x_{A2},x_{A3},x_{B1},x_{B2},x_{B3}$. # # Il faut cependant noter que ces équations ne sont pas indépendantes puisque la première est la somme des équations 2 et 3 en considérant les équations 4, 5 et 6. # # Il y a donc seulement **5 équations indépendantes** qui forment un système comportant **9 inconnues**. Il faut donc **fixer 4 variables** pour obtenir une solution unique et déterminer les 5 inconnues à l'aide de 5 équations. # # On fixera dans cet exercice les 4 paramètres suivants : $F_{T1},F_{T3},x_{B1},x_{B2}$. Les 5 équations nous permettront alors de déterminer les 5 inconnues : $F_{T2},x_{A1},x_{A2},x_{A3},x_{B3}$ # # # >Les lignes de codes ci-dessous permettent de visualiser les 4 données fixées et de vérifier si une solution "physique" existe. Si ce n'est pas le cas, un message s'affiche pour vous dire dans quel sens modifier les 4 données pour retomber sur un problème ayant une solution physique. Vous pouvez donc vous exercer en changeant le jeu des 4 paramètres fixés et refaire les calculs. # > # >A noter que si vous choisissez $x_{B1}=x_{B2}$, il s'agit d'un simple diviseur de courant qui ne modifie pas la composition des courants de sortie. # In[445]: #Les 4 paramètres fixés FT1=300 XB1=0.5 XB2=0.7 FT3=100 #Analyse de la cohérence du jeu de données if ((FT1*XB1)-(FT1-FT3)*XB2)/FT3 >1: print ('Attention le jeu de données ne correspond pas à une solution physique') print ('XB3>1, il y a soit :') print (' i) trop de B en entrée (essayez de réduire XB1 ou FT1)' ) print (' ii) pas assez de B en sortie 2 (essayez d augmenter XB2 ou FT2=FT1-FT3)' ) if ((FT1*XB1)-(FT1-FT3)*XB2)/FT3 <0: print ('Attention le jeu de données ne correspond pas à une solution physique') print ('XB3<0, il y a soit :') print (' i) pas assez de B en entrée (essayez d augmenter XB1 ou FT1)' ) print (' ii) trop de B en sortie 2 (essayez de réduire XB2 ou FT2=FT1-FT3)' ) #Tracé des 4 paramètres fixés sur le flowsheet def plot_flowsheet_data(): plt.text(xs-la-hla,ys+ly/2-5, r"$F_{T1}$"+'={}'.format(FT1), size=15) plt.text(xs-la-hla,ys+ly/2-15, r"$x_{B1}$"+'={:.2f}'.format(XB1), size=15) plt.text(xs+lx/2+5,ys-15, r"$x_{B2}$"+'={:.2f}'.format(XB2), size=15) plt.text(xs+lx/2+5,ys+ly+20-5, r"$F_{T3}$"+'={}'.format(FT3), size=15) def plot_flowsheet(): plot_flowsheet_sd() plot_flowsheet_data() plot_flowsheet() plt.show() # > Les blocs suivant permettent d'appliquer les différents bilans pour déterminer l'ensemble des inconnues. Vous pouvez donc exécuter les blocs successivement pour comprendre comment on arrive à déterminer l'ensemble des inconnues. # In[446]: plot_flowsheet() XA1=1-XB1 plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15) plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12) plt.show() # In[447]: plot_flowsheet() XA1=1-XB1 plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15) plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12) XA2=1-XB2 plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15) plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12) # In[448]: plot_flowsheet() XA1=1-XB1 plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15) plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12) XA2=1-XB2 plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15) plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12) FT2=FT1-FT3 plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15) plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12) # In[449]: plot_flowsheet() XA1=1-XB1 plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15) plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12) XA2=1-XB2 plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15) plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12) FT2=FT1-FT3 plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15) plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12) XA3=(FT1*XA1-FT2*XA2)/FT3 plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$"+'={:.2f}'.format(XA3), color='c',size=15) plt.text(0,80, r"$F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$", color='c',size=12) # In[450]: plot_flowsheet() XA1=1-XB1 plt.text(xs-la-hla,ys+ly/2-10, r"$x_{A1}$"+'={:.2f}'.format(XA1), color='r',size=15) plt.text(0,95, r"$x_{A1}+x_{B1}=1$", color='r',size=12) XA2=1-XB2 plt.text(xs+lx/2+5,ys-10, r"$x_{A2}$"+'={:.2f}'.format(XA2), color='b',size=15) plt.text(0,90, r"$x_{A2}+x_{B2}=1$", color='b',size=12) FT2=FT1-FT3 plt.text(xs+lx/2+5,ys-5, r"$F_{T2}$"+'={}'.format(FT2), color='g',size=15) plt.text(0,85, r"$F_{T1}=F_{T2}+F_{T3}$", color='g',size=12) XA3=(FT1*XA1-FT2*XA2)/FT3 plt.text(xs+lx/2+5,ys+ly+20-10, r"$x_{A3}$"+'={:.2f}'.format(XA3), color='c',size=15) plt.text(0,80, r"$F_{T1}x_{A1}=F_{T2}x_{A2}+F_{T3}x_{A3}$", color='c',size=12) XB3=(FT1*XB1-FT2*XB2)/FT3 plt.text(xs+lx/2+5,ys+ly+20-15, r"$x_{B3}$"+'={:.2f}'.format(XB3), color='m',size=15) plt.text(0,75, r"$F_{T1}x_{B1}=F_{T2}x_{B2}+F_{T3}x_{B3}$", color='m',size=12)