Tracé des vecteurs vitesse instantanée à l'aide d'un programme en Python
Question⚓
Le programme complété doit permettre d'obtenir :
les coordonnées des vecteurs vitesse ;
les coordonnées des vecteurs variation de vitesse.
On rappelle la définition du vecteur vitesse et la méthode de calcul sur un enregistrement :
On obtient une estimation de la vitesse instantanée en la considérant égale à la vitesse moyenne entre les deux points qui encadrent l'instant étudié.
avec
De même sur le vecteur variation de vitesse :
avec
Quelques rappel sur le traitement des listes :
len(nom_liste) renvoie le nombre de termes d'une liste ;
le premier terme d'une liste a pour indice 0 et le dernier len(liste)-1.
x[ : :2] extrait un terme sur 2 d'une liste ;
x[1 :-1 :] ne prend pas en compte le deuxième et le dernier terme d'une liste.
On donne ci-dessous le programme commenté à compléter pour obtenir le tracé des vecteurs vitesse et variation de vitesse.
Vous pourrez en faire un copier-coller dans votre éditeur Python en activant d'abord l'affichage en texte brut :
from tkinter.filedialog import askopenfilename
import matplotlib.pyplot as plt
from numpy import loadtxt
# Ouverture en mode graphique d'un fichier de pointage au format CSV
# Ne pas modifier les lignes 7 à 17
# on peut donner le chemin d'accès vers le fichier ou la fonction askopenfilename
name = askopenfilename(filetypes=(("Fichier CSV", "*.csv"), ("Fichier Texte", "*.txt"), ("Tous les fichiers", "*.*")), title="Choisir un fichier")
# name contient le chemin et le nom du fichier à traiter.
# On importe les valeurs de la date t, de l'abscisse x et de l'ordonnée y dans trois listes.
t, x, y = loadtxt(name, skiprows=1, dtype="str", delimiter=";", unpack=True, usecols=(0, 1, 2))
t = [float(val.replace(",", ".")) for val in t]
x = [float(val.replace(",", ".")) for val in x]
y = [float(val.replace(",", ".")) for val in y]
# On dispose à ce stade des trois listes contenant les coordonnées du ballon.
dt = t[1] - t[0] # Détermination de l'intervalle de temps entre deux pointages
# Calcul des coordonnées des vecteurs vitesse
"""Complétez les champs indiqués afin de calculer :
- les coordonnées vx et vy au point n°i avec les instants encadrant le point i
- les coordonnnées Dvx et Dvy au point n°i avec la même méthode"""
# Calcul des coordonnées des vecteurs vitesse instantanée sous forme de listes en compréhension
vx = [(x[i+1] - x[i-1]) / (2 * dt) for i in range(1, len(t) - 1)]
vy = [À COMPLÉTER for i in range(1, len(t) - 1)]
# Calcul des coordonnées des vecteurs variation de vitesse sous forme de listes en compréhension
Dvx = [À COMPLÉTER for i in range(1, len(vx) - 1)]
Dvy = [À COMPLÉTER for i in range(1, len(vy) - 1)]
# Tracé des vecteurs : ajuster les valeurs du paramètre scale pour changer la taille des vecteurs
# Plus la valeur est faible, plus le vecteur est long
# On trace sur une figure les vecteurs vitesse instantanée
plt.figure(1)
plt.title("Vecteurs vitesse instantanée sur les pointages réalisés")
plt.scatter(x, y, marker="x", color="blue", label="Positions")
"""Pour une figure plus lisible, on ne trace qu'un vecteur sur deux"""
v = plt.quiver(x[1:-1:2], y[1:-1:2], vx[::2], vy[::2], units="dots",
color="red", scale=0.04, label="Vecteurs vitesse instantanée")
"""La ligne ci-dessous trace une échelle de représentation
echelleV contient la valeur du vecteur échelle."""
echelleV = 2. # 2 m/s pour le vecteur échelle
plt.quiverkey(v, 0.85, 0.8, echelleV, coordinates="axes",
label=f"{echelleV:.1f} m/s")
plt.axis("equal")
plt.xlabel("x (m)")
plt.ylabel("y (m)")
plt.legend()
plt.show()
# On trace sur une figure les vecteurs variation de vitesse
plt.figure(2)
plt.title("Vecteurs variation de vitesse sur les pointages réalisés")
plt.scatter(x, y, marker="x", color="blue", label="Positions")
Dv = plt.quiver(x[2:-2:], y[2:-2:], Dvx, Dvy, units="dots", scale=0.01,
color="green", label="Vecteurs variation de vitesse")
"""La ligne ci-dessous trace une échelle de représentation
echelleDV contient la valeur du vecteur échelle."""
echelleDV = 0.5 # 0.5 m/s pour cet exemple
plt.quiverkey(Dv, 0.85, 0.8, echelleDV, coordinates="axes",
label=f"{echelleDV:.1f} m/s")
plt.axis("equal")
plt.xlabel("x (m)")
plt.ylabel("y (m)")
plt.legend()
plt.show()
Questions :
Dans une boucle for, range(50) permet de faire varier l'indice de 0 à 49 : la valeur 50 n'est pas atteinte.
Pourquoi choisit-on range(1, len(t) - 1) dans la boucle à la ligne 28 du programme ?
Compléter la ligne 30 du programme de façon à obtenir les coordonnées du vecteur vitesse au point n°i.
Compléter les lignes 34 et 36 de façon à calculer les valeurs des coordonnées du vecteur variation de vitesse au point n°i.
Une fois votre programme complété, testez-le avec le fichier de pointages que vous avez obtenu lors de la première étape de l'activité (soit avec Pymecavideo, soit téléchargé dans l'activité).
En cas de soucis avec le programme à compléter, vous pouvez récupérer la version complète dans la Solution.
Solution⚓
Si vous n'avez pas réussi à compléter correctement votre programme, vous pouvez utiliser celui qui vous est proposé ci-dessous.
from tkinter.filedialog import askopenfilename
import matplotlib.pyplot as plt
from numpy import loadtxt
# Ouverture en mode graphique d'un fichier de pointage au format CSV
# Ne pas modifier les lignes 7 à 17
# on peut donner le chemin d'accès vers le fichier ou la fonction askopenfilename
name = askopenfilename(filetypes=(("Fichier CSV", "*.csv"), ("Fichier Texte", "*.txt"), ("Tous les fichiers", "*.*")), title="Choisir un fichier")
# name contient le chemin et le nom du fichier à traiter.
# On importe les valeurs de la date t, de l'abscisse x et de l'ordonnée y dans trois listes.
t, x, y = loadtxt(name, skiprows=1, delimiter=";", dtype="str", unpack=True, usecols=(0, 1, 2))
t = [float(val.replace(",", ".")) for val in t]
x = [float(val.replace(",", ".")) for val in x]
y = [float(val.replace(",", ".")) for val in y]
# On dispose à ce stade des trois listes contenant les coordonnées du ballon.
dt = t[1] - t[0] # Détermination de l'intervalle de temps entre deux pointages
# Calcul des coordonnées des vecteurs vitesse
"""Complétez les champs indiqués afin de calculer :
- les coordonnées vx et vy au point n°i avec les instants encadrant le point i
- les coordonnnées Dvx et Dvy au point n°i avec la même méthode"""
# Calcul des coordonnées des vecteurs vitesse instantanée sous forme de listes en compréhension
vx = [(x[i+1] - x[i-1]) / (2 * dt) for i in range(1, len(t) - 1)]
vy = [(y[i+1] - y[i-1]) / (2 * dt) for i in range(1, len(t) - 1)]
# Calcul des coordonnées des vecteurs variation de vitesse sous forme de listes en compréhension
Dvx = [vx[i+1] - vx[i-1] for i in range(1, len(vx) - 1)]
Dvy = [vy[i+1] - vy[i-1] for i in range(1, len(vy) - 1)]
# Tracé des vecteurs : ajuster les valeurs du paramètre scale pour changer la taille des vecteurs
# Plus la valeur est faible, plus le vecteur est long
# On trace sur une figure les vecteurs vitesse instantanée
plt.figure(1)
plt.title("Vecteurs vitesse instantanée sur les pointages réalisés")
plt.scatter(x, y, marker="x", color="blue", label="Positions")
"""Pour une figure plus lisible, on ne trace qu'un vecteur sur deux"""
v = plt.quiver(x[1:-1:2], y[1:-1:2], vx[::2], vy[::2], units="dots",
color="red", scale=0.04, label="Vecteurs vitesse instantanée")
"""La ligne ci-dessous trace une échelle de représentation
echelleV contient la valeur du vecteur échelle."""
echelleV = 2. # 2 m/s pour le vecteur échelle
plt.quiverkey(v, 0.85, 0.8, echelleV, coordinates="axes",
label=f"{echelleV:.1f} m/s")
plt.axis("equal")
plt.xlabel("x (m)")
plt.ylabel("y (m)")
plt.legend()
plt.show()
# On trace sur une figure les vecteurs variation de vitesse
plt.figure(2)
plt.title("Vecteurs variation de vitesse sur les pointages réalisés")
plt.scatter(x, y, marker="x", color="blue", label="Positions")
Dv = plt.quiver(x[2:-2:], y[2:-2:], Dvx, Dvy, units="dots", scale=0.01,
color="green", label="Vecteurs variation de vitesse")
"""La ligne ci-dessous trace une échelle de représentation
echelleDV contient la valeur du vecteur échelle."""
echelleDV = 0.5 # 0.5 m/s pour cet exemple
plt.quiverkey(Dv, 0.85, 0.8, echelleDV, coordinates="axes",
label=f"{echelleDV:.1f} m/s")
plt.axis("equal")
plt.xlabel("x (m)")
plt.ylabel("y (m)")
plt.legend()
plt.show()
Réponses aux questions
La méthode proposée pour l'estimation de la vitesse instantanée en un point de la trajectoire utilise le point précédent et le point suivant de l'enregistrement des positions. Avec cette méthode, on ne peut donc pas estimer la valeur de la vitesse pour le premier point, ni pour le dernier point.
range(1, len(t) - 1) permet de ne pas prendre en compte le terme d'indice 0 (premier point) et le terme d'indice len(t)-1 (dernier point).
Ligne 30 du programme
Lignes 34 et 36
Exemple de résultats