Ce document comporte le tracé de deux diagrammes abordent le calcul du taux de précipitation de deux cations au sein d'un mélange en fonction de la concentration de l'anion :
Une dernière partie propose un prolongement pour déterminer la composition du système à l'état final lors de l'introduction d'une quantité donnée d'ions oxalate dans un mélange d'ions fer(II) $\mathsf{Fe^{2+}}$ et cuivre(II) $\mathsf{Cu^{2+}}$.
Lorsque la solution est saturée en un solide ionique, l'équilibre chimique mettant en jeu le solide ionique et ses ions constitutifs en solution est établi.
Pour savoir si le solide existe, on peut d'abord vérifier que les concentrations du cation et de l'anion vérifient la condition de précipitation. Par exemple, le solide $\mathsf{Ca(OH)_2}$ se forme si $\mathsf{\frac{[Ca^{2+}]\cdot{[HO^-]}^2}{(C°)^3}>K_s}$.
Si le solide existe, alors la solution est saturée et la relation de Guldberg-Waage peut être écrite : \begin{equation}\mathsf{ Ca(OH)_2(s)=Ca^{2+}(aq)+2HO^{-}(aq) \\ K_s=Qr_{eq}=\frac{[Ca^{2+}]_{eq} \cdot {[HO^-]_{eq}}^2}{(C°)^3}} \end{equation}
En se fixant à une valeur de $pH$, il est donc possible de :
La commande linspace
de la bibliothèque numpy
permet de générer une liste d'abscisses.
La bibliothèque matplolib
est utilisée pour tracer des graphiques.
L'utilisateur peut modifier les valeurs des concentrations initiales des cations dans la solution traitée. Le script peut également adapté pour traiter le cas d'autres hydroxydes métalliques à condition d'adapter les expressions des équations à résoudre en fonction de la stoechiométrie des sels ioniques et de modifier les valeurs des produits de solubilité.
#%%# PRECIPITATION D'HYDROXYDES SELON LE pH
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as op
#Saisie des valeurs des produits de solubilité
pKs1=5.3 #hydroxyde de calcium
pKs2=10.8 #hydroxyde de magnésium
#Concentrations des ions dans le mélange initial
CCa=0.001 #ions calcium, en mol/L
CMg=0.05 #ions magnésium, en mol/L
#Création d'une liste de valeurs d'abscisses, ici pH
pH=np.linspace(0,14,100)
#Boucles de calcul des concentrations d'ions non précipités selon la valeur du pH
fCa=[]
fMg=[]
for x in pH :
if CCa*10**(2*(x-14))>10**(-pKs1) :
fCa.append(10**(-pKs1-2*x+28)/CCa)
else :
fCa.append(1)
for x in pH :
if CMg*10**(2*(x-14))>10**(-pKs2) :
fMg.append(10**(-pKs2-2*x+28)/CMg)
else :
fMg.append(1)
#Tracé des courbes
plt.figure(1)
plt.plot(pH,fCa,'b--', label='Proportion de calcium')
plt.plot(pH,fMg,'g--', label='Proportion de magnésium')
plt.xlabel('pH')
plt.ylabel('Proportions')
plt.title('Proportion des ions calcium et magnésium non précipités')
plt.legend()
plt.grid()
plt.show()
Le $\mathsf{pH}$ nécessaire pour entraîner la formation de l'hydroxyde de magnésium est inférieur à celui nécessaire pour former l'hydroxyde de calcium. Ainsi, dans le cadre d'une détermination de la dureté d'une eau, il est possible, en choisissant convenablement la valeur du $\mathsf{pH}$, d'entraîner la précipitation de la quasi-totalité des ions magnésium(II) sans précipiter les ions calcium(II). Le mélange alors filtré est épuré des ions magnésium : un titrage exclusif des ions calcium peut alors être effectué.
Le principe est identique à celui présenté précédemment à la différence que la stoechiométrie des sels est cette fois 1:1.
Le script est écrit pour prévoir la proportion des ions cuivre(II) et fer(II) qui devraient précipiter dans le cas du traitement d'un mélange de ces ions ($\mathsf{25 mL}$ d'une solution acidifiée à $\mathsf{pH = 2,5}$ de sulfate de cuivre et de sel de Mohr à $\mathsf{0,5 mol \cdot L^{-1}}$) par $\mathsf{30 mL}$ d'une solution d'oxalate d'ammonium à $\mathsf{0,5 mol \cdot L^{-1}}$).
Les propriétés acides et basiques des différentes espèces sont négligées.
De telles précipitations sont mises en jeu dans les opérations de récupération de métaux lourds lors du traitement de batteries, notamment NiMH.
L'utilisateur peut modifier les valeurs des concentrations initiales des cations dans la solution traitée. Le script peut également adapté pour traiter le cas d'autres oxalates métalliques à condition d'adapter les expressions des équations à résoudre en fonction de la stoechiométrie des sels ioniques et de modifier les valeurs des produits de solubilité.
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as op
#Saisie des valeurs des produits de solubilité
pKs1=9.35 #oxalate de cuivre
pKs2=4.73 #oxalate de fer
"""Saisie des caractéristiques du mélange"""
# Caractéristiques de l'effluent à traiter
CCu=0.5 #ions cuivre(II) en mol/L
CFe=0.5 #ions fer(II) en mol/L
Veff = 0.025 #volume de l'effluent en L
# Caractéristiques de la solution traitante
COx=0.5 #ions oxalate en mol/L
VOx=0.030 #volume de la solution traitante en L
"""Calcul des quantiés de matière et du volume total"""
NCu = CCu * Veff
NFe = CFe * Veff
NOx = COx * VOx
V = Veff + VOx
"""Calcul des proportions des cations non précipités"""
pOx=np.linspace(0,11,100)
fCu=[]
fFe=[]
#Calcul de la concentration en ions calcium libre selon la valeur du pOx
for x in pOx :
if NCu/V*10**(-x)>10**(-pKs1) :
fCu.append(10**(-pKs1)*10**x/(NCu/V))
else :
fCu.append(1)
#Calcul de la concentration en ions magnésium libre selon la valeur du pOx
for x in pOx :
if NFe/V*10**(-x)>10**(-pKs2) :
fFe.append(10**(-pKs2)*10**x/(NFe/V))
else :
fFe.append(1)
"""Tracé des courbes de distribution"""
plt.figure(2)
plt.plot(pOx,fCu,'b--', label='Proportion de cuivre(II)')
plt.plot(pOx,fFe,'g--', label='Proportion de fer(II)')
plt.xlabel('pOx')
plt.ylabel('Proportions')
plt.title('Proportion des ions cuivre et fer non précipités')
plt.legend()
plt.grid()
plt.show()
La quantité de matière d'ions oxalate nécessaire pour entraîner la formation de l'oxalate de cuivre est inférieure à celle nécessaire pour former l'oxalate de fer. En choisissant convenablement la valeur de $\mathsf{pOx}$, il est possible de précipiter la quasi-totalité des ions cuivre(II) sans précipiter les ions fer(II). Cette technique de séparation s'appelle précipitation sélective.
Le script précédent renseigne sur les proportions de cations précipités en fonction de la valeur de $\mathsf{pOx}$ vers laquelle relaxe le système. En effet, elle indique la valeur de la concentration de ces ions à l'état final d'équilire, et non la quantité de matière à introduire.
Le script suivant recherche donc les concentrations des espèces à l'état final pour une quantité de matière d'ions oxalate introduite.
Deux réactions sont susceptibles de modéliser le système : \begin{equation}\mathsf{ Fe^{2+}(aq)+Ox^{2-}(aq)=FeOx(s) \\ Cu^{2+}(aq)+Ox^{2-}(aq)=CuOx(s) } \end{equation}
Selon la quantité apportée des ions oxalate et celles des ions fer(II) et cuivre(II) dans l'effluent à traiter, plusieurs situations peuvent être rencontrées :
La recherche de l'état final nécessite donc d'abord de déterminer quel(s) solides sont formés.
Ensuite, selon le nombre de sels formés, la recherche de l'état final nécessite de rechercher un ou deux valeurs d'avancement :
Le résultat de cette détermination peut être confronté aux courbes de pourcentage des cations non précipités pour valider ou invalider le résultat.
L'utilisateur peut modifier les valeurs des concentrations initiales des cations dans la solution traitée.
#%%#Détermination des conditions optimales de précipitation sélective
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as op
#Saisie des valeurs des produits de solubilité
pKs1=9.35 #oxalate de cuivre
pKs2=4.73 #oxalate de fer
"""Saisie des caractéristiques du mélange"""
# Caractéristiques de l'effluent à traiter
CCu=0.5 #ions cuivre(II) en mol/L
CFe=0.5 #ions fer(II) en mol/L
Veff = 0.025 #volume de l'effluent en L
# Caractéristiques de la solution traitante
COx=0.5 #ions oxalate en mol/L
VOx=0.030 #volume de la solution traitante en L
"""Calcul des quantiés de matière et du volume total"""
NCu = CCu * Veff
NFe = CFe * Veff
NOx = COx * VOx
V = Veff + VOx
"""Conditions de précipitation"""
NOxlim_Cu=10**(-pKs1)/NCu*V**2
NOxlim_Fe=10**(-pKs2)/NFe*V**2
"""Détermination de la composition à l'état final"""
# Cas 1 : il n'y a pas assez d'oxalate pour former un précipité
if NOx < min(NOxlim_Cu,NOxlim_Fe) :
NCuf=NCu
NFef=NFe
NOxf=NOx
# Cas 2 : un ou deux précipités se forme(nt). On envisage d'abord que les deux
# solides coexistent à l'état final.
if NOx >= min(NOxlim_Cu,NOxlim_Fe) :
def EF(x) :
return x**2 + (NCu+NFe-NOx)*x - (10**(-pKs1)+10**(-pKs2))*V**2
NOxhyp=op.bisect(EF,0,1)
# L'orientation de la parabole et la valeur en x= 0 de EF(x) est négative.
# On est assuré de l'existence d'un zéro positif unique puisque le
# discriminant est supérieur au coefficient de degré 1.
NCuhyp=10**(-pKs1)/NOxhyp*V**2
NFehyp=10**(-pKs2)/NOxhyp*V**2
if NOxhyp < NOx and NCuhyp < NCu and NFehyp < NFe :
#toutes les espèces sont présentes à l'état final
NOxf=NOxhyp
NCuf=NCuhyp
NFef=NFehyp
else :
#l'une des espèces ne peut exister
if NOxlim_Cu < NOxlim_Fe :
#L'oxalate de cuivre précipite mais pas l'oxalate de fer
def EFCu(x) :
return (NCu-x)*(NOx-x)-10**(-pKs1)*V**2
xf=op.bisect(EFCu,0,NCu)
NFef=NFe
NCuf=NCu-xf
NOxf=NOx-xf
if NOxlim_Cu > NOxlim_Fe :
#L'oxalate de fer précipite mais pas l'oxalate de cuivre
def EFFe(x) :
return (NFe-x)*(NOx-x)-10**(-pKs2)*V**2
xf=op.bisect(EFFe,0,NFe)
NFef=NFe-xf
NCuf=NCu
NOxf=NOx-xf
# Le script précédent peut être simplifié si l'on souhaite d'abord faire
# réfléchir les étudiants sur le cas pertinent à envisager
# après analyse des courbes de distribution.
"""Affichage de l'état final"""
print("QUANTITES DE MATIERE À L'ÉTAT FINAL : ")
print('Ions cuivre : ',"{:.2e}".format(NCuf),' mol')
print('Ions fer : ',"{:.2e}".format(NFef),' mol')
print('Ions oxalate : ',"{:.2e}".format(NOxf),' mol')
print('')
print("VALEUR DE pOx À L'ÉTAT FINAL : ")
print('pOx_final = ',round(-np.log10((NOxf)/V),1))
print('')
print("EFFICACITE DE LA SEPARATION : ")
print('(',round(100*(1-NCuf/NCu)),' % du cuivre a précipité)')
print('(',round(100*(1-NFef/NFe)),' % du fer a précipité)')