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
- La mesure de la période
Td'un pendule simple, et de sa longueurL, 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
Tni deLn'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 modulerandomde 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).
Simuler 100 mesures de T et L
np.random.uniform(a, b, n)engendrennombres tirés au hasard, uniformément entreaetb. Simule ainsi 100 mesures deL(réparties entre19,7et19,9cm) et 100 mesures deT(entre0,88et0,90s).- Calcule ensuite, pour chaque couple de mesures simulées, la valeur de
gcorrespondante avec la formule4π²L/T²— attention à convertirLen mètres (facteur10⁻²). - Calcule enfin la moyenne (
np.mean) et l'écart-type (np.std) de ces 100 valeurs deg, et affiche-les.
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.
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.
Visualiser les distributions
- Trace l'histogramme des 100 valeurs simulées de
Lvar, avecbins=10, une légende'L mesurée', puis affiche-le. - Fais de même pour
gvar, avec la légende'g mesurée'.
# 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()
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.
Augmenter le nombre de tirages
- Reprends l'étape 0, mais remplace
100par10000dans les deux lignesnp.random.uniform(...). Relance ensuite les histogrammes de l'étape 1.
# 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, _____)
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.
Pour aller plus loin : quel paramètre domine ?
- Reviens à 100 tirages, mais élargis nettement l'intervalle de
Tvar, par exemple entre0,79et0,99s (au lieu de0,88–0,90), en laissantLvarinchangé. Relance le calcul degmoyetdg.
Lvar = np.random.uniform(19.7, 19.9, 100)
Tvar = np.random.uniform(____, ____, 100)
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.
Vers la loi normale
- 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)engendrenvaleurs suivant cette loi. - Reviens aux intervalles initiaux, mais simule cette fois
Lavec une moyenne de19,8cm et un écart-type de0,05cm, etTavec une moyenne de0,89s et un écart-type de0,005s. Le calcul degvar,gmoyetdgreste inchangé. - Pour mieux voir la forme de la distribution avec beaucoup de valeurs, utilise
bins=100plutôt que10dans l'histogramme deg.
# 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 tirages | 100 | 1 000 | 10 000 | 1 000 000 |
|---|---|---|---|---|
| moyenne de g | 9,877 | 9,871 | 9,870 | 9,869 |
| écart-type | 0,101 | 0,111 | 0,114 | 0,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.
Le paramètre dominant, version loi normale
- Comme à l'étape 3, augmente fortement l'incertitude sur
T— cette fois en portant son écart-type à0,05s (au lieu de0,005s), toutes choses égales par ailleurs, avec 1000 tirages.
Lvar = np.random.normal(19.8, 0.05, 1000)
Tvar = np.random.normal(0.89, ____, 1000)
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.std | moyenne et écart-type d'un tableau |
| bins | nombre de classes de l'histogramme |
| grandeur composée | calculée à partir de plusieurs mesures |
| paramètre dominant | celui dont l'incertitude pilote le résultat |
Pas de Thonny sous la main ? Utilise Basthon
Ouvrir dans un nouvel onglet ↗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.