Objectif de la fiche : déterminer, à l'aide d'un langage de programmation, le taux d'avancement final de la réaction d'un acide sur l'eau, et l'utiliser pour comparer la force de différents acides.
Cette fiche est autonome : tu n'as besoin d'aucun autre document. Chaque étape contient un script incomplet à compléter, puis à copier-coller dans Thonny (ou dans la console Basthon tout en bas de la page si tu n'as pas Thonny sous la main).
Contexte : une réaction qui ne va pas toujours à son terme
- Mettre un acide
AHdans l'eau conduit à la réactionAH(aq) + H₂O(ℓ) = A⁻(aq) + H₃O⁺(aq). Par exemple, pour l'acide éthanoïque :CH₃COOH(aq) + H₂O(ℓ) = CH₃COO⁻(aq) + H₃O⁺(aq). - Avec un tableau d'avancement, en notant
Cla concentration apportée en acide etVle volume de solution, l'état final est caractérisé par un avancementx_eqtel queQ_r,eq = Ka, oùKa = 10⁻ᵖᴷᵃest la constante d'acidité du couple. - Cette égalité conduit à une équation du second degré en
x_eq. En introduisant le taux d'avancementτ = x_eq / (C·V)(compris entre 0 et 1), cette équation se simplifie et ne dépend plus deV:C·τ² + τ·Ka·C° − Ka·C° = 0, avecC° = 1 mol.L⁻¹la concentration de référence. - Résoudre cette équation revient donc à résoudre un polynôme du second degré
a·τ² + b·τ + c = 0, aveca = C,b = Ka·C°etc = −Ka·C°. C'est ce que tu vas coder.
Résoudre une équation du second degré
- Pour un polynôme
a·x² + b·x + c, le discriminantΔ = b² − 4acdétermine le nombre de racines réelles : aucune siΔ < 0, une seule siΔ = 0, et deux siΔ > 0:x = (−b ± √Δ) / (2a). - La fonction ci-dessous est générale : elle fonctionne pour n'importe quel polynôme du second degré, pas seulement pour notre problème de chimie.
- Complète la fonction
polynome(a,b,c)ci-dessous, qui affiche les racines réelles du polynômea·x² + b·x + cselon le signe du discriminant.
import numpy as np
def polynome(a,b,c):
Delta = float(b**_-_*a*c) # TODO : discriminant
if Delta__:
print("le polynôme n'a pas de racines réelles")
elif Delta___:
if Delta==0:
T=-b/(_*a)
print(T)
if Delta__:
T1=(-b-np.sqrt(_____))/(2*a)
T2=(-b+np.sqrt(_____))/(_*a)
print(T1,T2)
Indice
La première ligne à compléter reprend la définition mathématique du discriminant Δ = b² − 4ac : deux trous seulement (l'exposant de b, et le facteur devant 4ac). Les lignes if Delta<0, elif Delta>=0 et if Delta>0 sont des comparaisons classiques ; on retrouve les mêmes trous pour Delta dans np.sqrt(Delta).
Teste avec l'acide éthanoïque à C = 0,1 mol.L⁻¹ (pKa = 4,8) : polynome(0.1, 10**-4.8, -10**-4.8) doit afficher T1 ≈ −0,0127 (racine négative, sans sens physique ici) et T2 ≈ 0,0125 (le taux d'avancement cherché, soit environ 1,3 %).
Calculer directement le taux d'avancement et le pH
- Pour notre problème de chimie,
a = C > 0etc = −Ka·C° < 0, donc−4ac > 0: le discriminant est toujours strictement positif. Inutile de tester son signe, il y a toujours deux racines réelles. - De ces deux racines, seule
T2(obtenue avec+√Δ) est physiquement acceptable, car un taux d'avancement doit vérifier0 ≤ τ ≤ 1. - Une fois
τconnu, la concentration en ions oxonium à l'équilibre vaut[H₃O⁺]_eq = τ·C, d'oùpH = −log(τ·C/C°).
- Complète la fonction
tau(a,b,c), qui renvoie directement le couple(taux d'avancement, pH), sans avoir besoin de tester le signe du discriminant.
import numpy as np
def tau(a,b,c):
Delta = float(b**_-_*a*c)
# TODO : seule la racine positive nous intéresse ici
T = (-b+np.sqrt(_____))/(_*a)
# TODO : pH à partir du taux d'avancement et de la concentration a
ph = -np.log10(_*_)
return(T,ph)
Indice
Dans tau(a,b,c), l'argument a joue un double rôle : c'est à la fois le premier coefficient du polynôme et, physiquement, la concentration apportée C (puisque C° = 1 mol.L⁻¹). C'est cette même variable a qu'il faut réutiliser dans le calcul du pH.
Toujours pour l'acide éthanoïque à C = 0,1 mol.L⁻¹ : tau(.1, 10**-4.8, -10**-4.8) doit renvoyer environ (0,0125 ; 2,90), ce qui se lit τ = 1,3 % et pH = 2,9.
Balayer plusieurs concentrations avec une boucle
- On veut étudier l'effet de la dilution : recalculer
τet le pH pour tout un ensemble de concentrations, sans relancer la fonctiontauà la main pour chacune. - Une boucle
whilepermet de parcourir les concentrationsC = 10⁻¹, 10⁻², ..., 10⁻⁶ mol.L⁻¹en faisant varier un compteur entieride 1 à 6.
- Complète la fonction
acide(pKa), qui construit et renvoie deux listes : les six taux d'avancementTet les six pH correspondants, pour les concentrationsC = 10⁻¹à10⁻⁶ mol.L⁻¹.
import numpy as np
def acide(pKa):
T = []
ph = []
i = 1
while i__ : # TODO : condition pour parcourir i = 1 à 6
x,y = tau(10**(__),10**(____),-10**(____))
T.append(_)
ph.append(_)
i = i+_
return (T,ph)
Indice
La concentration C de l'itération i est 10**(-i). On la réutilise deux fois dans l'appel à tau : une fois comme premier argument (coefficient a), et une fois cachée dans 10**(-pKa) qui, lui, ne dépend pas de i.
Pour l'acide éthanoïque, acide(4.8) doit renvoyer deux listes de 6 valeurs : les taux d'avancement ≈ [0,0125 ; 0,039 ; 0,118 ; 0,327 ; 0,695 ; 0,944] (croissants, l'acide se dissocie de mieux en mieux quand on dilue), et les pH ≈ [2,90 ; 3,41 ; 3,93 ; 4,49 ; 5,16 ; 6,03].
Comparer la force de plusieurs acides
- Le pKa permet de comparer la force des acides : plus le pKa du couple est faible, plus l'acide est fort, c'est-à-dire plus son taux d'avancement avec l'eau est grand.
- Les acides appartenant à des couples de pKa négatifs ont un taux d'avancement proche de 100 % quelle que soit la concentration : ce sont des acides forts (la transformation est quasi-totale). Les acides de pKa positifs sont dits faibles (transformation non totale).
- Appelle
acide(pKa)pour chacun des acides du tableau ci-dessous, et trace sur un même graphe le taux d'avancementTen fonction de la concentration, pour chaque acide, avec une légende indiquant sa valeur de pKa. - Utilise une échelle logarithmique sur l'axe des concentrations (
plt.xscale('log')) : les concentrations s'étendent sur six ordres de grandeur.
import numpy as np
import matplotlib.pyplot as plt
concentrations = [10**(-i) for i in range(1,7)]
plt.figure()
for pKa in [____, ___, ___, ___, ___]: # TODO : les 5 valeurs de pKa du tableau
T, ph = acide(___) # TODO : appelle acide avec le pKa courant
plt.plot(_______________, _, label='pKa = '+str(pKa)) # TODO : trace T en fonction de la concentration
plt.xscale('log')
plt.xlabel('C (mol/L)') ; plt.ylabel("taux d'avancement")
plt.legend(loc='best')
plt.grid()
plt.show()
| Acide | Couple | pKa |
|---|---|---|
| Acide nitrique | HNO₃ / NO₃⁻ | −1,8 |
| Iodure d'hydrogène | HI / I⁻ | −1,2 |
| Acide dichloroéthanoïque | Cl₂CHCOOH / Cl₂CHCOO⁻ | 1,2 |
| Acide méthanoïque | HCOOH / HCOO⁻ | 3,8 |
| Acide éthanoïque | CH₃COOH / CH₃COO⁻ | 4,8 |
| Chlorure d'ammonium | NH₄⁺ / NH₃ | 9,2 |
Indice
Tu n'es pas obligé d'utiliser les 6 acides du tableau : 5 valeurs de pKa bien choisies, réparties entre les acides forts (pKa négatif) et les acides faibles (pKa élevé), suffisent pour bien voir l'effet sur le graphe.
Les courbes des acides de pKa négatif (acide nitrique, iodure d'hydrogène) restent collées à τ = 1 quelle que soit la concentration : ce sont des acides forts. Les courbes des acides de pKa élevé (chlorure d'ammonium, pKa = 9,2) restent proches de τ = 0 : la transformation reste très limitée, même en diluant beaucoup.
Conclusion
- Le taux d'avancement final
τd'une réaction acide-base se détermine en résolvant une équation du second degré, dont on ne garde que la racine physiquement acceptable (0 ≤ τ ≤ 1). - Un acide est dit fort si la transformation acide-base avec l'eau est quasi-totale (
τ ≈ 1), ce qui correspond à un pKa de couple négatif. Un acide est dit faible si la transformation est non totale, ce qui correspond à un pKa positif. - Le taux d'avancement dépend non seulement du pKa, mais aussi de la concentration apportée : à faible concentration, même un acide qualifié de faible tend à se dissocier presque totalement. Distinguer acides forts et acides faibles sur le seul critère du pKa n'a donc de sens que pour des concentrations usuelles (de l'ordre de
10⁻¹à10⁻² mol.L⁻¹). - Le modèle utilisé ici (une seule réaction acide + eau) atteint ses limites pour les solutions très diluées d'acides faibles, où la réaction d'autoprotolyse de l'eau ne peut plus être négligée — ce qui dépasse le cadre de cette fiche.
Pense-bête — équation du second degré et acide-base
| Δ=b²-4ac | discriminant du polynôme a·x²+b·x+c |
| x=(-b±√Δ)/(2a) | racines réelles quand Δ>0 |
| Ka=10⁻ᵖᴷᵃ | constante d'acidité du couple acide/base |
| τ=x_eq/(C·V) | taux d'avancement, compris entre 0 et 1 |
| pH=-log(τ·C/C°) | pH à partir du taux d'avancement |
| while i<7 : | boucle pour parcourir i = 1, 2, ..., 6 |
Pas de Thonny sous la main ? Utilise Basthon
Ouvrir dans un nouvel onglet ↗Ctrl+V ou Cmd+V) le code copié avec les boutons « Copier le code » ci-dessus, puis appuie sur Entrée pour l'exécuter.