Table des matières Python

Acides en solution aqueuse

1. Acide et base solubles

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 :

AH+H2O=A-+H3O+(1)

La condition d'équilibre en solution diluée idéale s'écrit :

[A-][H3O+][AH]=KA(2)

Il faut aussi considérer la réaction d'autoprotolyse de l'eau :

2H2O=H3O++OH-(3)

dont la condition d'équilibre s'écrit :

[H3O+][OH-]=KE(4)

La molarité de l'acide est une donnée du problème définie par :

C0=[AH]+[A-](5)

Il manque une équation pour déterminer les 4 concentrations inconnues. La condition d'électroneutralité (ou conservation des protons) fournit cette équation :

[OH-]+[A-]=[H3O+](6)

On note h la concentration en ion hydronium. Les équations 2,4,5 et 6 conduisent à :

(h-KEh)(1+hKA)=C0(7)

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)

C0=(10-pH-10-14+pH)(1+10pKA-pH)(8)
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()
             
figA.svgFigure 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")
             
figB.svgFigure 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 :

pH=12(pKA+pC0)(9)

À l'inverse, lorsque la molarité est très faible, l'acide est complètement dissocié et :

pH=pC0

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 :

[A-]C0=11+10-pH+pKA(10)[AH]C0=1-[A-]C0(11)
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")
             
figC.svgFigure pleine page

2. Hydroxyde métallique

On considère la réaction de précipitation d'un hydroxyde métallique :

Mn++nOH-=M(OH)n(s)(12)

La condition d'équilibre s'écrit :

[Mn+][OH-]n=KS(13)

La molarité est :

C0=[Mn+]+nppeV(14)

nppe est le nombre de moles d'hydroxyde précipité.

En l'absence de précipité, l'affinité de la réaction s'écrit :

A=RTln(C0[OH-]nKS)(15)

L'affinité est négative puisqu'il n'y a pas de précipité. Cela conduit à l'inégalité :

[OH-]n<KSC0(16)

ou encore :

pH<14+1n(pC0-pKS)(17)

Pour un pH supérieur à cette valeur, l'affinité est nulle (équilibre) et

[Mnn+]=KS[OH-]n=10-pKS+n(14-pH)(18)

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()
                
figD.svgFigure pleine page
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.