Tracer des vecteurs avec Python
On aborde dans cette rubrique la syntaxe permettant de tracer des vecteurs sur une figure.
De nombreuses activités en mécanique peuvent donner lieu à des tracés de vecteurs : vecteurs vitesse instantanée, vecteurs variation de vitesse, accélération, etc...
On commence par importer la bibliothèque pyplot
qui contient les fonctions permettant de tracer des vecteurs.
import matplotlib.pyplot as plt
Deux fonctions permettent de tracer des vecteurs :
plt.arrow
-> Accéder à sa documentation ;plt.quiver
-> Accéder à sa documentation.
On exploite principalement dans ce support la fonction plt.quiver
qui permet de tracer un vecteur unique ou un champ de vecteurs.
Tracé d'un vecteur unique
Les lignes de commande ci-dessous permettent de tracer un vecteur unique dans un repère orthonormé.
# Les trois premières lignes permettent uniquement de travailler dans un repère orthonormé.
# On place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
plt.plot(-5, -5, "None")
plt.plot(5, 5, "None")
plt.axis('equal') # Trace un repère orthonormé
plt.quiver(0, 0, 4, 2, angles = 'xy', scale_units = 'xy', scale = 1) # Tracé d'un vecteur
plt.show() # On affiche la fenêtre graphique
Décryptage de la commande plt.quiver()
0, 0 : coordonnées de l'origine du vecteur ;
4, 2 : composantes du vecteur suivant l'axe des abscisses et l'axe des ordonnées ;
angles = 'xy' : choix entre 'uv' ou 'xy' : 'uv' est le choix par défaut avec la même échelle de représentation pour chaque composante du vecteur. 'xy' trace des vecteurs dont les composantes sont dans les mêmes unités que celles des axes x et y. Excepté pour tracer un vecteur déplacement, on peut omettre ce paramètre qui est de toutes façon sans effet dans un repère orthonormé ;
scale_units = 'xy' : échelles basées sur les unités des axes des abscisses et ordonnées. Excepaté pour un vecteur déplacement, on choisira le plus souvent scale_units = 'dots'.
scale = 1 : échelle du tracé, 1 pour taille réelle, 0.5 pour un facteur 2. Plus la valeur est faible, plus le vecteur représenté est long.
Représentation d'un champ de vecteurs
On présente ici la méthode permettant de représenter plusieurs vecteurs en une seule ligne de commande : vecteurs vitesse instantanée sur une trajectoire, vecteurs accélération, etc...
Si les coordonnées de l'origine du vecteur et celles de ses composantes sont des listes au lieu d'être des valeurs numériques, plt.quiver
permet de tracer tous les vecteurs correspondants en une seule ligne de commande.
Le court programme ci-dessous trace une trajectoire circulaire et place différentes positions au cours du temps. On trace ensuite les vecteurs vitesse instantanée \(\vec v\) et variation de vitesse \(\Delta \vec v\) aux différentes positions.
from math import sin, cos, pi # Importation des fonctions mathématiques nécessaires
import matplotlib.pyplot as plt # Importation de la bibliothèque graphique
R = 5 # Rayon de la trajectoire
V0 =15 # Valeur de la vitesse
alpha = [2 * i * pi / 50 for i in range(51)] # Construction de la liste des angles repérant la position
x = [R * cos(a) for a in alpha] # Liste des abscisses
y = [R * sin(a) for a in alpha] # Listes de ordonnées
vx = [-V0 * sin(a) for a in alpha] # Coordonnées suivant Ox de la vitesse
vy = [V0 * cos(a) for a in alpha] # Coordonnées suivant Oy de la vitesse
Dvx = [vx[i+1] - vx[i-1] for i in range(1, 50)] # Coordonnées suivant Ox du vecteur variation de vitesse
Dvy = [vy[i+1] - vy[i-1] for i in range(1, 50)] # Coordonnée suivant Oy du vecteur variation de vitesse
plt.scatter(0, 0, marker = "+", color = "black") # On place le centre de la trajectoire
plt.scatter(x, y, marker = "x", color = "blue") # On place les positions successives
plt.quiver(x, y, vx, vy, units = "dots", color = "red", scale = 0.1, label = "Vecteurs vitesse") # Représentation des vecteurs vitesse
plt.quiver(x[1:-1:], y[1:-1:], Dvx, Dvy, units = "dots", scale = 0.1, color = "green", label = "Vecteurs variation de vitesse") # Représentation des vecteur variation de vitesse
plt.axis("equal") # Pour avoir un repère orthonormé
plt.legend() # Affichage de la légende
plt.show() # Affichage du graphique
Remarques :
x, y, vx, vy : listes permettant de tracer tous les vecteurs aux positions x et y et dont les composantes sont vx et vy ;
units = "dots" : il n'y a pas de correspondance entre les unités des axes (positions) et la vitesse, on ne choisit pas units = "xy" comme précédemment ;
scale = 0.1 : à ajuster pour avoir des vecteurs de longueur exploitable ;
Pour le tracé des vecteurs variation de vitesse : la méthode de calcul utilisée ne permet pas de calculer ce vecteur aux positions initiale et finale. Les listes Dvx et Dvy ont deux termes de moins que les listes x et y.
x[1 :-1 :]
permet de ne pas prendre en compte le terme d'indice 0 et le dernier terme de la liste.
Ajouter un vecteur échelle sur la représentation
Il s'agit d'ajouter une échelle de représentation des vecteurs sous la forme d'un vecteur étiqueté avec la valeur qu'il représente.
C'est la commande plt.quiverkey()
qui permet de le faire.
Le programme ci-dessous est identique au précédent mais ajoute l'échelle de représentation.
from math import sin, cos, pi # Importation des fonctions mathématiques nécessaires
import matplotlib.pyplot as plt # Importation de la bibliothèque graphique
R = 5 # Rayon de la trajectoire
V0 =15 # Valeur de la vitesse
alpha = [2 * i * pi / 50 for i in range(51)] # Construction de la liste des angles repérant la position
x = [R * cos(a) for a in alpha] # Liste des abscisses
y = [R * sin(a) for a in alpha] # Listes de ordonnées
vx = [-V0 * sin(a) for a in alpha] # Coordonnées suivant Ox de la vitesse
vy = [V0 * cos(a) for a in alpha] # Coordonnées suivant Oy de la vitesse
Dvx = [vx[i+1] - vx[i-1] for i in range(1, 50)] # Coordonnées suivant Ox du vecteur variation de vitesse
Dvy = [vy[i+1] - vy[i-1] for i in range(1, 50)] # Coordonnée suivant Oy du vecteur variation de vitesse
plt.scatter(0, 0, marker = "+", color = "black") # On place le centre de la trajectoire
plt.scatter(x, y, marker = "x", color = "blue") # On place les positions successives
v = plt.quiver(x, y, vx, vy, units = "dots", color = "red", scale = 0.1, label = "Vecteurs vitesse") # Représentation des vecteurs vitesse (v pour pouvoir définir l'échelle)
Dv=plt.quiver(x[1:-1:], y[1:-1:], Dvx, Dvy, units = "dots", scale = 0.1, color = "green", label = "Vecteurs variation de vitesse") # Représentation des vecteur variation de vitesse
plt.quiverkey(v, 0.9, 0.85, 10, label=r"$10\ \mathrm{m \cdot s^{-1}}$", coordinates = "axes") # Dessin d'un vecteur donnant l'échelle des tracés
plt.axis("equal") # Pour avoir un repère orthonormé
plt.legend() # Affichage de la légende
plt.show() # Affichage du graphique
Modifications nécessaires pour le tracé de l'échelle :
v = plt.quiver(x, y, vx, vy,... : définit et trace le champ de vecteurs v, nécessaire pour utiliser quiverkey ;
plt.quiverkey(v, 0.9, 0.85, 10, label=r"$10\ \mathrm{m \cdot s^{-1}}$", coordinates = "axes") :
v : champ de vecteurs dont on veut tracer l'échelle ;
0.9, 0.85 associé à coordinates = "axes" : position du vecteur échelle par rapport aux axes 0, 0 pour le bord inférieur gauche, 1, 1 pour le bord supérieur droit ;
10 : longueur de l'échelle ;
label : légende de ce vecteur sous forme de chaîne de caractères, ici en syntaxe latex.