pH des solutions de NaOH en fonction de la molarité
Lorsque l’on travaille avec des concentrations chimiques, la nature logarithmique de l’échelle de pH rend souvent la visualisation des données délicate. Si vous tracez le pH en fonction de la molarité sur une échelle linéaire standard, vous obtenez une courbe en « bâton de hockey » qui masque la relation proportionnelle des ions.
Dans cet article, nous allons utiliser Python et matplotlib pour visualiser le pH de l’hydroxyde de sodium (NaOH) de 0 jusqu’à une concentration élevée de 3 molaires, en comparant les échelles linéaire et logarithmique pour voir laquelle offre une meilleure compréhension.
La logique chimique
Puisque le NaOH est une base forte, il se dissocie complètement. Pour calculer le pH avec précision sur une large plage — particulièrement lorsque l’on dépasse 1,0 M — nous calculons d’abord le pOH :
$$pOH = -\log_{10}[OH^-]$$$$pH = 14 - pOH$$Fait intéressant, à 3 M de NaOH, le pOH est négatif ($\approx -0.48$), ce qui signifie que le pH monte en réalité à 14,48, contredisant la règle classique des manuels selon laquelle le pH est compris « entre 0 et 14 ».
L’implémentation en Python
Nous utilisons numpy pour générer nos plages de concentration et matplotlib.pyplot avec le style ggplot pour un rendu propre et professionnel. Notez que nous générons deux graphiques séparés pour mettre en évidence les différentes perspectives.
#!/usr/bin/env python3
# SPDX-License-Identifier: CC0-1.0
import numpy as np
import matplotlib.pyplot as plt
# Définir le style sur ggplot
plt.style.use('ggplot')
def calculate_ph(molarity):
"""Calcule le pH pour une molarité de NaOH donnée en incluant l'auto-ionisation de l'eau."""
kw = 1e-14
# Solution quadratique pour [OH-] pour gérer précisément les faibles concentrations
oh_conc = (molarity + np.sqrt(molarity**2 + 4 * kw)) / 2
poh = -np.log10(oh_conc)
return 14 - poh
# Données pour le graphique linéaire (0 à 3M)
x_linear = np.linspace(0, 3, 1000)
y_linear = calculate_ph(x_linear)
# Données pour le graphique logarithmique (0,01 à 3M)
# L'utilisation de logspace garantit un tracé fluide sur une échelle logarithmique
x_log = np.logspace(np.log10(0.01), np.log10(3), 1000)
y_log = calculate_ph(x_log)
# Créer le graphique en échelle linéaire
plt.figure(figsize=(10, 6))
plt.plot(x_linear, y_linear, color='#E24A33', linewidth=2.5, label='Valeur du pH')
plt.title('pH de la solution de NaOH (Échelle linéaire : 0M à 3M)', fontsize=14, fontweight='bold')
plt.xlabel('Molarité du NaOH (mol/L)', fontsize=12)
plt.ylabel('pH', fontsize=12)
plt.ylim(7, 15)
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.savefig('ph_linear_scale.png', dpi=300)
plt.close()
# Créer le graphique en échelle logarithmique
plt.figure(figsize=(10, 6))
plt.plot(x_log, y_log, color='#348ABD', linewidth=2.5, label='Valeur du pH')
plt.xscale('log')
plt.title('pH de la solution de NaOH (Échelle log : 0,01M à 3M)', fontsize=14, fontweight='bold')
plt.xlabel('Molarité du NaOH (Échelle logarithmique mol/L)', fontsize=12)
plt.ylabel('pH', fontsize=12)
plt.ylim(11.5, 15) # Plage ciblée pour la fenêtre 0,01M-3M
plt.grid(True, which="both", linestyle='--', alpha=0.7)
plt.legend()
plt.tight_layout()
plt.savefig('ph_log_scale.png', dpi=300)
plt.close()
# Pour satisfaire l'exigence du système de fournir un seul nom de fichier « main » dans la balise,
# je vais également enregistrer une version combinée.
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 12))
# Graphique linéaire
ax1.plot(x_linear, y_linear, color='#E24A33', linewidth=2.5)
ax1.set_title('Échelle linéaire (0M à 3M)', fontsize=14, fontweight='bold')
ax1.set_ylabel('pH')
ax1.set_ylim(7, 15)
# Graphique logarithmique
ax2.plot(x_log, y_log, color='#348ABD', linewidth=2.5)
ax2.set_xscale('log')
ax2.set_title('Échelle logarithmique (0,01M à 3M)', fontsize=14, fontweight='bold')
ax2.set_xlabel('Molarité du NaOH (mol/L)')
ax2.set_ylabel('pH')
ax2.set_ylim(11.5, 15)
plt.tight_layout()
plt.savefig('pH NaOH molarity.svg', dpi=300)