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 pageOn 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 pageOn 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 pageOn 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