Physique-chimie · Terminale · Enseignement de spécialité · Fiche n°2

Simuler mille pendules
pour en croire un seul.

Mesurer la période d'un pendule pour en déduire le champ de pesanteur terrestre semble simple — jusqu'à ce qu'on réalise que chaque mesure de longueur et de durée porte sa propre incertitude. Plutôt que de multiplier les vraies expériences, tu vas laisser Python en simuler des milliers d'un coup, pour observer comment ces petites incertitudes se combinent jusqu'à dessiner, presque comme par magie, une courbe en cloche.

variabilite_g.py — aperçun = 0 mesures
9,2 10,4 g (m/s²)

Objectif de la fiche : simuler, à l'aide d'un langage de programmation, un processus aléatoire illustrant la détermination de la valeur d'une grandeur avec incertitudes-types composées — ici, le champ de pesanteur terrestre g, déduit de la mesure de la période et de la longueur d'un pendule simple.

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 mesure n'est jamais parfaite

À savoir
  • La mesure de la période T d'un pendule simple, et de sa longueur L, permet de déterminer une valeur expérimentale du champ de pesanteur terrestre grâce à la formule valable pour les petites oscillations : g = 4π²L / T².
  • En réalité, aucune mesure de T ni de L n'est parfaitement exacte : chronométrer à la main, lire une règle... chaque geste introduit une petite incertitude. Cette fiche propose de simuler cette variabilité avec le module random de Python, plutôt que de répéter des centaines de vraies mesures au laboratoire.
  • Deux façons de simuler des mesures incertaines seront explorées : une répartition uniforme (toutes les valeurs d'un intervalle sont également probables) et une loi normale (les valeurs proches de la moyenne sont plus probables que les valeurs extrêmes — la façon dont se répartit en réalité la plupart des grandeurs physiques mesurées).
00

Simuler 100 mesures de T et L

Consigne
  • np.random.uniform(a, b, n) engendre n nombres tirés au hasard, uniformément entre a et b. Simule ainsi 100 mesures de L (réparties entre 19,7 et 19,9 cm) et 100 mesures de T (entre 0,88 et 0,90 s).
  • Calcule ensuite, pour chaque couple de mesures simulées, la valeur de g correspondante avec la formule 4π²L/T² — attention à convertir L en mètres (facteur 10⁻²).
  • Calcule enfin la moyenne (np.mean) et l'écart-type (np.std) de ces 100 valeurs de g, et affiche-les.
etape0_simulation.py
import numpy as np
import matplotlib.pyplot as plt

# TODO : 100 mesures simulées de L (cm) et de T (s), réparties uniformément
Lvar = np.random.uniform(____, ____, ___)
Tvar = np.random.uniform(____, ____, ___)

# TODO : valeur de g déduite de chaque couple (L, T) simulé
gvar = 4*np.pi**_*Lvar*10**(-2) / Tvar**_

# TODO : moyenne et écart-type des 100 valeurs de g obtenues
gmoy = np.____(gvar)
dg = np.___(gvar)
print('moyenne des mesures de g =', gmoy, 'écart-type =', dg)
Indice

Comme Lvar et Tvar sont des tableaux numpy de 100 valeurs chacun, l'écriture 4*np.pi**2*Lvar*10**(-2)/Tvar**2 calcule automatiquement les 100 valeurs de g correspondantes, une par une, sans avoir besoin d'écrire de boucle for.

Résultat attendu

Une moyenne proche de 9,87 m/s² et un écart-type autour de 0,13. Relance le script plusieurs fois : comme random tire de nouvelles valeurs à chaque exécution, la moyenne affichée change légèrement à chaque fois — c'est la variabilité elle-même que tu observes.

01

Visualiser les distributions

Consigne
  • Trace l'histogramme des 100 valeurs simulées de Lvar, avec bins=10, une légende 'L mesurée', puis affiche-le.
  • Fais de même pour gvar, avec la légende 'g mesurée'.
etape1_histogrammes.py
# TODO : histogramme des valeurs simulées de L
plt.hist(____, bins=__)
plt.legend('__________')
plt.show()

# TODO : histogramme des valeurs calculées de g
plt.hist(____, bins=__)
plt.legend('__________')
plt.show()
Résultat attendu

L'histogramme de L montre des barres à peu près toutes de même hauteur, entre 19,7 et 19,9 — cohérent avec un tirage uniforme. Celui de g, en revanche, est déjà un peu plus irrégulier : combiner deux sources d'incertitude commence à transformer la forme de la distribution.

02

Augmenter le nombre de tirages

Consigne
  • Reprends l'étape 0, mais remplace 100 par 10000 dans les deux lignes np.random.uniform(...). Relance ensuite les histogrammes de l'étape 1.
etape2_plus_de_tirages.py
# TODO : reprends les lignes de l'étape 0 avec 10000 tirages au lieu de 100
Lvar = np.random.uniform(19.7, 19.9, _____)
Tvar = np.random.uniform(0.88, 0.90, _____)
Résultat attendu

Avec 10 000 tirages, l'histogramme de L devient beaucoup plus régulier — visiblement uniforme, comme attendu. Celui de g, lui, commence à dessiner une silhouette en cloche, malgré des données de départ uniquement uniformes : un aperçu du théorème central limite, qui explique pourquoi tant de grandeurs physiques suivent une loi normale, même quand leurs sources d'incertitude n'en suivent pas.

03

Pour aller plus loin : quel paramètre domine ?

Consigne
  • Reviens à 100 tirages, mais élargis nettement l'intervalle de Tvar, par exemple entre 0,79 et 0,99 s (au lieu de 0,88–0,90), en laissant Lvar inchangé. Relance le calcul de gmoy et dg.
etape3_parametre_dominant.py
Lvar = np.random.uniform(19.7, 19.9, 100)
Tvar = np.random.uniform(____, ____, 100)
Résultat attendu

L'écart-type de g explose : de l'ordre de 1,28, contre 0,13 à l'étape 0 — dix fois plus grand, alors que seul l'intervalle de T a été élargi. Conclusion : la variabilité de g est pour l'essentiel dictée par la variabilité de son paramètre le plus incertain. En pratique, c'est donc sur ce paramètre qu'il faut concentrer ses efforts pour améliorer la précision d'une mesure composée.

04

Vers la loi normale

Consigne
  • La plupart des grandeurs mesurées en physique suivent en réalité une loi normale, pas une répartition uniforme. np.random.normal(moyenne, écart_type, n) engendre n valeurs suivant cette loi.
  • Reviens aux intervalles initiaux, mais simule cette fois L avec une moyenne de 19,8 cm et un écart-type de 0,05 cm, et T avec une moyenne de 0,89 s et un écart-type de 0,005 s. Le calcul de gvar, gmoy et dg reste inchangé.
  • Pour mieux voir la forme de la distribution avec beaucoup de valeurs, utilise bins=100 plutôt que 10 dans l'histogramme de g.
etape4_loi_normale.py
# TODO : simulation de L et T selon une loi normale (moyenne, écart-type, n)
Lvar = np.random.______(____, ____, 100)
Tvar = np.random.______(____, _____, 100)

gvar = 4*np.pi**2*Lvar*10**(-2) / Tvar**2
gmoy = np.mean(gvar)
dg = np.std(gvar)
print('moyenne des mesures de g =', gmoy, 'écart-type =', dg)

plt.hist(gvar, bins=___)
plt.legend('g mesurée')
plt.show()

Convergence vers la loi normale : effet du nombre de tirages

En augmentant progressivement le nombre de tirages (troisième argument de np.random.normal), la moyenne et l'écart-type se stabilisent, et l'histogramme de g dessine une cloche de plus en plus nette et symétrique.

nombre de tirages1001 00010 0001 000 000
moyenne de g9,8779,8719,8709,869
écart-type0,1010,1110,1140,114

Remarque : au-delà de quelques milliers de tirages, la moyenne et l'écart-type ne varient quasiment plus — ils ont convergé. Simuler encore plus de mesures n'apporte alors plus grand-chose, si ce n'est un tracé plus lisse.

05

Le paramètre dominant, version loi normale

Consigne
  • Comme à l'étape 3, augmente fortement l'incertitude sur T — cette fois en portant son écart-type à 0,05 s (au lieu de 0,005 s), toutes choses égales par ailleurs, avec 1000 tirages.
etape5_parametre_dominant_normale.py
Lvar = np.random.normal(19.8, 0.05, 1000)
Tvar = np.random.normal(0.89, ____, 1000)
Résultat attendu

La console affiche un écart-type de l'ordre de 1,14 — dix fois plus grand qu'à l'étape 4, exactement comme observé avec les répartitions uniformes. Le message est le même quelle que soit la loi de probabilité choisie : c'est bien le paramètre le moins précis qui pilote la variabilité du résultat final.

Pense-bête — simuler la variabilité d'une mesure

np.random.uniform(a,b,n)n valeurs, également probables entre a et b
np.random.normal(m,s,n)n valeurs suivant une loi normale (moyenne m, écart-type s)
np.mean / np.stdmoyenne et écart-type d'un tableau
binsnombre de classes de l'histogramme
grandeur composéecalculée à partir de plusieurs mesures
paramètre dominantcelui dont l'incertitude pilote le résultat

Pas de Thonny sous la main ? Utilise Basthon

Ouvrir dans un nouvel onglet ↗
Basthon est une console Python qui tourne directement dans le navigateur, sans rien installer. Colle ici (avec 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.