Comment mesurer précisément la température de changement d'état d'une espèce, et l'utiliser pour l'identifier ?
Objectifs
- Relever une courbe de refroidissement \(T = f(t)\).
- Repérer un palier et mesurer une température de changement d'état.
- Identifier une espèce chimique à l'aide d'une table de données.
- Automatiser la recherche du palier avec Python.
Compétences travaillées
- Réaliser : suivre un protocole en sécurité, relever des mesures.
- Analyser : exploiter une courbe expérimentale.
- Valider : confronter à une valeur tabulée.
- Communiquer : présenter une courbe légendée.
Le code s'exécute réellement dans ton navigateur. Au premier clic sur ▶ Exécuter, Python se télécharge (≈ 7 Mo, une seule fois, connexion Internet nécessaire). Le bouton Télécharger .py donne un fichier utilisable dans EduPython, Thonny, Basthon ou Capytale.
Raccourcis : Ctrl + Entrée exécute, Tab décale la ligne de 4 espaces.
Débutant en Python : fais les cinq activités dans l'ordre, en t'aidant des indices. À l'aise avec les variables et les boucles (en général à partir du deuxième trimestre) : l'activité 1 est facultative, commence directement à l'activité 2 et vise l'activité 5 sans indice.
Blouse et lunettes obligatoires. Le bain-marie et le tube sont chauds : manipuler le tube avec une pince en bois. L'acide stéarique n'est pas dangereux mais ne doit pas être ingéré.
Matériel
- un tube à essai contenant environ 5 g d'acide stéarique solide ;
- un bécher d'eau chaude à environ 85 °C (bain-marie) ;
- une sonde thermométrique (ou un thermomètre) et un chronomètre ;
- un support et une pince.
Protocole
Jeu de données pédagogique Les programmes contiennent une série de 33 mesures (de 0 à 960 s), construite à partir d'un modèle de refroidissement avec un palier à la température de fusion tabulée de l'acide stéarique, et une petite incertitude de lecture (± 0,1 °C). Remplace-la par tes mesures si tu as fait l'expérience.
La paroi du tube est en contact avec l'air : elle refroidit plus vite que le cœur de l'échantillon. Une sonde contre la paroi mesurerait une température trop basse, non représentative. Pendant le palier, le tube contient un mélange de liquide et de solide : le solide apparaît d'abord sur la paroi puis gagne le centre ; le palier se termine quand tout est solide.
Il calcule l'énergie \(Q = m \times L\) cédée par l'échantillon d'acide stéarique pendant sa solidification, puis la durée du palier si l'acide cède en moyenne 3,0 J chaque seconde à l'air. Pourquoi ? Le palier dure le temps nécessaire pour évacuer cette énergie. Comment lire le résultat ? Une énergie d'environ 1 kJ et une durée de quelques minutes.
Énergie massique de fusion de l'acide stéarique : \(L = 1{,}99\times10^{5}\ \text{J}\cdot\text{kg}^{-1}\).
À faire : complète la conversion de la masse et le calcul de \(Q\), exécute, puis compare la durée calculée à la durée du palier de ta courbe.
m = m_g / 1000 et Q = m * L.m_g = 5.0
L = 1.99e5
puissance = 3.0
m = m_g / 1000
Q = m * L
duree = Q / puissance
print("Q =", Q, "J")
print("durée prévue du palier :", round(duree), "s, soit", round(duree / 60, 1), "min")
Résultats attendus. \(Q = 995\ \text{J}\) ; durée prévue : 332 s, soit 5,5 min.
Interprétation. Le palier observé dure environ 6 min (activité 2) : même ordre de grandeur. La puissance cédée à l'air (3,0 W) est une estimation : elle dépend de la température de la salle et de la forme du tube. Un échantillon plus gros donnerait un palier plus long.
Erreurs fréquentes. Garder la masse en grammes (Q = 995 000 J, durée de plus de 3 jours !).
Il parcourt les mesures deux par deux. Si la température varie de moins de 0,3 °C entre deux mesures consécutives, les deux points appartiennent au palier. Il calcule ensuite la température moyenne du palier et sa durée. Pourquoi 0,3 °C ? C'est un peu plus que l'incertitude de lecture : en dehors du palier, la température baisse de plus de 1 °C en 30 s. Comment lire le résultat ? Les numéros des mesures du palier, sa température et sa durée.
À faire : complète la condition du if, exécute, puis réponds à Q2.
abs(...). La mesure suivante est T[i + 1].if abs(T[i + 1] - T[i]) <= 0.3:dt = 30
T = [82.0, 78.1, 74.4, 71.0, 69.4, 69.4, 69.2, 69.3, 69.4, 69.3, 69.4, 69.2, 69.3, 69.2, 69.3, 69.3, 69.2,
66.1, 63.2, 60.5, 57.9, 55.4, 53.3, 51.0, 49.1, 47.1, 45.4, 43.9, 42.3, 40.8, 39.7, 38.4, 37.1]
palier = []
for i in range(len(T) - 1):
if abs(T[i + 1] - T[i]) <= 0.3:
if i not in palier:
palier.append(i)
palier.append(i + 1)
somme = 0
for i in palier:
somme = somme + T[i]
T_palier = somme / len(palier)
duree = (palier[-1] - palier[0]) * dt
print("mesures du palier :", palier)
print("température du palier :", round(T_palier, 1), "°C")
print("durée du palier :", duree, "s")
Résultats attendus. Mesures 4 à 16 ; température du palier 69,3 °C ; durée 360 s (de 120 s à 480 s).
Interprétation. Le palier dure 6 minutes à 69,3 °C : c'est la température de solidification, égale à la température de fusion. palier[-1] désigne le dernier élément de la liste. La durée vaut (nombre d'intervalles) × 30 s : 13 mesures, mais 12 intervalles.
Erreurs fréquentes. Oublier abs : les variations négatives (−3 °C par exemple) sont toutes « inférieures à 0,3 » et toute la courbe est prise pour un palier ; écrire < 0.3 au lieu de <= 0.3 (on perd les points qui varient d'exactement 0,3 °C).
Pendant le refroidissement, \(T_{i+1} - T_i\) est négatif (−3 °C par exemple) : sans valeur absolue, il serait toujours inférieur à 0,3 et tous les points seraient retenus. Avec un seuil de 0,05 °C, plus petit que l'incertitude de lecture (± 0,1 °C), les fluctuations du palier dépasseraient le seuil : le palier serait découpé ou manqué. Avec 5 °C, des points de la descente (variations de 2 à 3 °C) seraient pris pour le palier. Le seuil doit être un peu supérieur à l'incertitude et nettement inférieur à la variation hors palier.
Il construit la liste des temps, trace la courbe \(T = f(t)\), puis une droite horizontale à la température du palier. Comment le lire ? Trois parties : descente (liquide), palier (liquide + solide), descente (solide).
À faire : complète la construction de la liste t, puis les deux listes de la droite du palier. Ajoute titre, axes avec unités et légende.
i est faite à la date i × 30 s.t[-1].t.append(i * dt) ; plt.plot([0, t[-1]], [T_palier, T_palier], '--', ...).import matplotlib.pyplot as plt
dt = 30
T = [82.0, 78.1, 74.4, 71.0, 69.4, 69.4, 69.2, 69.3, 69.4, 69.3, 69.4, 69.2, 69.3, 69.2, 69.3, 69.3, 69.2,
66.1, 63.2, 60.5, 57.9, 55.4, 53.3, 51.0, 49.1, 47.1, 45.4, 43.9, 42.3, 40.8, 39.7, 38.4, 37.1]
T_palier = 69.3
t = []
for i in range(len(T)):
t.append(i * dt)
plt.plot(t, T, 'o-', color='red', label='mesures')
plt.plot([0, t[-1]], [T_palier, T_palier], '--', color='navy', label='palier : 69,3 °C')
plt.title("Refroidissement de l'acide stéarique")
plt.xlabel("t (s)")
plt.ylabel("T (°C)")
plt.legend()
plt.grid()
plt.show()
Résultat attendu. Une descente rapide de 82 °C à 69 °C, un palier horizontal de 120 s à 480 s, puis une nouvelle descente, plus lente, jusqu'à 37 °C.
Interprétation. Pendant le palier, l'acide cède de l'énergie à l'air sans que sa température baisse : cette énergie provient de la solidification, exothermique. La courbe est celle d'un corps pur.
Erreurs fréquentes. Tracer T en fonction des numéros de mesure (axe des abscisses de 0 à 32, sans unité) ; oublier plt.legend().
La fonction identifier(T_palier) cherche, dans une table, l'espèce dont la température de fusion est la plus proche de la température mesurée. Si l'écart dépasse 2 °C, elle répond qu'aucune espèce de la table ne convient. Pourquoi ? Une mesure n'est jamais parfaite : on accepte un petit écart, mais pas n'importe lequel. Comment lire le résultat ? Le nom de l'espèce, ou un message d'absence.
À faire : complète les deux lignes marquées ..., exécute, puis réponds à Q3.
i. L'écart est trop grand si ecart > 2.meilleur = i et if ecart > 2:.especes = ["acide palmitique", "acide stéarique", "naphtalène", "acide benzoïque", "eau", "cyclohexane"]
T_fusion = [63, 69, 80, 122, 0, 6.5]
def identifier(T_palier):
meilleur = 0
for i in range(len(especes)):
if abs(T_fusion[i] - T_palier) < abs(T_fusion[meilleur] - T_palier):
meilleur = i
ecart = abs(T_fusion[meilleur] - T_palier)
if ecart > 2:
return "aucune espèce de la table"
return especes[meilleur]
for mesure in [69.3, 80.2, 6.1, 54.0]:
print("palier à", mesure, "°C ->", identifier(mesure))
Résultats attendus. 69,3 °C → acide stéarique ; 80,2 °C → naphtalène ; 6,1 °C → cyclohexane ; 54,0 °C → aucune espèce de la table.
Interprétation. Notre palier à 69,3 °C identifie bien l'acide stéarique. Pour 54,0 °C, l'espèce la plus proche (acide palmitique, 63 °C) est à 9 °C : ce n'est pas elle. L'espèce n'est pas dans la table, ou ce n'est pas un corps pur.
Erreurs fréquentes. Comparer sans abs (on choisirait toujours l'espèce de plus petite température) ; oublier le test de l'écart (la fonction donnerait toujours un nom, même absurde).
L'écart de 0,3 °C est du même ordre que l'incertitude de la sonde et que l'arrondi de la table (69 °C est donné sans décimale) : il n'est pas gênant. Une identification doit pouvoir échouer : si l'on répondait toujours « l'espèce la plus proche », on attribuerait un nom faux à une espèce absente de la table ou à un mélange. Un bon programme, comme un bon expérimentateur, sait dire « je ne sais pas ».
Maël a écrit son propre programme pour la température et la durée du palier, à partir de la liste des mesures du palier trouvée à l'activité 2. Il contient quatre erreurs : deux l'empêchent de fonctionner, deux donnent des résultats faux sans message. Compare tes résultats à ceux de l'activité 2 (69,3 °C et 360 s).
for. Comment s'appelle la variable de la moyenne ? Par quoi faut-il diviser la somme ? Combien d'intervalles de 30 s y a-t-il entre la première et la dernière mesure du palier ?for i in palier: ; T_moy partout ; somme / len(palier) ; duree = (len(palier) - 1) * dt.dt = 30
T = [82.0, 78.1, 74.4, 71.0, 69.4, 69.4, 69.2, 69.3, 69.4, 69.3, 69.4, 69.2, 69.3, 69.2, 69.3, 69.3, 69.2,
66.1, 63.2, 60.5, 57.9, 55.4, 53.3, 51.0, 49.1, 47.1, 45.4, 43.9, 42.3, 40.8, 39.7, 38.4, 37.1]
palier = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
somme = 0
for i in palier: # erreur 1 : deux-points
somme = somme + T[i]
T_moy = somme / len(palier) # erreur 3 : moyenne sur les points du palier
duree = (len(palier) - 1) * dt # erreur 4 : 13 mesures = 12 intervalles
print("palier :", round(T_moy, 1), "°C pendant", duree, "s") # erreur 2 : T_moy
Erreur 1 (bloquante). Il manque les deux-points à la fin de la ligne for : erreur de syntaxe.
Erreur 2 (bloquante). T_moyenne n'existe pas : la variable s'appelle T_moy (NameError).
Erreur 3 (silencieuse). La somme des 13 températures du palier est divisée par 33 (toutes les mesures) : le programme affiche 27,3 °C, absurde (la courbe ne passe jamais par un palier à 27 °C).
Erreur 4 (silencieuse). 13 mesures ne délimitent que 12 intervalles de 30 s : 390 s au lieu de 360 s. L'erreur est petite, mais systématique.
Résultat après correction. Palier à 69,3 °C pendant 360 s, comme à l'activité 2.
En lisant la courbe : le palier commence à la mesure 4 (\(t = 120\ \text{s}\)) et finit à la mesure 16 (\(t = 480\ \text{s}\)), soit \(480 - 120 = 360\ \text{s}\). On peut aussi tester le programme sur un cas simple : un palier de 2 mesures consécutives dure 30 s, pas 60 s. C'est le classique « problème des piquets et des intervalles ».
La courbe de refroidissement présente un palier de 360 s à 69,3 °C, repéré automatiquement par Python (variations inférieures à 0,3 °C entre mesures successives). Pendant ce palier, l'acide se solidifie : transformation exothermique, l'énergie libérée (environ 1 kJ pour 5 g) compense celle cédée à l'air, et la température reste constante. Ce palier montre qu'il s'agit d'un corps pur, et sa température, comparée à une table, identifie l'acide stéarique (69 °C), avec un écart compatible avec la précision des mesures.
Grille d'auto-évaluation
A = je sais faire seul · B = avec un peu d'aide · C = partiellement · D = à retravailler.
| Compétence | A | B | C | D |
|---|---|---|---|---|
| Relever une courbe de refroidissement en sécurité | ||||
| Repérer un palier et sa température | ||||
| Calculer une énergie Q = m × L | ||||
| Utiliser abs() et une condition dans une boucle | ||||
| Écrire une fonction de recherche dans une table | ||||
| Repérer une erreur en testant un cas simple |
Fiche professeur
Organisation
Durée totale estimée : 115 min. En séance de 1 h 30 : partie expérimentale et activités 1 à 3 ; activités 4 et 5 et conclusion en fin de séance, à la maison ou en séance suivante. Le parcours « à l'aise » (activité 1 facultative) fait gagner environ 10 min.
Préparation
Acide stéarique en tubes (environ 5 g), bain-marie à 85 °C prêt en début de séance, sondes de température.
Sécurité
Bain-marie chaud : manipuler les tubes avec une pince. L'acide stéarique n'est pas dangereux mais ne doit pas être ingéré.
Points de vigilance
Le palier de solidification de l'acide stéarique est vers 69–70 °C ; un palier légèrement incliné signale un produit impur, ce qui fait le lien avec corps pur / mélange (chapitre 1).
Différenciation
Aide : Fournir un tableau de relevés à compléter toutes les 30 s.
Approfondissement : Calculer l'énergie libérée pendant la solidification à partir de l'énergie massique fournie.
Évaluation (sur 20)
Tracé et lecture du palier (activités 2 et 3, 8 pts) ; activité 4 (énergie, 4 pts) ; activité 5 (4 pts) ; Q5 (4 pts).
Les corrections détaillées des activités Python et des questions sont dans les encadrés de chaque partie.
Pour consolider : exercices 6, 9 et 10, puis le quiz du cours.
Exercices corrigés Retour au cours