IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les vecteurs avec numpy et matplotlib

Opérations de base sur les vecteurs, transformation de vecteurs, etc.

Objectif : apprendre à manipuler les vecteurs avec la bibliothèque numpy (addition de vecteurs, multiplication par un scalaire, transformation à l'aide d'une fonction, etc.) et à les représenter sur des graphiques avec matplotlib.

Niveau requis : débutant

Commentez Donner une note à l´article (0)

Article lu   fois.

L'auteur

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Après avoir donné une rapide présentation des vecteurs et des opérations propres à ces objets mathématiques, nous allons montrer comment les définir avec numpy et comment les afficher sur des graphiques matplotlib.

Enfin, on va réaliser différentes opérations, dans l'environnement Python, comme l'addition de deux vecteurs numpy, la multiplication par un scalaire, ou encore la transformation d'un vecteur en lui appliquant une fonction mathématique.

Vous l'aurez compris, nous allons donc nous initier au calcul vectoriel avec numpy.

II. Vecteur

D'après Wikipedia, en mathématiques, un vecteur est un objet généralisant plusieurs notions provenant de la géométrie (couples de points, translations, etc.), de l'algèbre (« solution » d'un système d'équations à plusieurs inconnues), ou de la physique (forces, vitesses, accélérations, etc.).

La notion de vecteur est le fondement de la branche des mathématiques appelée algèbre linéaire. En ce sens, un vecteur est un élément d'un espace vectoriel, c'est-à-dire qu'il est possible d'effectuer les opérations d'addition et de multiplication par un scalaire (par un nombre), et que ces opérations ont les propriétés nécessaires à un espace vectoriel.

Image non disponible

Un couple, un triplet de nombres réels, peut également être vu comme un vecteur. L'addition et le produit par un nombre réel se font alors composante par composante.

II-A. Représentation algébrique d'un vecteur

Un vecteur dans le plan peut ainsi être représenté par une composante en x et une composante en y :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


Dans l'espace, il aura alors une composante en x, une composante en y, et une composante en z :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\\u_{z}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


On peut de la même manière imaginer une représentation d'un vecteur à n composantes dans un espace à n dimensions.

II-B. Addition de vecteurs

Soit les vecteurs définis dans le plan :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp et kitxmlcodeinlinelatexdvp{\vec {v}}{\begin{pmatrix}v_{x}\\v_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


L'addition de ces deux vecteurs composante par composante nous donne :

kitxmlcodeinlinelatexdvp{\vec {u} + \vec {v} = {\begin{pmatrix}u_{x}+v_{x}\\u_{y}+v_{y}\end{pmatrix}}}finkitxmlcodeinlinelatexdvp

II-C. Multiplication d'un vecteur par un scalaire

Prenons maintenant le vecteur :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


La multiplication de ce vecteur par un scalaire s (nombre réel) nous donne cette fois :

kitxmlcodeinlinelatexdvp{s⋅\vec {u} = {\begin{pmatrix}s⋅u_{x}\\s⋅u_{y}\end{pmatrix}}}finkitxmlcodeinlinelatexdvp

II-D. Produit scalaire

Soit les vecteurs définis dans le plan :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp et kitxmlcodeinlinelatexdvp{\vec {v}}{\begin{pmatrix}v_{x}\\v_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


Leur produit scalaire nous donne :

kitxmlcodeinlinelatexdvp{\overrightarrow{u}\cdot\overrightarrow{v} =u_{x}v_{x}+u_{y}v_{y}}finkitxmlcodeinlinelatexdvp

II-E. Norme d'un vecteur

La norme d'un vecteur peut se calculer à l'aide du produit scalaire.

Soit le vecteur défini dans le plan :

kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp


Sa norme s'écrit alors :

kitxmlcodeinlinelatexdvp{\left\| \overrightarrow{u} \right\|=\sqrt{\overrightarrow{u}\cdot \overrightarrow{u}}=\sqrt{u_{x}^{2}+u_{y}^{2}}}finkitxmlcodeinlinelatexdvp

II-F. Opérateur vectoriel

En mathématiques, un opérateur est une application entre deux espaces vectoriels.


Soient E et F deux espaces vectoriels. Un opérateur O est une application de E dans F :

kitxmlcodeinlinelatexdvp{O : E\to F}finkitxmlcodeinlinelatexdvp


C'est à dire, plus simplement, pour une fonction de la variable réelle qui à x associe f(x) :

kitxmlcodeinlinelatexdvp{\begin{matrix}f:&\mathbb {R} &\longrightarrow &\mathbb {R} \\&x&\longmapsto &f(x)\end{matrix}}finkitxmlcodeinlinelatexdvp

Un vecteur kitxmlcodeinlinelatexdvp{\vec {u}}{\begin{pmatrix}u_{x}\\u_{y}\end{pmatrix}}finkitxmlcodeinlinelatexdvp est transformé en un vecteur kitxmlcodeinlinelatexdvp{\vec {v}}{\begin{pmatrix}f(u_{x})\\f(u_{y})\end{pmatrix}}finkitxmlcodeinlinelatexdvp.


Dans la même idée, on verra par la suite comment transformer un vecteur numpy en un autre vecteur en lui appliquant une fonction mathématique.

II-G. Barycentre et centroïde

On définit le barycentre de deux points A et B du plan affectés des coefficients de pondération a et b (avec la somme a + b non nulle) comme l'unique point G vérifiant la relation vectorielle :

kitxmlcodeinlinelatexdvp{a\overrightarrow{GA}+b\overrightarrow{GB}=\overrightarrow{0}}finkitxmlcodeinlinelatexdvp


Plus généralement, le barycentre des n points (A1, … , An) affectés des coefficients (a1, … , an) est l'unique point G tel que :

kitxmlcodeinlinelatexdvp{\sum_{i=1}^{n}a_{i}\overrightarrow{GA_{i}}=\overrightarrow{0}}finkitxmlcodeinlinelatexdvp


En mathématiques, le centre de masse ou centroïde d’un domaine du plan ou de l’espace est un point d’équilibre pour une certaine mesure sur ce domaine. Il correspond au centre pour un cercle ou une sphère, et plus généralement correspond au centre de symétrie lorsque le domaine en possède un. Mais son existence et son unicité sont garanties dès que le domaine est de mesure finie.

En géométrie, cette notion est synonyme de barycentre (pour un ensemble fini de points affectés de masses ponctuelles, le centre de masse est le barycentre des points pondérés).

Par exemple, le centroïde (ou isobarycentre) des n points (A1, … , An) affectés du même coefficient a est l'unique point G tel que:

kitxmlcodeinlinelatexdvp{\sum_{i=1}^{n}a\overrightarrow{GA_{i}}=\overrightarrow{0}}finkitxmlcodeinlinelatexdvp


On en déduit en introduisant dans la relation le point origine O(0, 0) et en divisant des deux côtés par a :

kitxmlcodeinlinelatexdvp\sum_{i=1}^{n}\left( \overrightarrow{GO}+ \overrightarrow{OA_{i}} \right)=\overrightarrow{0}finkitxmlcodeinlinelatexdvp


Equivalent à :

kitxmlcodeinlinelatexdvp\overrightarrow{OG}=\frac{1}{n}\sum_{i=1}^{n}\overrightarrow{OA_{i}}finkitxmlcodeinlinelatexdvp


On voit alors que G est aussi le point moyen entre les n points (A1, … , An).

On va d'ailleurs montrer à la fin de l'article que ce point G correspond bien au centre de masse dans le cas d'un disque homogène.

Cette formule est également utilisée dans la méthode des k-moyennes pour déterminer le centroïde de chaque groupe de points.

III. Les vecteurs avec numpy et matplotlib

III-A. Représentation des vecteurs

Un vecteur kitxmlcodeinlinelatexdvp{{\vec {u}}{\begin{pmatrix}3\\2\end{pmatrix}}}finkitxmlcodeinlinelatexdvp est défini avec la bibliothèque numpy par un tableau unidimensionnel numpy.array([3, 2]). Ce qui nous donne :

 
Sélectionnez
>>> import numpy as np
>>> u = np.array([3, 2])
>>> u
array([3, 2])


Ou en affichant le contenu du vecteur à l'aide de la fonction print() :

 
Sélectionnez
>>> import numpy as np
>>> u = np.array([3, 2])
>>> print(u)
[3 2]


Les composantes du vecteur correspondent donc aux éléments du tableau 1D (nombres réels, entiers, etc.).

Si vous souhaitez avoir plus d'informations sur les tableaux numpy, je vous invite à consulter cette documentation.


On peut ensuite tracer ce vecteur sur un graphique à partir de l'origine (0,0) et à l'aide de la fonction pyplot.quiver du module matplotlib :

 
Sélectionnez
import matplotlib.pyplot as plt
			
# Trace le vecteur u d'origine (0,0) et de composantes (3, 2)
plt.quiver(0, 0, 3, 2, color='b', angles = 'xy', scale_units = 'xy', scale = 1)


Ce qui nous donne :

 
Sélectionnez
import numpy as np
import matplotlib.pyplot as plt

# Place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
plt.plot(-2, -2, "None")
plt.plot(5, 5, "None")

# Trace un repère orthonormé
plt.axis('equal')  

# création du vecteur numpy
u = np.array([3,2])

# Trace le vecteur u d'origine (0,0) et de composantes (u[0], u[1])
plt.quiver(0, 0, u[0], u[1], color='b', angles = 'xy', scale_units = 'xy', scale = 1)

plt.title("Vecteur u(3, 2) d'origine (0, 0)")

# ajout de la grille sur le graphique
plt.grid()

# On affiche le graphique
plt.show()


L'exécution du code affiche :

Image non disponible

III-B. Addition de vecteurs

Comme pour des vecteurs classiques, on réalise l'addition de deux vecteurs numpy composante par composante :

 
Sélectionnez
>>> u = np.array([2, 3])
>>> v = np.array([3, -1])
>>> u+v
array([5, 2])


On peut maintenant tracer les vecteurs sur un graphique à l'aide du module matplotlib :

 
Sélectionnez
import numpy as np
import matplotlib.pyplot as plt

# On place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
plt.plot(-2, -2, "None")
plt.plot(5, 5, "None")

# Trace un repère orthonormé
plt.axis('equal')  

# création des vecteurs numpy
u = np.array([2,3])
v = np.array([3,-1])

# addition des vecteurs
w = u + v

# Trace le vecteur u d'origine (0,0) et de composantes (u[0], u[1])
plt.quiver(0, 0, u[0], u[1], color='b', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur v d'origine (u[0],u[1]) et de composantes (v[0], v[1])
plt.quiver(u[0], u[1], v[0], v[1], color='g', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur w d'origine (0,0) et de composantes (w[0], w[1])
plt.quiver(0, 0, w[0], w[1], color='r', angles = 'xy', scale_units = 'xy', scale = 1)

# ajout du titre
plt.title('Addition de vecteurs')

# ajout de la grille sur le graphique
plt.grid()

# On affiche la fenêtre graphique
plt.show()


Le code affiche :

Image non disponible

L'addition du vecteur kitxmlcodeinlinelatexdvp{\overrightarrow{u}}finkitxmlcodeinlinelatexdvp en bleu et du vecteur kitxmlcodeinlinelatexdvp{\overrightarrow{v}}finkitxmlcodeinlinelatexdvp en vert donne un troisième vecteur affiché en rouge.

III-C. Multiplication par un scalaire

La multiplication d'un vecteur u par un scalaire 2 se fait ainsi :

 
Sélectionnez
>>> u = np.array([2, 3])
>>> 2*u
array([4, 6])


Traçons maintenant les vecteurs sur un graphique à l'aide du module matplotlib :

 
Sélectionnez
import numpy as np
import matplotlib.pyplot as plt

# On place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
plt.plot(-2, -2, "None")
plt.plot(10, 10, "None")

# Trace un repère orthonormé
plt.axis('equal')  

# création du vecteur numpy u
u = np.array([2,3])

# scalaire
s = 2

# multiplication de u par le scalaire s
v = s*u

# Trace le vecteur u depuis l'origine (0,0) et de composantes (v[0], v[1])
plt.quiver(0, 0, u[0], u[1], color='b', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur v d'origine (1,0) et de composantes (v[0], v[1])
plt.quiver(1, 0, v[0], v[1], color='r', angles = 'xy', scale_units = 'xy', scale = 1)

# ajout du titre
plt.title("Multiplication d'un vecteur par un scalaire")

# ajout de la grille sur le graphique
plt.grid()

# Affiche le graphique
plt.show()


L'exécution du code affiche :

Image non disponible

En bleu le vecteur kitxmlcodeinlinelatexdvp{\overrightarrow{u}}finkitxmlcodeinlinelatexdvp et en rouge le vecteur obtenu après multiplication de kitxmlcodeinlinelatexdvp{\overrightarrow{u}}finkitxmlcodeinlinelatexdvp par 2.

III-D. Produit scalaire

Le produit scalaire de deux vecteurs numpy numpy.array([1, 2]) et numpy.array([3, 4]) se calcule avec la fonction numpy.dot :

 
Sélectionnez
>>> import numpy as np
>>> u = np.array([1, 2])
>>> v = np.array([3, 4])
>>> np.dot(u,v)
11

Le produit scalaire kitxmlcodeinlinelatexdvp{\overrightarrow{u}\cdot \overrightarrow{v}=1×3 + 2×4}finkitxmlcodeinlinelatexdvp est égal à 11.

III-E. Norme d'un vecteur

La norme d'un vecteur numpy numpy.array([3, 4]) s'obtient à l'aide de la fonction numpy.linalg.norm :

 
Sélectionnez
>>> import numpy as np
>>> u = np.array([3, 4])
>>> np.linalg.norm(u)
5.0

Ici la norme kitxmlcodeinlinelatexdvp{\left\| \overrightarrow{u} \right\| = \sqrt{3^{2}+4^{2}}}finkitxmlcodeinlinelatexdvp vaut 5.

III-F. Transformation d'un vecteur numpy à l'aide d'une fonction

On peut également appliquer une fonction à un tableau numpy pour le transformer en un autre tableau de même taille :

 
Sélectionnez
>>> u = np.array([4, 9, 16])
>>> np.sqrt(u)
array([2., 3., 4.])


Traçons maintenant un cercle à l'aide de cette propriété :

 
Sélectionnez
import numpy as np
import matplotlib.pyplot as plt

# nom et dimension de la figure contenant le graphique
plt.figure(num="Application d'une fonction à un veteur numpy", figsize=(7, 6), dpi=80)

# même échelle sur l'axe des x et des y
plt.axis('scaled')

# trace le point centre du cercle en rouge
plt.scatter(0, 0, s=20, color = 'r')

# génération du tableau de 10 000 valeurs comprises entre -1 et +1
x = np.linspace(-1, 1, 10000)

# valeurs correspondantes en y : demi-cercle supérieur : y = sqrt(1-x^2)
y = np.sqrt(1-x*x)

# trace le cercle de centre (0,0) et de rayon 1
plt.plot(x, y, color='r', linewidth=2)
plt.plot(x, -y, color='r', linewidth=2)

# limites inférieures et supérieures sur l'axe des x et des y
plt.xlim(-1.5, 1.5); plt.ylim(-1.5, 1.5)

# ajout du titre
plt.title("Cercle de centre (0,0) et de rayon 1")

# Affiche le graphique
plt.show()

Les valeurs positives des y sont données par la formule np.sqrt(1-x*x) et les valeurs négatives par -np.sqrt(1-x*x).


L'exécution du code affiche :

Image non disponible

III-G. Isobarycentre et centre de masse

III-G-1. Isobarycentre de 3 points dans le plan

On souhaite déterminer la position de l'isobarycentre de 3 points A, B et C, affectés donc du même coefficient de pondération. On va utiliser pour cela la formule :

kitxmlcodeinlinelatexdvp{\overrightarrow{OG}=\frac{1}{3}(\overrightarrow{OA}+\overrightarrow{OB}+\overrightarrow{OC})}finkitxmlcodeinlinelatexdvp


Il nous faut d'abord positionner les 3 points sur le plan :

 
Sélectionnez
# création des trois points A(2,2), B(4,5) et C(6,2)
A = (2,2)
B = (4,5)
C = (6,2)
					
# Trace le point A en bleu
plt.scatter(A[0], A[1], s=10, color = 'b')

# Trace le point B en vert
plt.scatter(B[0], B[1], s=10, color = 'g')

# Trace le point C en orange
plt.scatter(C[0], C[1], s=10, color = 'orange')


Puis construire et tracer les 3 vecteurs depuis l'origine vers ces 3 points :

 
Sélectionnez
# construction des vecteurs associés aux 3 points
OA = np.array(A)
OB = np.array(B)
OC = np.array(C)
					
# Trace le vecteur OA
plt.quiver(0, 0, A[0], A[1], color='b', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur OB 
plt.quiver(0, 0, B[0], B[1], color='g', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur OC 
plt.quiver(0, 0, C[0], C[1], color='orange', angles = 'xy', scale_units = 'xy', scale = 1)


Et enfin déterminer et tracer l'isobarycentre G de ces 3 points :

 
Sélectionnez
# détermination du vecteur OG reliant l'origine à l'isobarycentre des 3 points
OG  = (1/3)*(OA+OB+OC)

# Trace le point G en rouge
plt.scatter(OG[0], OG[1], s=10, color = 'r')


Ce qui donne le code complet :

 
Sélectionnez
import numpy as np
import matplotlib.pyplot as plt
				
# Place deux points qu'on n'affiche pas afin de délimiter l'étendue des axes
plt.plot(0, 0, "None")
plt.plot(7, 7, "None")

# même échelle sur l'axe des x et des y
plt.axis('scaled')

# Trace un repère orthonormé
plt.axis('equal')

# création des trois points A(2,2), B(4,5) et C(6,2)
A = (2,2)
B = (4,5)
C = (6,2)

# Trace le point A en bleu
plt.scatter(A[0], A[1], s=20, color = 'b')

# Trace le point B en vert
plt.scatter(B[0], B[1], s=20, color = 'g')

# Trace le point C en orange
plt.scatter(C[0], C[1], s=20, color = 'orange')

print('Point A{0}'.format(A))
print('Point B{0}'.format(B))
print('Point C{0}'.format(C))

# Trace le triangle
x1, y1 = [A[0], B[0]], [A[1], B[1]]
x2, y2 = [B[0], C[0]], [B[1], C[1]]
x3, y3 = [A[0], C[0]], [A[1], C[1]]

plt.plot(x1, y1, x2, y2, x3, y3, color="black")

# construction des vecteurs associés aux 3 points
OA = np.array(A)
OB = np.array(B)
OC = np.array(C)

# Trace sur le graphique les 3 vecteurs obtenus 

# Trace le vecteur OA
plt.quiver(0, 0, A[0], A[1], color='b', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur OB 
plt.quiver(0, 0, B[0], B[1], color='g', angles = 'xy', scale_units = 'xy', scale = 1)

# Trace le vecteur OC 
plt.quiver(0, 0, C[0], C[1], color='orange', angles = 'xy', scale_units = 'xy', scale = 1)


# détermination du vecteur OG reliant l'origine à l'isobarycentre des 3 points
OG  = (1/3)*(OA+OB+OC)

# Trace le point G en rouge
plt.scatter(OG[0], OG[1], s=20, color = 'r')

print()

print("Isobarycentre G{0}".format((OG[0],OG[1])))

print()      

print("Génération du graphique ...\n")

# ajout du titre
plt.title("Isobarycentre de 3 points")

# Affiche le graphique
plt.show()


L'exécution du script affiche :

 
Sélectionnez
Point A(2, 2)
Point B(4, 5)
Point C(6, 2)

Isobarycentre G(4.0, 3.0)

Génération du graphique ...


Puis le graphique :

Image non disponible

L'isobarycentre des sommets du triangle correspond en fait au point d'intersection des médianes.

III-G-2. Centre de masse d'un disque

Soient n points kitxmlcodeinlinelatexdvp{\left( A_{1},\cdots ,A_{n} \right)}finkitxmlcodeinlinelatexdvp affectés du même coefficient de pondération et répartis uniformément sur un disque de centre (ox, oy) et de rayon r. Ces n points peuvent être associés à n vecteurs kitxmlcodeinlinelatexdvp{\left( \overrightarrow{OA}_{1},\cdots ,\overrightarrow{OA}_{n} \right)}finkitxmlcodeinlinelatexdvp.

Notre objectif est de vérifier, à l'aide de la relation kitxmlcodeinlinelatexdvp{\overrightarrow{OG}=\frac{1}{n}\sum_{i=1}^{n}\overrightarrow{OA_{i}}}finkitxmlcodeinlinelatexdvp, que le point moyen G correspond bien au centre du disque supposé homogène. Pour cela, on va d'abord générer les n vecteurs kitxmlcodeinlinelatexdvp{\left( \overrightarrow{OA}_{1},\cdots ,\overrightarrow{OA}_{n} \right)}finkitxmlcodeinlinelatexdvp issus de l'origine et ayant pour extrémités les n points.

Donnons maintenant le déroulé de la fonction génératrice des vecteurs :

  • 1. Initialisation de la liste des vecteurs ;
  • 2. Parcours des ux entre -r à +r ;
  • --- 2.1 Parcours des uy entre -r à +r ;
  • ------ 2.1.1. Si le point de coordonnées (ux, uy) est dans le cercle : ajout du vecteur (ux+ox, uy+oy) à la liste ;
  • 3. Renvoi de la liste des vecteurs.

On obtient ainsi le code :

 
Sélectionnez
def generer_vecteurs(ox=0, oy=0, r=1, k=100):
    # ox, oy : coordonnées du centre du disque
    # r : rayon du disque
    # k : nombre de valeurs en x et en y

    # initialisation de la liste des vecteurs
    vecteurs=[]
        
    # parcours des ux entre -r à +r
    for ux in np.linspace(-r,r,k):
        # parcours des uy entre -r et +r
        for uy in np.linspace(-r,r,k):
            # test si le point de coordonnées (ux,uy) est dans le cercle
            if ux*ux + uy*uy <= r*r:
                # si oui, ajout du vecteur (ux+ox,uy+oy) à la liste
                vecteurs.append(np.array([ux+ox,uy+oy]))

    # renvoie la liste des vecteurs
    return vecteurs


Ce qui peut également s'écrire en une ligne à l'aide d'une liste en compréhension avec double for :

 
Sélectionnez
vecteurs = [np.array((ux+ox,uy+oy)) for ux in np.linspace(-r,r,k) for uy in np.linspace(-r,r,k) if ux*ux + uy*uy <= r*r]

On utilise ici l'inéquation kitxmlcodeinlinelatexdvp{u_{x}^{2}+u_{y}^{2}\le r^{2}}finkitxmlcodeinlinelatexdvp pour savoir si le point est situé dans le cercle de rayon r, avec ux et uy compris entre -r et +r. Libre à chacun d'adapter le code à sa figure (ellipse, etc.).


Ensuite, il faut déterminer le vecteur kitxmlcodeinlinelatexdvp{\overrightarrow{OG}}finkitxmlcodeinlinelatexdvp à partir de la liste obtenue :

 
Sélectionnez
# génération des vecteurs correspondant aux points uniformément répartis sur le disque
vecteurs = generer_vecteurs(ox, oy, r, k)

# nombre de vecteurs
n = len(vecteurs)

# détermination du vecteur OG correspondant au point moyen G : somme des vecteurs et multiplication par un scalaire 1/n
OG  = (1/n)*sum(vecteurs)


Enfin, il faut afficher sur le graphique les points générés et le point moyen G :

 
Sélectionnez
# trace les points générés
plt.scatter(x, y, s=0.5)

# trace le point moyen G (en rouge)
plt.scatter(OG[0], OG[1], s=20, color = 'r')


On donne maintenant le code complet :

 
Cacher/Afficher le codeSélectionnez
import numpy as np
import matplotlib.pyplot as plt

# nombre de valeurs distincts en x et en y
k = 500

print("Nombre de valeurs distinctes en x, k =", k)

print()

# longueur du rayon
r = 1

print("Longueur du rayon, r =", r)

# coordonnées du centre du cercle
ox, oy = 1, 1

print("Coordonnées du centre du disque :", (ox, oy))

print()

# génération des vecteurs correspondant aux points uniformément répartis sur le disque
# vecteurs = generer_vecteurs(ox, oy, r, k)
vecteurs = [np.array((ux+ox,uy+oy)) for ux in np.linspace(-r,r,k) for uy in np.linspace(-r,r,k) if ux*ux + uy*uy <= r*r]

# nombre de vecteurs
n = len(vecteurs)

# détermination du vecteur OG correspondant au point moyen G : somme des vecteurs et multiplication par un scalaire 1/n
OG  = (1/n)*sum(vecteurs)

print("Coordonnées du point moyen G :", (OG[0], OG[1]))

# création à partir des points des tableaux numpy x et y 
x = np.array([v[0] for v in vecteurs])
y = np.array([v[1] for v in vecteurs])

print()

print("Génération du graphique ...\n")

# nom et dimension de la figure contenant le graphique
plt.figure(num="Point moyen : estimation de la position du centre de masse du disque", figsize=(7, 6), dpi=80)

# même échelle sur l'axe des x et des y
plt.axis('scaled')

# trace le point origine du repère en rouge
plt.scatter(0, 0, s=10, color = 'r')

# trace les points générés
plt.scatter(x, y, s=0.5)

# trace le point origine du cercle en jaune
plt.scatter(ox, oy, s=40, color = 'yellow')

# trace le point moyen G (en rouge)
plt.scatter(OG[0], OG[1], s=20, color = 'r')

# génération des 10*k valeurs en x entre -r+ox et +r+ox
x = np.linspace(-r,r,10*k)+ox

# valeurs correspondantes en y : demi-cercle supérieur : f(x) = sqrt(r^2-(x-ox)^2)
y = np.sqrt(r*r-(x-ox)*(x-ox))

# trace le cercle de centre ox, oy
plt.plot(x, y+oy, color='r', linewidth=1)
plt.plot(x, -y+oy, color='r', linewidth=1)

# limites inférieures et supérieures sur l'axe des x et des y
plt.xlim(-r+ox-0.1, r+ox+0.1); plt.ylim(-r+oy-0.1, r+oy+0.1)

# ajout du titre
plt.title("Position de G sur le disque de centre ({0},{1}) et de rayon {2}".format(ox,oy,r))

# Affiche le graphique
plt.show()

Les valeurs positives des y du cercle sont données par la formule np.sqrt(r*r-(x-ox)*(x-ox))+oy et les valeurs négatives par -np.sqrt(r*r-(x-ox)*(x-ox))+oy.


Le code affiche :

 
Sélectionnez
Nombre de valeurs distinctes en x, k = 500

Longueur du rayon, r = 1
Coordonnées du centre du disque : (1, 1)

Coordonnées du point moyen G : (1.0000000000000835, 1.0)

Génération du graphique ...


Puis le graphique :

Image non disponible

On constate que le point moyen G (en rouge) obtenu à l'aide de la formule vectorielle se confond avec le centre du cercle (en jaune). Si la répartition des points dans le cercle n'est pas parfaitement uniforme, cela peut entrainer de légères erreurs de positionnement du point moyen par rapport au centre du cercle (centre de symétrie).

III-G-3. Centre de masse d'un demi-disque

On souhaite cette fois approcher, toujours à l'aide de la relation kitxmlcodeinlinelatexdvp{\overrightarrow{OG}=\frac{1}{n}\sum_{i=1}^{n}\overrightarrow{OA_{i}}}finkitxmlcodeinlinelatexdvp, le centre de masse d'un demi-disque supposé homogène (partie supérieure du disque de centre (ox, oy) et de rayon r).

On va donc d'abord générer les n vecteurs kitxmlcodeinlinelatexdvp{\left( \overrightarrow{OA}_{1},\cdots ,\overrightarrow{OA}_{n} \right)}finkitxmlcodeinlinelatexdvp correspondant aux n points uniformément répartis :

 
Sélectionnez
vecteurs = [np.array((ux+ox,uy+oy)) for ux in np.linspace(-r,r,k) for uy in np.linspace(0,r,k) if ux*ux + uy*uy <= r*r]


Ensuite, il nous faut déterminer le vecteur kitxmlcodeinlinelatexdvp{\overrightarrow{OG}}finkitxmlcodeinlinelatexdvp à partir de la liste obtenue :

 
Sélectionnez
# nombre de vecteurs
n = len(vecteurs)

# détermination du vecteur OG correspondant au point moyen G : somme des vecteurs et multiplication par un scalaire 1/n
OG  = (1/n)*sum(vecteurs)


Enfin, on affiche sur le graphique les points générés et le point moyen G :

 
Sélectionnez
# trace les points générés
plt.scatter(x, y, s=0.5)

# trace le point moyen G (en rouge)
plt.scatter(OG[0], OG[1], s=20, color = 'r')


On donne maintenant le code complet :

 
Cacher/Afficher le codeSélectionnez
import numpy as np
import matplotlib.pyplot as plt

# nombre de valeurs distincts en x et en y
k = 1000

print("Nombre de valeurs distinctes en x, k =", k)

print()


# longueur du rayon
r = 1

print("Longueur du rayon, r =", r)

# coordonnées du centre du disque
ox, oy = 1, 1

# coordonnées du centre de masse du demi-disque (ox, oy + 4r/3Pi)
cx, cy = ox, oy + (4*r)/(3*np.pi)

print("Coordonnées du centre de masse du demi-disque :", (cx, cy))

print()

# génération des vecteurs correspondant aux points uniformément répartis sur le demi-disque
vecteurs = [np.array((ux+ox,uy+oy)) for ux in np.linspace(-r,r,k) for uy in np.linspace(0,r,k) if ux*ux + uy*uy <= r*r]

# nombre de vecteurs
n = len(vecteurs)

# détermination du vecteur OG correspondant au point moyen G : somme des vecteurs et multiplication par un scalaire 1/n
OG  = (1/n)*sum(vecteurs)

print("Coordonnées du point moyen G :", (OG[0], OG[1]))

# création à partir des points des tableaux numpy x et y 
x = np.array([v[0] for v in vecteurs])
y = np.array([v[1] for v in vecteurs])

print()

print("Génération du graphique ...")

# nom et dimension de la figure contenant le graphique
plt.figure(num="Point moyen : estimation de la position du centre de masse du demi-disque", figsize=(7, 6), dpi=80)

# même échelle sur l'axe des x et des y
plt.axis('scaled')

# trace les points générés
plt.scatter(x, y, s=0.5)

# trace le point centre de masse en jaune
plt.scatter(cx, cy, s=40, color = 'yellow')

# trace le point moyen G (en rouge)
plt.scatter(OG[0], OG[1], s=20, color = 'r')

# génération des 10*k valeurs en x entre -r+ox et +r+ox
x = np.linspace(-r,r,10*k)+ox

# valeurs correspondantes en y : demi-cercle supérieur : f(x) = sqrt(r^2-(x-ox)^2)
y = np.sqrt(r*r-(x-ox)*(x-ox))

# trace le cercle de centre ox, oy
plt.plot(x, y+oy, color='r', linewidth=1)

# limites inférieures et supérieures sur l'axe des x et des y
plt.xlim(-r+ox-0.1, r+ox+0.1); plt.ylim(-0.1+oy, r+oy+0.1)

# ajout du titre
plt.title("Position de G sur le demi-disque de centre ({0},{1}) et de rayon {2}".format(ox,oy,r))

# Affiche le graphique
plt.show()

Le point de coordonnées kitxmlcodeinlinelatexdvp{\left( o_{x},o_{y}+\frac{4r}{3\pi} \right)}finkitxmlcodeinlinelatexdvp est le centre de masse d'un demi-disque de rayon r et dont le disque complet a pour origine kitxmlcodeinlinelatexdvp{\left( o_{x},o_{y} \right)}finkitxmlcodeinlinelatexdvp (voir cette page pour plus de détails).


Le code affiche :

 
Sélectionnez
Nombre de valeurs distinctes en x, k = 1000

Longueur du rayon, r = 1
Coordonnées du centre de masse du demi-disque : (1, 1.4244131815783876)

Coordonnées du point moyen G : (0.99999999999634803, 1.4241421003656138)

Génération du graphique ...


Puis le graphique :

Image non disponible

On remarque une nouvelle fois que le point moyen G (en rouge) obtenu à l'aide de la formule vectorielle est très proche du centre de masse (en jaune).

Libre à chacun d'adapter le script pour approcher le centre de masse d'une autre figure géométrique.

IV. Conclusion

Nous voici donc arrivé au terme de notre article dans lequel nous avons su manipuler et représenter graphiquement ces vecteurs en Python.

Comme cela a été dit, l'utilisation des vecteurs ne se limite bien sûr pas à ces quelques exemples. En mathématiques, ils interviennent aussi dans la résolution de systèmes d'équations à plusieurs inconnus, ou de systèmes différentiels. En physique, ils permettent également de représenter les forces agissant sur un objet, la vitesse d'un mobile en un point, etc.

V. Téléchargement

Le fichier compresséfichier de test contenant le module Python pour effectuer les différents tests.

VI. Remerciements

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2025 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.