Physique-chimie · 2de · Enseignement commun · Fiche n°3

Automatiser le tracé
avec une boucle for.

Jusqu'ici, chaque flèche du vecteur déplacement aurait dû être tracée à la main, ligne par ligne. Avec une boucle for, Python peut répéter automatiquement la même instruction pour chacune des 15 positions de la bille : une compétence clé de la programmation, applicable bien au-delà de la physique-chimie.

chronophotographie.py — aperçut = 0.00 s

Objectif de la fiche : représenter les vecteurs vitesse (ou plus exactement, vecteurs déplacement) d'un système modélisé par un point lors d'un mouvement, en utilisant une boucle for pour automatiser le tracé.

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 des fiches précédentes. 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).

00

On reprend là où on s'était arrêté

À savoir
  • Cette fiche prolonge les fiches n°1 et n°2 : 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° 01234567 89101112131415
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

On va cette fois s'intéresser à ce qui se passe entre deux points consécutifs : le vecteur déplacement, qui relie la position n°i à la position n°i+1.

etape0_reprise.py
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)
Résultat attendu

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.

01

Compter les déplacements avec une boucle for

Consigne
  • yreelle contient 16 valeurs (indices 0 à 15), mais il n'existe que 15 déplacements possibles entre deux points consécutifs : yreelle[1]-yreelle[0], yreelle[2]-yreelle[1], … jusqu'à yreelle[15]-yreelle[14].
  • Utilise np.arange(len(t)-1) pour engendrer la liste des indices 0, 1, 2, …, 14 : nomme ce tableau n.
  • Vérifie avec print que n contient bien 15 valeurs, de 0 à 14.
etape1_boucle_for.py
# TODO : engendre la liste des indices 0 à 14 (15 valeurs)
n = np.arange(len(____) - __)
print('n :', n)
Indice

len(t) vaut 16, le nombre total de points. Comme il n'y a qu'une différence possible entre chaque paire de points consécutifs, il faut soustraire 1 : len(t)-1 donne bien 15.

Résultat attendu

n : [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] — 15 valeurs, de 0 à 14. Si tu obtiens 16 valeurs (jusqu'à 15), relis bien la consigne : l'indice ne doit pas dépasser 14, sinon yreelle[i+1] chercherait une valeur qui n'existe pas.

02

Fixer l'abscisse des vecteurs

Consigne
  • Comme dans la fiche précédente, on veut que tous les vecteurs partent de la même abscisse, x = 0.
  • Écris x = 0*t : cela engendre un tableau de 16 zéros, de la même longueur que t.
etape2_abscisse.py
# TODO : abscisse constante et nulle, de même longueur que t
x = ____ * t
Indice

Cette ligne ne produit aucun affichage par elle-même : elle prépare simplement le tableau x qui sera utilisé dans l'étape suivante pour tracer les flèches.

03

Tracer tous les vecteurs, automatiquement

Consigne
  • La fonction plt.arrow(x_départ, y_départ, longueur_horizontale, longueur_verticale) trace une flèche. Ici : abscisse de départ 0, ordonnée de départ yreelle[i], longueur horizontale 0, longueur verticale yreelle[i+1]-yreelle[i].
  • Place cet appel à plt.arrow à l'intérieur d'une boucle for i in n :, indentée (décalée vers la droite), pour qu'elle se répète automatiquement pour chaque valeur de i.
  • N'oublie pas les deux-points : après for i in n, sinon Python renvoie une erreur.
  • Ajoute les paramètres de style fc="k", ec="k", head_width=0.005, head_length=0.01 pour des flèches noires bien visibles, puis fixe les limites des axes avec plt.ylim(-0.5, 0.1) et plt.xlim(-0.1, 0.1).
etape3_vecteurs.py
# TODO : boucle for qui trace un vecteur déplacement par tour de boucle
for i in ____ :
    plt.arrow(__, yreelle[__], __, yreelle[____]-yreelle[__], fc="k", ec="k", head_width=0.005, head_length=0.01)

# TODO : fixe les limites des axes pour bien voir toutes les flèches
plt.ylim(____, ____)
plt.xlim(____, ____)
plt.show()
Indice

Toute ligne indentée sous for i in n : fait partie de la boucle et se répète 15 fois, une pour chaque valeur de i allant de 0 à 14. La ligne plt.arrow(...) doit être décalée d'une tabulation (ou 4 espaces) par rapport au for.

Résultat attendu

Une colonne de 15 petites flèches noires empilées verticalement sur l'axe x = 0, chacune pointant vers le bas et de plus en plus longue à mesure que la bille accélère : ce sont les vecteurs déplacement successifs de la bille.

Pense-bête — boucle for et plt.arrow

for i in n :répète le bloc indenté pour chaque valeur de i dans n
yreelle[i]le i-ème élément de la liste yreelle
yreelle[i+1]l'élément suivant, juste après
arg 1, 2x et y de départ de la flèche
arg 3, 4longueur horizontale et verticale
fc, eccouleur de fond et du contour

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.