Matrices et Python¶
L'objectif de ce travail est d'apprendre à définir et à utiliser des matrices dans un script Python.
Ce document est disponible en mode interactif à partir du lien ci-dessous.
Chaque bloc de code (fond gris) doit être exécuté (flèche noire en haut de page ou Shift + Enter et peut être modifié au fur et à mesure de la lecture.
Définition et opérations¶
Définition d'une matrice¶
Pour travailler avec les matrices, nous utiliserons la librairie Python numpy, référence pour le calcul scientifique en Python. Pour cela, la première chose à faire est d'importer cette librairie.
Les matrices peuvent ensuite être définies avec l'instruction array de la librairie numpy, qui prend en argument la liste des lignes de la matrice à définir.
Le code ci-dessous définit la matrice $A=\begin{pmatrix} 2 & -4 & 0 \\ -1 & -2 & 1\end{pmatrix}$ de taille $2\times 3$ et la matrice $B=\begin{pmatrix} -2 & -1 \\ 0 & 1\end{pmatrix}$ de taille $2\times 2$.
La fonction np.shape() renvoie la taille d'une matrice sous la forme d'un couple d'entiers.
import numpy as np
A = np.array([[2,-4,0],[-1,-2,1]])
B = np.array([[-2,-1],[0,1]])
print(A, np.shape(A))
print(B, np.shape(B))
Somme, différence, produit par un réel¶
L'addition de deux matrices de même taille se fera simplement avec le signe +, la soustraction avec le signe -.
Pour multiplier une matrice par un réel, on utilisera le symbole *.
C = 2*A
print(C)
print(A+C)
print(A-C)
Produit de deux matrices¶
Pour le produit de matrices, il faut faire attention ! Le symbole * entre deux matrices de même taille renvoie la matrice dont les coefficients sont les produits terme à terme des coeficients des deux matrices de départ. Cela ne correspond pas au produit de deux matrices.
print(A*C)
Avec une version récente de Python (à partir de la version 3.5), on peut réaliser un produit de matrices en utilisant le symbole @. Pour des versions plus anciennes, on utilise la fonction np.dot().
Bien entendu, on ne peut multiplier une matrice de taille $m\times n$ que par une matrice de taille $n\times p$ !
Dans notre exemple, on peut calculer le produit $B\times A$ de la matrice $B$ de taille $2\times 2$ par la matrice $A$ de taille $2\times 3$ par
print(B@A)
print(np.dot(B,A))
Puissance et inverse d'une matrice carrée¶
Pour calculer la puissance d'une matrice carrée, nous aurons besoin d'une fonction supplémentaire matrix_power(B,n) de la sous-librairie linalg du module numpy.
$B$ doit être une matrice carrée. Si $n$ est un entier naturel, la fonction renvoie la matrice $A^n$ ; si $n=0$, elle envoie la matrice identité de même taille que $B$ ; si $n=-1$ et si $B$ est inversible, elle renvoie l'inverse de la matrice $B$.
from numpy.linalg import matrix_power
for k in range(5):
print("B^",k,"=",matrix_power(B,k))
print("Inverse de B : ",matrix_power(B,-1))
Fonctions complémentaires¶
Voici quelques exemples d'autres fonctions disponibles sur les matrices.
- La commande
.Tpermet d'obtenir la transposée d'une matrice (échange entre les lignes et les colonnes). np.zeros((n,p))renvoie la matrice nulle de taille $n\times p$.np.eye(n,p)renvoie la matrice diagonale de taille $n\times p$ avec des 1 sur la diagonale.np.ones((n,p))renvoie la matrice de taille $n\times p$ remplie de 1.np.random.randint(n1,n2,(n,p))renvoie une matrice de taille $n\times p$ remplie d'entiers aléatoires compris entre $n_1$ inclus et $n_2$ exclu.
print(A.T)
print()
print(np.zeros((2,6)))
print()
print(np.eye(6,6))
print()
print(np.ones((2,6)))
print()
print(np.random.randint(1,10,(5,5)))
Exercice : calcul de la puissance d'une matrice carrée¶
On rappelle que la matrice $B$ a été définie en début de notebook par $B=\begin{pmatrix} -2 & -1 \\ 0 & 1\end{pmatrix}$.
On souhaite déterminer une formule générale pour $B^n$.
- Compléter le script ci-dessous pour qu'il affiche les matrices $B^n$, de $n=1$ à $n=10$.
- En déduire une conjecture donnant $B^n$ en fonction de $n$ sous la forme $\begin{pmatrix} a_n & b_n \\ c_n & d_n\end{pmatrix}$, en précisant la conjecture pour les valeurs de $a_n$, $c_n$ et $d_n$.
- Montrer par récurrence que les suites $a_n$, $c_n$ et $d_n$ ont bien les expressions conjecturées à la question précédente et que la suite $b_n$ vérifie, pour tout entier $n\geqslant 1$, $b_{n+1}=-2b_n-1$. (Indication : on admettra qu'une matrice carrée et une de ses puissances commutent, autrement dit : $B^n\times B=B\times B^n=B^{n+1}$.)
- Pour tout entier $n\geqslant 1$, on pose $u_n=b_n+\frac{1}{3}$. Montrer que la suite $(u_n)$ est géométrique.
- En déduire l'expression de $u_n$, puis de $b_n$ en fonction de $n$, pour n entier naturel non nul.
- Donner enfin la forme générale de $B^n$ en fonction de $n$.
# Entrer votre script ci-dessous
Exercice : Résolution d'un système d'équations¶
On s'intéresse au système suivant : $\mathcal{S}\left\{\begin{array}{l}x+y-z=1 \\ -x+2y+z=0 \\ 2x+y-z=1\end{array}\right.$.
On admet que ce système possède une unique solution dans $\mathbb{R}^3$.
Compléter le script ci-dessous en définissant les matrices $A$ et $B$ qui permettent d'écrire la forme matricielle $AX=B$ de ce système et en faisant les calculs nécessaires à l'affichage du vecteur colonne $X$ des solutions.
# Entrer votre script ci-dessous