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é.

\[\vec v = \begin{pmatrix} v_x \\ v_y \end{pmatrix}\]

avec

\[v_x \left(t_i \right) = \dfrac{x_{i+1} - x_{i-1}}{2 \times \Delta t}\]
\[v_y \left(t_i \right) = \dfrac{y_{i+1} - y_{i-1}}{2 \times \Delta t}\]

De même sur le vecteur variation de vitesse :

\[\Delta \vec v_i = {\vec v}_{i+1} - {\vec v}_{i-1}=\begin{pmatrix}\Delta v_x \\ \Delta v_y \end{pmatrix}\]

avec

\[\Delta v_x \left(t_i \right) = v_x \left(t_{i+1} \right)-v_x \left(t_{i-1} \right)\]
\[\Delta v_y \left(t_i \right)= v_y \left(t_{i+1} \right)-v_y \left(t_{i-1} \right)\]

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 :

1
from tkinter.filedialog import askopenfilename
2
import matplotlib.pyplot as plt
3
from numpy import loadtxt
4
5
# Ouverture en mode graphique d'un fichier de pointage au format CSV
6
# Ne pas modifier les lignes 7 à 17
7
8
# on peut donner le chemin d'accès vers le fichier ou la fonction askopenfilename
9
name = askopenfilename(filetypes=(("Fichier CSV", "*.csv"), ("Fichier Texte", "*.txt"), ("Tous les fichiers", "*.*")), title="Choisir un fichier")
10
11
# name contient le chemin et le nom du fichier à traiter.
12
# On importe les valeurs de la date t, de l'abscisse x et de l'ordonnée y dans trois listes.
13
14
t, x, y = loadtxt(name, skiprows=1, dtype="str", delimiter=";", unpack=True, usecols=(0, 1, 2))
15
t = [float(val.replace(",", ".")) for val in t]
16
x = [float(val.replace(",", ".")) for val in x]
17
y = [float(val.replace(",", ".")) for val in y]
18
19
# On dispose à ce stade des trois listes contenant les coordonnées du ballon.
20
21
dt = t[1] - t[0]  # Détermination de l'intervalle de temps entre deux pointages
22
# Calcul des coordonnées des vecteurs vitesse
23
"""Complétez les champs indiqués afin de calculer :
24
    - les coordonnées vx et vy au point n°i avec les instants encadrant le point i
25
    - les coordonnnées Dvx et Dvy au point n°i avec la même méthode"""
26
# Calcul des coordonnées des vecteurs vitesse instantanée sous forme de listes en compréhension
27
28
vx = [(x[i+1] - x[i-1]) / (2 * dt) for i in range(1, len(t) - 1)]
29
30
vy = [À COMPLÉTER for i in range(1, len(t) - 1)]
31
32
# Calcul des coordonnées des vecteurs variation de vitesse sous forme de listes en compréhension
33
34
Dvx = [À COMPLÉTER for i in range(1, len(vx) - 1)]
35
36
Dvy = [À COMPLÉTER for i in range(1, len(vy) - 1)]
37
38
# Tracé des vecteurs : ajuster les valeurs du paramètre scale pour changer la taille des vecteurs
39
# Plus la valeur est faible, plus le vecteur est long
40
41
# On trace sur une figure les vecteurs vitesse instantanée
42
43
plt.figure(1)
44
plt.title("Vecteurs vitesse instantanée sur les pointages réalisés")
45
plt.scatter(x, y, marker="x", color="blue", label="Positions")
46
"""Pour une figure plus lisible, on ne trace qu'un vecteur sur deux"""
47
48
v = plt.quiver(x[1:-1:2], y[1:-1:2], vx[::2], vy[::2], units="dots",
49
               color="red", scale=0.04, label="Vecteurs vitesse instantanée")
50
51
"""La ligne ci-dessous trace une échelle de représentation
52
echelleV contient la valeur du vecteur échelle."""
53
echelleV = 2.  # 2 m/s pour le vecteur échelle
54
plt.quiverkey(v, 0.85, 0.8, echelleV, coordinates="axes",
55
              label=f"{echelleV:.1f} m/s")
56
plt.axis("equal")
57
plt.xlabel("x (m)")
58
plt.ylabel("y (m)")
59
plt.legend()
60
plt.show()
61
62
# On trace sur une figure les vecteurs variation de vitesse
63
plt.figure(2)
64
plt.title("Vecteurs variation de vitesse sur les pointages réalisés")
65
plt.scatter(x, y, marker="x", color="blue", label="Positions")
66
Dv = plt.quiver(x[2:-2:], y[2:-2:], Dvx, Dvy, units="dots", scale=0.01,
67
                color="green", label="Vecteurs variation de vitesse")
68
69
"""La ligne ci-dessous trace une échelle de représentation
70
echelleDV contient la valeur du vecteur échelle."""
71
echelleDV = 0.5  # 0.5 m/s pour cet exemple
72
plt.quiverkey(Dv, 0.85, 0.8, echelleDV, coordinates="axes",
73
              label=f"{echelleDV:.1f} m/s")
74
plt.axis("equal")
75
plt.xlabel("x (m)")
76
plt.ylabel("y (m)")
77
plt.legend()
78
plt.show()

Questions :

  1. 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 ?

  2. Compléter la ligne 30 du programme de façon à obtenir les coordonnées du vecteur vitesse au point n°i.

  3. 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.

  4. 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.