Comment connaître le nombre d'entités contenues dans un échantillon, alors qu'elles sont bien trop petites et trop nombreuses pour être comptées ?
Objectifs
- Compter des objets identiques par pesée.
- Calculer la masse d'une entité à partir de sa formule.
- Calculer le nombre d'entités et la quantité de matière d'un échantillon pesé.
- Écrire et utiliser des fonctions Python pour automatiser ces calculs.
Compétences travaillées
- Réaliser : peser avec soin, programmer.
- Analyser : transposer une méthode (riz → molécules).
- Valider : contrôler un ordre de grandeur.
- Communiquer : présenter résultats et graphique.
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.
Matériel
- une balance au 0,01 g et une coupelle ;
- un paquet de riz (500 g) ;
- un morceau de sucre, une cuillère de sel, un clou en fer, un fil de cuivre ;
- une éprouvette graduée et de l'eau.
Protocole
| Échantillon | 100 grains de riz | Sucre | Sel | Clou | Cuivre | 20 mL d'eau |
|---|---|---|---|---|---|---|
| Masse (g) |
Valeurs typiques 100 grains de riz : 2,31 g · morceau de sucre : 5,6 g · cuillère de sel : 6,0 g · clou : 3,0 g · fil de cuivre : 8,9 g · 20 mL d'eau : 20,0 g. Ce sont des ordres de grandeur courants ; tes propres pesées peuvent différer.
Un grain pèse environ 0,02 g : avec une balance au 0,01 g, l'incertitude serait de l'ordre de 50 %. Avec 100 grains, l'erreur de 0,01 g ne représente plus que 0,4 % de 2,31 g. On suppose que tous les grains ont la même masse (ou que la masse moyenne de 100 grains représente bien tout le paquet). Pour des molécules d'une même espèce, l'hypothèse est bien meilleure : elles sont toutes identiques (à de petites différences isotopiques près), et leur masse se calcule à partir de la formule.
À partir de la masse de 100 grains, il calcule la masse d'un grain, puis le nombre de grains \(N\) dans le paquet, et enfin le nombre de « paquets de 1 000 grains ». Pourquoi ? C'est exactement la démarche du cours : \(N = m/m_{\text{entité}}\), puis regroupement par paquets (pour les molécules, les paquets sont des moles). Comment lire le résultat ? Un nombre de grains de l'ordre de \(10^{4}\).
À faire : complète les lignes marquées ..., exécute, puis remplace m_100 par ta mesure.
m_grain, combien de grains faut-il pour faire m_paquet ?N = m_paquet / m_grain et paquets = N / 1000.m_100 = 2.31
m_paquet = 500
m_grain = m_100 / 100
N = m_paquet / m_grain
paquets = N / 1000
print("masse d'un grain :", m_grain, "g")
print("nombre de grains :", round(N))
print("nombre de paquets de 1000 :", round(paquets, 1))
Résultats attendus. Un grain : 0,0231 g. Le paquet contient environ 21 645 grains, soit 21,6 paquets de 1 000.
Interprétation. On a « compté » plus de 20 000 grains avec deux pesées. Le résultat n'est pas exact au grain près (les grains n'ont pas tous la même masse), mais l'ordre de grandeur est fiable. Pour les molécules, on remplace « paquet de 1 000 » par « mole » (\(6{,}02\times10^{23}\)).
Erreurs fréquentes. Multiplier au lieu de diviser (\(500 \times 0{,}0231 = 11{,}6\) grains : absurde pour un paquet de 500 g) ; oublier de diviser m_100 par 100.
La formule est décrite par deux listes : les masses des atomes et le nombre de chaque atome. La boucle additionne \(\text{nombre} \times \text{masse}\) pour chaque élément. Pourquoi ? C'est la règle du cours, et elle marche pour n'importe quelle formule. Comment lire le résultat ? Une masse en kg, de l'ordre de \(10^{-26}\) à \(10^{-25}\) kg pour une petite molécule.
À faire : complète la ligne dans la boucle, exécute pour le glucose \(\text{C}_6\text{H}_{12}\text{O}_6\), puis adapte la liste nombres pour l'eau \(\text{H}_2\text{O}\) et pour le saccharose \(\text{C}_{12}\text{H}_{22}\text{O}_{11}\).
i apporte nombres[i] atomes, chacun de masse masses[i].m_molecule : m_molecule = m_molecule + …m_molecule = m_molecule + nombres[i] * masses[i]. Pour l'eau : nombres = [0, 2, 1] ; pour le saccharose : nombres = [12, 22, 11].elements = ["C", "H", "O"]
masses = [1.99e-26, 1.67e-27, 2.66e-26]
nombres = [6, 12, 6] # glucose ; eau : [0, 2, 1] ; saccharose : [12, 22, 11]
m_molecule = 0
for i in range(len(elements)):
m_molecule = m_molecule + nombres[i] * masses[i]
print(elements[i], ":", nombres[i], "atome(s)")
print("masse d'une molécule :", m_molecule, "kg")
Résultats attendus. Glucose : \(2{,}99\times10^{-25}\) kg (Python affiche 2.9904e-25). Eau : \(2{,}99\times10^{-26}\) kg. Saccharose : \(5{,}68\times10^{-25}\) kg.
Interprétation. Une molécule de glucose (24 atomes) est 10 fois plus lourde qu'une molécule d'eau (3 atomes). L'écriture e-25 de Python signifie \(\times10^{-25}\).
Erreurs fréquentes. Écrire m_molecule = nombres[i] * masses[i] sans m_molecule + : la variable est écrasée à chaque tour et seul le dernier élément compte ; écrire 1,99e-26 avec une virgule.
Pour des masses de 0 à 100 g, il calcule la quantité de matière d'eau, de sel et de sucre, et trace les trois courbes \(n = f(m)\). Pourquoi ? Pour voir comment \(n\) dépend de la masse et de l'espèce. Comment le lire ? Des droites passant par l'origine (proportionnalité) ; plus l'entité est légère, plus la droite est pentue.
À faire : complète le calcul de n_sel et de n_sucre, trace les deux courbes manquantes, puis ajoute la légende et les axes.
m * 1e-3), divisée par la masse d'une entité, divisée par \(N_A\).n_eau en remplaçant m_eau par la bonne masse d'entité.n_sel.append(m * 1e-3 / m_sel / NA) ; plt.plot(masses_g, n_sel, 's-', color='green', label='sel') ; idem pour le sucre ; plt.xlabel("m (g)"), plt.ylabel("n (mol)"), plt.legend().import matplotlib.pyplot as plt
NA = 6.02e23
m_eau = 2.99e-26
m_sel = 9.71e-26
m_sucre = 5.68e-25
masses_g = []
n_eau = []
n_sel = []
n_sucre = []
for m in range(0, 101, 10):
masses_g.append(m)
n_eau.append(m * 1e-3 / m_eau / NA)
n_sel.append(m * 1e-3 / m_sel / NA)
n_sucre.append(m * 1e-3 / m_sucre / NA)
plt.plot(masses_g, n_eau, 'o-', color='blue', label='eau')
plt.plot(masses_g, n_sel, 's-', color='green', label='sel')
plt.plot(masses_g, n_sucre, '^-', color='red', label='sucre')
plt.title("Quantité de matière en fonction de la masse")
plt.xlabel("m (g)")
plt.ylabel("n (mol)")
plt.legend()
plt.grid()
plt.show()
Résultat attendu. Trois droites passant par l'origine. Pour 100 g : 5,6 mol d'eau, 1,7 mol de sel, 0,29 mol de sucre.
Interprétation. \(n\) est proportionnelle à la masse pour une espèce donnée : doubler la masse double le nombre d'entités. La pente dépend de l'espèce : l'eau, dont la molécule est la plus légère, a la droite la plus pentue. La masse seule ne suffit donc pas à comparer des quantités de matière : il faut connaître l'espèce.
Erreurs fréquentes. Oublier * 1e-3 (valeurs 1 000 fois trop grandes) ; utiliser m_eau dans les trois calculs (trois courbes confondues).
Un dictionnaire MASSE associe à chaque symbole la masse de l'atome : MASSE["O"] vaut \(2{,}66\times10^{-26}\). La fonction masse_entite calcule la masse d'une entité à partir de sa composition ; la fonction quantite, à compléter, calcule \(N\) et \(n\) pour un échantillon pesé. Pourquoi ? Une fonction écrite une fois sert pour tous les échantillons. Comment lire le résultat ? Une ligne par échantillon de la partie 1.
À faire : complète les deux lignes de la fonction quantite, exécute, puis remplace les masses par tes pesées. Réponds à Q2.
masse_entite(symboles, nombres). La masse de l'échantillon m_g est en grammes.N = m_g * 1e-3 / masse_entite(symboles, nombres) et n = N / NA.NA = 6.02e23
MASSE = {"H": 1.67e-27, "C": 1.99e-26, "O": 2.66e-26, "Na": 3.82e-26,
"Cl": 5.89e-26, "Fe": 9.27e-26, "Cu": 1.06e-25}
def masse_entite(symboles, nombres):
m = 0
for i in range(len(symboles)):
m = m + nombres[i] * MASSE[symboles[i]]
return m
def quantite(m_g, symboles, nombres):
N = m_g * 1e-3 / masse_entite(symboles, nombres)
n = N / NA
return N, n
echantillons = [
["eau (20 mL)", 20.0, ["H", "O"], [2, 1]],
["sucre (1 morceau)", 5.6, ["C", "H", "O"], [12, 22, 11]],
["sel (1 cuillère)", 6.0, ["Na", "Cl"], [1, 1]],
["clou en fer", 3.0, ["Fe"], [1]],
["fil de cuivre", 8.9, ["Cu"], [1]],
]
for e in echantillons:
N, n = quantite(e[1], e[2], e[3])
print(e[0], ":", e[1], "g ->", "N =", "{:.2e}".format(N), "; n =", "{:.3g}".format(n), "mol")
Résultats attendus.
| Échantillon | \(N\) | \(n\) (mol) |
|---|---|---|
| eau, 20,0 g | \(6{,}68\times10^{23}\) | 1,11 |
| sucre, 5,6 g | \(9{,}86\times10^{21}\) | 0,0164 |
| sel, 6,0 g | \(6{,}18\times10^{22}\) | 0,103 |
| fer, 3,0 g | \(3{,}24\times10^{22}\) | 0,0538 |
| cuivre, 8,9 g | \(8{,}40\times10^{22}\) | 0,139 |
Interprétation. 20 mL d'eau contiennent à peu près une mole de molécules. Le morceau de sucre, plus lourd que le clou, contient pourtant moins d'entités : ses molécules sont très lourdes (45 atomes). La notation "{:.2e}".format(N) affiche un nombre en écriture scientifique avec 2 décimales.
Erreurs fréquentes. Oublier la conversion en kg (\(N\) et \(n\) 1 000 fois trop grands : 1 110 mol pour 20 mL d'eau !) ; écrire n = N * NA.
L'eau : 20 g de molécules très légères (\(2{,}99\times10^{-26}\) kg), soit 1,11 mol. Le sucre contient moins d'entités que le clou (0,016 mol contre 0,054 mol), bien qu'il soit presque deux fois plus lourd : une molécule de saccharose (\(5{,}68\times10^{-25}\) kg) pèse environ 6 fois plus qu'un atome de fer (\(9{,}27\times10^{-26}\) kg). Le nombre d'entités dépend de la masse de l'échantillon et de la masse d'une entité.
Lina veut calculer la quantité de matière contenue dans 10 g d'eau. Son programme contient quatre erreurs : deux l'empêchent de fonctionner, deux donnent un résultat faux sans message. Corrige une erreur à la fois. Ordre de grandeur attendu : 10 g, c'est la moitié de l'échantillon de 20 mL de l'activité 4.
m0 → mO ; NA = 6.02e23 (point décimal) ; N = 10e-3 / m_eau ; n = N / NA.mH = 1.67e-27
mO = 2.66e-26
NA = 6.02e23 # erreur 2 : point décimal
m_eau = 2 * mH + mO # erreur 1 : lettre O, pas le chiffre 0
N = 10e-3 / m_eau # erreur 3 : masse en kg
n = N / NA # erreur 4 : on divise par NA
print("n =", n, "mol")
Erreur 1 (bloquante). m0 (avec un zéro) n'existe pas : NameError. La variable s'appelle mO (lettre O).
Erreur 2 (bloquante). NA = 6,02e23 ne crée pas un nombre : la virgule fabrique un couple de deux valeurs (6 et \(2\times10^{23}\)). Python refuse ensuite de le multiplier par N : TypeError.
Erreur 3 (silencieuse). 10 est en grammes alors que m_eau est en kg : \(N\) est 1 000 fois trop grand.
Erreur 4 (silencieuse). \(n = N \times N_A\) au lieu de \(N/N_A\).
Résultat après correction. \(n \approx 0{,}555\ \text{mol}\). Avec seulement les erreurs 1 et 2 corrigées, le programme affichait environ \(2\times10^{50}\) mol ; avec l'erreur 4 corrigée mais pas la 3, 555 mol. Les deux sont absurdes pour 10 g d'eau.
Deux contrôles simples : \(n\) doit être beaucoup plus petit que \(N\) (une mole est un paquet énorme), or \(2\times10^{50}\) est plus grand que \(N\) ; et 10 g d'eau, c'est la moitié des 20 mL de l'activité 4 (1,11 mol), donc environ 0,55 mol. Un résultat de \(10^{50}\) ou même de 555 mol pour une cuillerée d'eau est absurde.
Comme pour le riz, on compte en pesant. On calcule la masse d'une entité à partir de sa formule (somme des masses des atomes), on pèse l'échantillon, et on divise : \(N = m_{\text{échantillon}}/m_{\text{entité}}\). Ces nombres étant gigantesques (\(10^{21}\) à \(10^{24}\) pour des objets du quotidien), on les regroupe par paquets de \(N_A = 6{,}02\times10^{23}\) : la quantité de matière \(n = N/N_A\) s'exprime alors en moles, avec des valeurs faciles à manipuler (0,016 mol pour un sucre, 1,1 mol pour 20 mL d'eau).
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 |
|---|---|---|---|---|
| Peser avec une balance (tare, précision) | ||||
| Calculer la masse d'une entité à partir de sa formule | ||||
| Calculer N et n pour un échantillon pesé | ||||
| Utiliser une boucle pour additionner | ||||
| Compléter et utiliser une fonction | ||||
| Contrôler un résultat par son ordre de grandeur |
Fiche professeur
Organisation
Durée totale estimée : 110 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
Balances au 0,01 g, paquets de riz, échantillons de sucre, sel, fer, cuivre ; données des masses d'entités imprimées.
Sécurité
Pas de risque particulier.
Points de vigilance
Distinguer masse d'une entité et masse de l'échantillon. La masse molaire n'est qu'évoquée (programme de Première).
Différenciation
Aide : Partir du riz (compter 100 grains, peser) avant de passer aux atomes ; fournir les masses des atomes.
Approfondissement : Estimer le nombre de molécules d'eau dans une goutte (0,05 mL) ; comparer au nombre d'humains sur Terre.
Évaluation (sur 20)
Calcul de N et de n (activités 3 et 4, 8 pts) ; Q5 (6 pts) ; activité 5 (4 pts) ; méthode du riz (2 pts).
Les corrections détaillées des activités Python et des questions sont dans les encadrés de chaque partie.
Pour consolider : exercices 5, 8 et 10, puis le quiz du cours.
Exercices corrigés Retour au cours