Les matrices et les vecteurs occupent une place prépondérante en algèbre en Python dans les sujets de concours. Il est donc nécessaire d’en maîtriser l’ensemble des commandes (assez simples). Cet article passe en revue tous les outils qui peuvent te permettre de réussir ces questions en Python, conformément aux programmes de maths appliquées et approfondies.
Pour la suite de l’article, on considère que l’on a importé les librairies numpy et linalg (import numpy as np et import numpy.linalg as al).
Coder un vecteur
Pour construire un vecteur, il y a trois méthodes simples.
Méthode 1 : La première technique consiste à écrire directement le vecteur qui nous intéresse, coefficient par coefficient. Pour ce faire, on utilise la commande :
Elle nous donne le vecteur \(\begin{pmatrix} a, & b, & c\end{pmatrix}\).
Méthode 2 : La deuxième méthode permet d’écrire plus rapidement des vecteurs pour lesquels l’écart entre chaque valeur (« le pas ») est connu et ne change pas entre chaque coefficient. Ainsi, la commande
(avec b > a et c > 0) donne le vecteur \(\begin{pmatrix} a ,& a+c ,& a+2c ,\ldots \end{pmatrix}.\) À noter que les « … » s’arrêtent à la dernière valeur strictement inférieure à b. La commande fonctionne également avec a > b et c < 0. De plus, si c n’est pas mentionné, il vaudra 1 par défaut.
Méthode 3 : La troisième commande (bien moins fréquente) sert à créer un vecteur de n coefficients équirépartis, commençant par la valeur a et finissant par la valeur b. Pour cela, on utilise :
Un exemple permet de mieux comprendre ce que fait cette commande :
donne le vecteur \(\begin{pmatrix} 3 ,& 4,5 ,& 6 ,& 7,5 ,& 9\end{pmatrix}\). On remarque qu’il y a bien 5 valeurs (n), allant de 3 (a) à 9 (b), avec à chaque fois le même écart entre chaque coefficient : 1,5.
Il existe également deux commandes qui permettent d’écrire des vecteurs prédéfinis. La commande
renvoie un vecteur avec n coefficients égaux à 0 et
renvoie un vecteur avec m coefficients égaux à 1.
Coder une matrice
Pour coder directement une matrice, il y a cette fois-ci moins d’outils disponibles.
Premièrement, on peut coder « à la main » la matrice, coefficient par coefficient (comme pour les vecteurs). Ainsi, la commande
donne la matrice \(\begin{pmatrix} a & b & c
\\ d & e & f \end{pmatrix}.\)
Remarque : np.array( [a,b,c] ) et np.array ( \(\color{red}{[}\)[a,b,c]\(\color{red}{]}\)) ne sont pas tout à fait les mêmes objets : le premier est un vecteur alors que le deuxième est une matrice ligne.
Deuxièmement, on peut utiliser les matrices prédéfinies sur Python ; il y en a au total 3. La commande
renvoie une matrice de \( \mathcal{M}_{n,p}(\mathbb{R}) \)avec que des coefficients égaux à 0. Avec le même principe, la commande
renvoie une matrice de \( \mathcal{M}_{n,p}(\mathbb{R}) \) avec que des 1. Enfin, il est possible de coder la matrice identité de \(\mathcal{M}_{n}(\mathbb{R})\) grâce à la commande
La matrice np.eye(n,p) fonctionne également comme la matrice identité, puisque tous ses coefficients sont nuls, sauf les coefficients avec i=j, qui valent 1.
Opérations avec les matrices et les vecteurs
On distingue deux types d’opérations avec les matrices : celles qui ne nécessitent pas de commande particulière et les autres.
Opérations simples (sans commande particulière)
On dénombre cinq opérations communes aux vecteurs et aux matrices qui ne demandent pas d’usage de commande :
- L’opération a*\(M\) renvoie la matrice \(aM\).
- L’opération \(A+B\) renvoie la matrice \(A+B\).
- Pareil que la 2, mais avec la soustraction.
- L’opération \(A\)*\(B\) renvoie la matrice \((a_{i,j}b_{i,j})_{1 \le i,j \le n}\).
- L’opération \(A\)**\(B\) renvoie \((a_{i,j}^{b_{i,j}})_{1 \le i,j \le n}\).
Opérations plus élaborées (utilisation d’une commande nécessaire) propres aux matrices
- Pour faire le produit de deux matrices \(A\) et \(B\) (sous réserve que le produit matriciel soit bien défini), on utilise np.dot(A,B).
- Pour calculer la transposée d’une matrice \(A\), on utilise np.transpose (A).
- Pour calculer l’inverse d’une matrice \(A\) (si \(A\) est inversible), on utilise al.inv (A).
- Pour calculer le rang d’une matrice \(A\), on utilise al.matrix_rank (A).
- Pour calculer \(A^{n}\) (si \(A\) appartient à \(\mathcal{M}_{p}(\mathbb{R})\) et n un entier naturel), on utilise al.matrix_power (A,n).
- Si \(A\) est inversible et si le produit matriciel \(AX=B\) est bien défini, alors al.solve (A,B) renvoie la solution \(X\) de l’équation \(AX=B\) (une commande rarement utilisée, mais au programme…).
- np.shape (A) renvoie (i,j), avec i correspondant au nombre de lignes de \(A\) et j correspondant au nombre de colonnes de \(A\).
Remarque : on retient donc que si l’on veut faire le produit de deux matrices \(A\) et \(B\), on ne fait surtout pas \(A\)*\(B\) mais bien np.dot (A,B) !
Voici un exemple de programme qui utilise le produit matriciel « classique » :
Opérations communes aux matrices et aux vecteurs nécessitant une commande
- np.sum (A) renvoie la somme des coefficients de A. Par exemple, renvoie 10 (1+2+3+4).
- np.cumsum (A) renvoie la somme cumulée des coefficients de A sous la forme d’une matrice de même taille que A. Ainsi, renvoie \(\begin{pmatrix} 1 & 3 \\ 6
& 10\end{pmatrix}\). - np.min (A) et np.max (A) renvoient respectivement le plus petit et le plus grand coefficient de \(A\).
- Si \(u\) est un vecteur, u[k] renvoie le \({k-1}^{ième}\) coefficient du vecteur \(u\). Si \(A\) est une matrice, A[i,j] renvoie le coefficient \(a_{i-1,j-1}\). En effet, les indices sur Python commencent à 0 et sont donc décalés de 1 par rapport à ceux des matrices « normales » ! Par conséquent, si \(A=\begin{pmatrix} 1 & 3 \\ 6 & 10\end{pmatrix}\), A(1,1) correspond à \(a_{2,2}\) = 4 et A(0,0) correspond à \(a_{1,1}\)=1 et A(0,1) correspond à \(a_{1,2}\)=2. De plus. A[i,j] = b affecte la valeur b au coefficient \(a_{i-1,j-1}\).
- len(A) renvoie le nombre d’éléments de \(A\).
- A[i,:] renvoie la \({i-1}^{ième}\) ligne de \(A\) sous la forme d’un vecteur. Ça marche également pour A[:,j]. Comme pour la 4, on peut affecter un vecteur à la place d’une ligne ou d’une colonne.
- Si \(u\) est un vecteur, u[n:m] (m>n) renvoie le vecteur \(\begin{pmatrix} u_{n – 1} ,& \ldots ,& u_{m-2}\end{pmatrix}\).
Bonus
La commande qui suit n’est pas officiellement au programme, mais elle est très utile et peut être donnée en début de sujet. Il est donc intéressant de la connaître.
al.eig (A) renvoie (S,P), avec S un tableau avec les valeurs propres de \(A\) (son spectre) et P une matrice de passage de \(A\). Le plus intéressant avec cette commande est le fait que al.eig (A)[0] renvoie uniquement le spectre de \(A\), notion très utile dans les sujets de concours (par exemple, faire un programme dans lequel on montre que le spectre de A est inclus dans \(\mathbb{R}_{+}^{*}\)).
Exercice
Voici un petit exercice pour voir si tu as bien compris les notions abordées. Trouve à quoi correspondent C, D et E, puis vérifie tes résultats à l’aide d’un compilateur Python (pour ce faire, tu peux copier ce programme à l’aide de l’émoticône en haut à droite).
Conclusion
Te voilà enfin bien armé(e) pour affronter la moindre question de Python avec des vecteurs et des matrices ! Si tu souhaites t’entraîner avec des exercices de Python sur les matrices, je te recommande le sujet 0 de maths 1 HEC en maths appro en 2023.
Tu peux aussi jeter un coup d’œil aux autres articles consacrés à Python, ou bien consulter le méga-répertoire d’annales de maths approfondies.