Langage Python
1. Représentation de graphiques et diagrammes de distribution⚓︎
L'utilisation d'un langage de programmation en physique-chimie permet de visualiser rapidement des modèles mathématiques et de les confronter aux données expérimentales. Une des capacités numériques attendues est le tracé du diagramme de distribution des espèces d'un couple acide-base.
Diagramme de distribution
Le diagramme de distribution représente les pourcentages (ou fractions molaires) de la forme acide \( \text{AH} \) et de la forme basique \( \text{A}^- \) d'un couple en fonction du pH de la solution.
Les relations utiles sont :
Tracé d'un diagramme de distribution
Compléter l'instruction Python permettant de calculer la liste des pourcentages de la base A_moins connaissant la liste des valeurs de pH, le pKa et la liste de la forme acide AH.
import matplotlib.pyplot as plt
pH = [i*0.1 for i in range(141)]
pKa = 4.8
AH = [100 / (1 + 10**(p - pKa)) for p in pH]
A_moins = [ ... ]
Corrigé
On peut utiliser la relation de conservation de la matière : la somme des pourcentages vaut 100.
A_moins = [100 - acide for acide in AH]
Analyse du graphique
À partir du script précédent, quelles fonctions de la bibliothèque matplotlib.pyplot permettent de tracer le pourcentage de la forme acide en fonction du pH, puis d'afficher le graphique ?
Corrigé
plt.plot(pH, AH, label="% d'acide")
plt.show()
2. Résolution d'équations différentielles par la méthode d'Euler⚓︎
Le programme de Terminale fait largement appel à la méthode d'Euler pour résoudre des équations différentielles issues des bilans d'énergie (thermodynamique), des circuits RC (électricité) ou de la mécanique (chute avec frottements).
La méthode d'Euler
La méthode d'Euler est une méthode numérique itérative. Elle permet de construire la courbe représentative d'une fonction \( y(t) \) connaissant sa condition initiale \( y(t_0) \) et son équation différentielle sous la forme :
On approxime la dérivée pour un petit pas de temps \( \Delta t \) :
Évolution temporelle de la tension (Circuit RC)
Lors de la charge d'un condensateur, l'équation différentielle s'écrit \( \frac{\text{d}u_c}{\text{d}t} = \frac{E - u_c}{RC} \).
Écrire la ligne de code permettant de calculer la nouvelle valeur de la tension uc_nouv à partir de l'ancienne uc, du pas de temps dt et des constantes E, R et C.
Corrigé
uc_nouv = uc + ((E - uc) / (R * C)) * dt
Évolution de la température
Le refroidissement d'un système obéit à la loi de Newton : \( \frac{\text{d}T}{\text{d}t} = -k(T - T_{\text{ext}}) \).
Compléter la boucle for pour générer la liste des températures T comportant N points.
T = [T_initiale]
for i in range(N - 1):
# A compléter
Corrigé
T = [T_initiale]
for i in range(N - 1):
T.append(T[-1] - k * (T[-1] - T_ext) * dt)
3. Tracé de vecteurs en mécanique⚓︎
Le langage Python permet d'exploiter des données de pointage vidéo pour tracer les vecteurs position, vitesse et accélération.
Approximation des vecteurs vitesse et accélération
Dans un tableau de coordonnées \( (x_i, y_i) \), les coordonnées du vecteur vitesse au point \( i \) sont approximées par :
Calcul des coordonnées du vecteur vitesse
On dispose des listes x et y contenant les coordonnées d'un point au cours du temps, et d'un pas de temps dt.
Comment s'écrit le calcul de vx[i] ?
Corrigé
vx.append((x[i+1] - x[i-1]) / (2 * dt))
Tracé d'un vecteur avec Python
Quelle fonction de la bibliothèque matplotlib.pyplot est utilisée pour tracer un vecteur (une flèche) sur un graphique ?
Corrigé
On utilise la fonction plt.quiver(x, y, vx, vy, angles='xy', scale_units='xy', scale=1).
Exercices d'application⚓︎
Exercice 1 : Tracé de cinétique chimique
Un suivi cinétique fournit deux listes : temps (en secondes) et concentration (en mol/L).
Écrire un script Python complet (sans les valeurs exactes des listes) qui importe la bibliothèque nécessaire, trace la concentration en fonction du temps, ajoute des légendes aux axes et affiche le graphique.
Corrigé
import matplotlib.pyplot as plt
# Données expérimentales
temps = [0, 10, 20, 30, 40]
concentration = [0.100, 0.075, 0.055, 0.040, 0.030]
plt.plot(temps, concentration, marker='+', linestyle='-')
plt.xlabel("Temps (s)")
plt.ylabel("Concentration (mol/L)")
plt.title("Suivi cinétique")
plt.grid()
plt.show()
Exercice 2 : Méthode d'Euler pour une chute libre
En chute libre verticale (axe \( z \) orienté vers le bas), l'équation différentielle sur la vitesse est \( \frac{\text{d}v}{\text{d}t} = g \).
Créer une boucle Python permettant de calculer les valeurs de la vitesse v pour 100 itérations avec un pas de temps dt = 0.01 s et \( g = 9,81 \ \text{m.s}^{-2} \). La vitesse initiale est nulle.
Corrigé
g = 9.81
dt = 0.01
v = [0]
for i in range(100):
v_suivante = v[-1] + g * dt
v.append(v_suivante)
Erreurs fréquentes
- Oublier les crochets de liste : En Python, les tableaux de données s'écrivent entre crochets
[]. Une confusion fréquente consiste à utiliser des parenthèses. - Indices dans le calcul des dérivées : Lors du calcul d'une dérivée centrée comme la vitesse, la boucle ne peut pas parcourir le premier (
i=0) ni le dernier élément de la liste, sous peine de déclencher une erreurIndexError : list index out of range. - Indentation : L'intérieur d'une boucle
fordoit impérativement être indenté (décalé vers la droite) pour être exécuté correctement dans l'itération.