On considère un acide de Bronsted AH et sa base conjuguée A- en solution aqueuse, les deux étant solubles. La réaction de l'acide avec l'eau s'écrit :
La condition d'équilibre en solution diluée idéale s'écrit :
Il faut aussi considérer la réaction d'autoprotolyse de l'eau :
dont la condition d'équilibre s'écrit :
La molarité de l'acide est une donnée du problème définie par :
Il manque une équation pour déterminer les 4 concentrations inconnues. La condition d'électroneutralité (ou conservation des protons) fournit cette équation :
On note h la concentration en ion hydronium. Les équations 2,4,5 et 6 conduisent à :
Il s'agit d'une équation polynomiale de degré 3 pour l'inconnue h. Au lieu de chercher à résoudre directement cette équation, on calcule la molarité en fonction du pH (avec KE=10-14)
import numpy import math from matplotlib.pyplot import *
def pC0(pka,ph): return -math.log10((10**(-ph)-10**(-14+ph))*(1+10**(-ph+pka)))
Voyons par exemple pKA=5. On échantillonne l'intervalle [0,7] des valeurs de pH pour tracer la courbe :
pka=5 ph = numpy.arange(0,7,0.01) n=len(ph) pc = numpy.zeros(n) for k in range(n): pc[k] = pC0(pka,ph[k]) plot(pc,ph) xlabel('pC') ylabel('pH') grid()Figure pleine page
On limitera le tracé à pC>0. La diagramme de Flood est obtenu en faisant varier le pKA :
figure(figsize=(12,10)) for pka in range(0,14,2): for k in range(n): pc[k] = pC0(pka,ph[k]) plot(pc,ph,label="pKa = %d"%pka) axis([0,10,0,7]) xlabel('pC') ylabel('pH') grid() legend(loc="lower right")Figure pleine page
On repère sur ce diagramme les zones où la dissociation de l'acide est très faible, ce qui correspond à l'approximation :
À l'inverse, lorsque la molarité est très faible, l'acide est complètement dissocié et :
Si pC est donné, le pH peut être obtenu avec la méthode de bisection sur l'intervalle [0,7] :
pka=6 pc = 5 def f(x): return pC0(pka,x)-pc import scipy.optimize ph = scipy.optimize.bisect(f,0,6.99)
print(ph) --> 5.568041375016831
Le diagramme de répartition de l'acide et sa base conjuguée est obtenu avec les deux équations suivantes :
def base(pka,ph): return 1.0/(1+10**(-ph+pka)) ph = numpy.arange(0,14,0.1) n=len(ph) b=numpy.zeros(n) a=numpy.zeros(n) pka=5 for k in range(n): b[k] = 100*base(pka,ph[k]) a[k]=100-b[k] figure(figsize=(10,6)) plot(ph,a,label="AH") plot(ph,b,label="A-") xlabel("pH") ylabel("%") grid() legend(loc="upper right")Figure pleine page
On considère la réaction de précipitation d'un hydroxyde métallique :
La condition d'équilibre s'écrit :
La molarité est :
où nppe est le nombre de moles d'hydroxyde précipité.
En l'absence de précipité, l'affinité de la réaction s'écrit :
L'affinité est négative puisqu'il n'y a pas de précipité. Cela conduit à l'inégalité :
ou encore :
Pour un pH supérieur à cette valeur, l'affinité est nulle (équilibre) et
La fonction suivante calcule la concentration de l'ion métallique en fonction du pH :
def CMetal(pks,pc0,nn,ph): if ph<14.0+(pc0-pks)/nn: return 10**(-pc0) else: return 10**(-pks+nn*(14-ph))
Pour obtenir le diagramme de solubilité, on trace cette concentration en fonction du pH, avec comme exemple l'hydroxyde Cu(OH)2 pour lequel pKS=20, avec pC0=2 et pC0=3 :
cM1 = numpy.zeros(n) cM2 = numpy.zeros(n) pc0_1=2.0 pc0_2=3.0 pks=20.0 nn=2 for k in range(n): cM1[k] = CMetal(pks,pc0_1,nn,ph[k])/10**(-pc0_1) cM2[k] = CMetal(pks,pc0_2,nn,ph[k])/10**(-pc0_2) figure(figsize=(10,6)) plot(ph,cM1,label="pc0=2") plot(ph,cM2,label="pc0=3") xlabel('pH') ylabel('cM/c0') legend(loc="upper right") grid()Figure pleine page