Objectif de la fiche : représenter les vecteurs vitesse d'un système modélisé par un point lors d'un mouvement à deux dimensions, à l'aide du langage Python.
Cette fiche est autonome : tu n'as besoin d'aucun autre document, tout ce qu'il faut est ci-dessous, y compris les nouvelles données de la balle de golf. 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).
Les données de la balle de golf
- Cette fiche change de terrain d'étude : on ne reprend pas les mesures de la bille en chute libre des fiches précédentes, mais celles d'une balle de golf, pointée sur une chronophotographie toutes les
0,066 s. - Le mouvement est maintenant à deux dimensions : chaque position est repérée par une abscisse
xET une ordonnéey, toutes deux positives ici. - Le script ci-dessous est déjà complet : copie-le tel quel dans Thonny (ou dans Basthon) pour commencer.
Tableau des positions pointées
11 positions ont été relevées, à intervalles de temps égaux de 0,066 s. Le point n°0 est proche de l'origine.
| point n° | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| x (m) | 0,01 | 0,25 | 0,57 | 0,91 | 1,22 | 1,54 | 1,87 | 2,16 | 2,49 | 2,81 | 3,15 |
| y (m) | 0,015 | 0,340 | 0,681 | 1,010 | 1,297 | 1,559 | 1,768 | 1,95 | 2,08 | 2,158 | 2,193 |
L'ordonnée y augmente d'abord vite, puis de moins en moins : la balle monte, ralentit, et va bientôt redescendre (on retrouve la forme d'une trajectoire de projectile).
import numpy as np
import matplotlib.pyplot as plt
# 11 instants séparés de 0,066 s
t = 0.066 * np.arange(11)
# Positions successives de la balle de golf (en mètres)
x = np.array([0.01, 0.25, 0.57, 0.91, 1.22, 1.54, 1.87, 2.16, 2.49, 2.81, 3.15])
y = np.array([0.01549, 0.3404, 0.6812, 1.010, 1.297, 1.559, 1.768, 1.95, 2.08, 2.158, 2.193])
Représenter la trajectoire
- À la différence des fiches précédentes, l'abscisse n'est plus constante : trace directement
yen fonction dex, en ronds rouges ('ro'), avec la légende"y=f(x)". - Complète les étiquettes des axes (
"xreelle"/"yreelle"), la grille, la légende et le titre"Trajectoire de la balle".
# TODO : trace y 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()
Un nuage de points rouges qui dessine une courbe montante puis qui s'aplatit progressivement : le début de la trajectoire en cloche caractéristique d'un projectile.
Vecteurs « déplacement » en 2D
- Comme dans les fiches précédentes, engendre
n = np.arange(len(t)-1)pour disposer des 10 indices utilisables (il n'y a que 10 déplacements possibles pour 11 points). - Dans une boucle
for i in n :, trace la flècheplt.arrow(x[i], y[i], x[i+1]-x[i], y[i+1]-y[i], head_width=0.05): elle part du point i et pointe vers le point i+1, dans les deux directions x et y à la fois. - Fixe les limites des axes avec
plt.xlim(0, 4)etplt.ylim(0, 3), ajouteplt.grid()et le titre"Vecteurs déplacement".
# TODO : indices utilisables pour les déplacements
n = np.arange(len(____) - __)
# TODO : boucle qui trace un vecteur déplacement (x et y) par tour de boucle
for i in ____ :
plt.arrow(x[__], y[__], x[____]-x[__], y[____]-y[__], head_width=0.05)
plt.xlim(__, __)
plt.ylim(__, __)
plt.grid()
plt.title("____")
plt.show()
Indice
La différence avec la fiche n°3 tient uniquement au fait que la flèche a maintenant une longueur horizontale non nulle (x[i+1]-x[i]) en plus de sa longueur verticale (y[i+1]-y[i]) : c'est ce qui lui permet de suivre vraiment la trajectoire.
Une suite de 10 petites flèches noires qui suivent fidèlement la courbe de la trajectoire : contrairement aux fiches précédentes (mouvement 1D), le résultat est ici parfaitement lisible.
Vecteurs « vitesse » en 2D
- Cette fois, le vecteur vitesse à la position
i+1est obtenu en calculant le déplacement entre les positionsieti+2, divisé par l'intervalle de temps correspondantt[i+2]-t[i]. - Comme on a besoin de
i+2, la liste des indices doit être redimensionnée à nouveau : utilisem = np.arange(len(t)-2)(10 devient 9 valeurs possibles). - Dans une boucle
for i in m :, la flèche part du pointx[i+1], y[i+1]avec pour longueurs0.1*(x[i+2]-x[i])/(t[i+2]-t[i])et0.1*(y[i+2]-y[i])/(t[i+2]-t[i]). - Le facteur
0.1est un facteur d'échelle : sans lui, les flèches (qui représentent une vitesse en m/s) seraient bien trop longues pour tenir sur le graphe à côté de la trajectoire (en mètres).
# TODO : indices utilisables pour les vitesses (une valeur de moins que n)
m = np.arange(len(____) - __)
# TODO : boucle qui trace un vecteur vitesse (mis à l'échelle) par tour de boucle
for i in ____ :
plt.arrow(x[____], y[____], ___*(x[____]-x[__])/(t[____]-t[__]), ___*(y[____]-y[__])/(t[____]-t[__]), head_width=0.05)
plt.xlim(__, __)
plt.ylim(__, __)
plt.grid()
plt.show()
Indice
Repère bien les trois indices différents utilisés dans une même ligne : i+1 pour le point de départ de la flèche, i et i+2 pour calculer le déplacement encadrant ce point. Le facteur 0.1 se place directement devant chacune des deux longueurs, avant le signe *.
Des flèches globalement tangentes à la trajectoire, plus longues au début (la balle va vite) puis de plus en plus courtes vers la fin du tracé (la balle ralentit en montant) : c'est bien le comportement attendu du vecteur vitesse.
Pense-bête — passer de 1D à 2D
| n | indices 0 à len(t)-2 : pour les déplacements |
| m | indices 0 à len(t)-3 : pour les vitesses (besoin de i+2) |
| x[i+1] | abscisse au point suivant |
| arg 1, 2 | x, y de départ de la flèche |
| arg 3, 4 | longueur horizontale et verticale |
| 0.1 * | facteur d'échelle pour rester lisible |
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.