Objectif de la fiche : représenter les positions successives d'un système modélisé par un point lors d'une évolution unidimensionnelle, puis modéliser cette évolution par un polynôme grâce à np.polyfit.
Cette fiche est autonome : tu n'as besoin d'aucun autre document, tout ce qu'il faut est ci-dessous, y compris le rappel du script de la fiche précédente. 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).
On reprend là où on s'était arrêté
- Cette fiche prolonge la fiche n°1 : on repart des mêmes mesures de chute d'une bille, obtenues par chronophotographie.
- Le script ci-dessous est déjà complet : copie-le tel quel dans Thonny (ou dans Basthon) pour commencer, tu n'as rien à deviner ici.
- Garde cette fenêtre Thonny ouverte : tu vas ajouter du code à la suite à chaque étape.
Rappel des mesures
Les 16 positions y ont été pointées sur la chronophotographie de la chute, à intervalles de temps égaux. Le point n°0, en haut, sert d'origine.
| point n° | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| y mesuré | 0 | −0,7 | −1,5 | −2,3 | −3,5 | −4,5 | −5,9 | −7,7 | −8,8 | −10,6 | −12,3 | −14,2 | −16,4 | −18,5 | −21 | −23,5 |
L'échelle de la photo vaut 2/100 : c'est ce facteur qui permet de passer de ymes (mesuré sur la photo, en unités arbitraires) à yreelle (en mètres).
import numpy as np
import matplotlib.pyplot as plt
# Ordonnées pointées sur la chronophotographie (unités de la photo)
ymes = np.array([-0, -0.7, -1.5, -2.3, -3.5, -4.5, -5.9, -7.7,
-8.8, -10.6, -12.3, -14.2, -16.4, -18.5, -21, -23.5])
# Passage à l'échelle réelle (facteur 2/100)
yreelle = ymes * 2 / 100
# Base de temps : 16 instants entre 0 s et 0,25 s
t = np.linspace(0, 1/4, 16)
print('yreelle :', yreelle)
print('t :', t)
Deux lignes s'affichent dans la console : la liste des 16 positions réelles (en mètres, négatives), puis la liste des 16 instants de 0 à 0,25 seconde.
Recréer la chronophotographie
- La fonction
plt.plota besoin de deux tableaux de même longueur : une liste d'abscisses et une liste d'ordonnées. - Ici, on veut que tous les points aient la même abscisse (x = 0), pour recréer la colonne verticale de la chronophotographie. Écris
x = 0*t: cela engendre un tableau de 16 zéros, de la même longueur quet. - Trace
yreelleen fonction dex, en ronds rouges ('ro'), avec la légende"y=f(x)". - Complète les étiquettes des axes (
"position"en abscisse,"yreelle"en ordonnée), la grille, la légende et le titre"chute libre".
# TODO : abscisse constante et nulle, de même longueur que t
x = ____ * t
# TODO : trace yreelle en fonction de x, en ronds rouges, avec une légende
plt.plot(____, ____, '__', label="____")
plt.xlabel("____")
plt.ylabel("____")
plt.grid()
plt.legend()
plt.title("____")
plt.show()
Indice
Écrire x = 0 tout court ne donnerait qu'un seul nombre, pas un tableau de 16 valeurs : plt.plot refuserait de tracer deux tableaux de longueurs différentes. 0*t résout le problème car il garde la longueur de t.
Une colonne verticale de points rouges alignés sur l'axe x = 0, du plus haut (y proche de 0) au plus bas (y proche de −0,47) : c'est exactement la chronophotographie de la chute, reconstituée par Python.
Laisser l'ordinateur trouver le modèle
- La fonction
np.polyfit(t, yreelle, 2)cherche automatiquement le polynôme de degré 2 (de la forme a·t² + b·t + c) qui passe au plus près des points mesurés. - Nomme le résultat
mod: c'est un tableau de 3 valeurs[a, b, c]. - Affiche
modavecprint, puis affiche séparémentg = -2×mod[0],vo = mod[1]etyo = mod[2].
D'où viennent ces formules ?
La seconde loi de Newton donne, pour une chute libre verticale, la position y(t) = -½·g·t² + v0·t + y0. En comparant avec le polynôme a·t² + b·t + c renvoyé par np.polyfit, on identifie : a = -g/2 (donc g = -2a), b = v0 et c = y0.
# TODO : cherche le polynôme de degré 2 qui modélise yreelle en fonction de t
mod = np.polyfit(____, ____, __)
print('mod :', mod)
# TODO : déduis-en g, v0 et y0 à partir des coefficients de mod
print('g = ', ____ * __)
print('vo = ', ____)
print('yo = ', ____)
Indice
La numérotation Python commence toujours à 0 : le premier coefficient a renvoyé par np.polyfit est mod[0], le deuxième mod[1], le troisième mod[2]. Pense au signe « moins » devant le 2 pour g.
La valeur de g affichée doit être un nombre positif proche de 9,8 (l'ordre de grandeur de l'accélération de la pesanteur sur Terre), même si elle n'est pas exactement égale à la valeur tabulée — une bonne occasion de réfléchir aux chiffres significatifs.
Superposer mesures et modèle
- Calcule
ymod, les valeurs prédites par le modèle pour chaque instantt:ymod = mod[0]*t**2 + mod[1]*t + mod[2]. - Trace sur le même graphe les points mesurés
yreelleen fonction det(ronds rouges, légende"yréelle=f(t)") et la courbe du modèleymoden fonction det(ligne bleue continue, indice'b-', légende"ymod=f(t)"). - Ajoute les étiquettes d'axes (
"temps"/"yreelle"), la grille, la légende et le titre"chute libre et son modèle".
# TODO : valeurs prédites par le modèle, pour chaque instant t
ymod = mod[0]*t**2 + ____*t + ____
# TODO : trace les points mesurés puis la courbe du modèle sur le même graphe
plt.plot(____, ____, '__', label="____")
plt.plot(____, ____, '__', label="____")
plt.xlabel("____")
plt.ylabel("____")
plt.grid()
plt.legend()
plt.title("____")
plt.show()
Indice
Deux appels successifs à plt.plot(...) avant un seul plt.show() tracent bien les deux courbes sur la même figure. Le style 'b-' se lit blue (bleu) + - (ligne continue), à la différence de 'ro' qui trace des points isolés.
Une courbe bleue lisse qui passe très près de chacun des points rouges mesurés : le modèle du second degré décrit bien la chute libre de la bille.
Pense-bête — de np.polyfit à la physique
| mod[0] | coefficient a, avec g = −2a |
| mod[1] | coefficient b, soit la vitesse initiale v0 |
| mod[2] | coefficient c, soit la position initiale y0 |
| 'ro' | points rouges (mesures) |
| 'b-' | ligne bleue continue (modèle) |
| t**2 | t au carré, en Python |
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.