import numpy as np
import random as rd
Les matrices sont essenetielles car elles donnent la possibilité d'effectuer des opérations sur des tableaux de nombres. On peut citer de nombreuses applications :
Définition : On appelle matrice $m \times n$ (ou d’ordre $m \times n$) à coefficients dans $\mathbb{K}$ tout tableau de m lignes et n colonnes d’éléments de $\mathbb{K}$. L’ensemble des matrices $m \times n$ à coefficients dans $\mathbb{K}$ est noté $\mathcal{M}_{ m,n}(\mathbb{K})$.
Nous travaillerons avec $\mathbb{K} = \mathbb{R}, \mathbb{Q} \text{ ou } \mathbb{C}$
On convient de noter $a_{ij}$ l’élément de la matrice situé sur la i-ème ligne et j-ème colonne ($1 \leq i \leq m\quad$ et $\quad1 \leq j \leq n$).
ou encore
Exercice Donner un exemple pour chaque matrice particulière
print
print(np.array([[1,9,5]])) #matrice ligne de type ndarray
print
print(np.array([[2],[7],[3]])) #matrice colonne
print
print(np.zeros([4,3])) #matrice nulle d'ordre 4,3
print
print(np.eye(3)) #matrice identité d'ordre 3
print
print(np.diag([4,0])) #matrice diagonale d'ordre 2
print
print(np.diag([int(rd.random()*100) for i in range(4)])) #matrice diagonale d'ordre 4
Sélectionner une ligne ou une colonne dans une matrice numpy
Soit un tableau numpy $tab$, la sélection d'une ligne ou d'une colonne se fait avec la la technique du slicing qui est une forme avancée de l’indexation. La syntaxe est la suivante.
$$tab[debut:fin:pas, debut:fin:pas]$$print
tab = np.array([[int(rd.random()*10) for j in range(3)]for i in range(3)])
print(tab)
print
print(tab[0:1,:]) # La première ligne
print
print(tab[:,-1]) #La dernière colonne
print
print(tab[0:2,0:2]) #Le carré 2x2 en haut à gauche
Deux matrices $A$ et $B$ sont égales, ce qu’on note $A = B$ si
On appelle opérations élémentaires sur les lignes :
Définition
On dit que deux matrices $A$ et $A'$ sont équivalentes par lignes si elles se déduisent l'une de l'autre par une suite finie d'opérations élémentaires. On note $A {_{\stackrel{\LARGE\sim}{\text{L}}}} A'$. La relation $ {_{\stackrel{\LARGE\sim}{\text{L}}}} $ est une relation d'équivalence sur l'ensemble des matrices de $\mathcal{M}_{ m,n}(\mathbb{K})$
Soient $A = (a_{ij})_{ \begin{array}{c}1\leq i\leq m\\1\leq j\leq n \end{array}}$ et $B = (b_{ij})_{ \begin{array}{c}1\leq i\leq m\\1\leq j\leq n \end{array}}$ deux matrices de $\mathcal{M}_{ m,n}(\mathbb{K})$, on définit l’addition des matrices par $$A + B = (a_{ij} + b_{ij})_{ \begin{array}{c}1\leq i\leq m\\1\leq j\leq n \end{array}}$$
Soient $A$, $B$, $C$ trois matrices de $\mathcal{M}_{ m,n}(\mathbb{K})$
Exercices
Effectuer la somme suivante
L’opérateur $+$ additionne terme à terme deux tableaux de même dimension. Donc très pratique pour l'addition de deux matrices
A = np.array([[-1, 4, 1],[0, 1, 1]])
B = np.array([[1, 3, -1],[1, 5, 8]])
print(A + B)
print
print(-A + A)
Soit $A \in\mathcal{M}_{ m,n}(\mathbb{K})$ et $\lambda\in \mathbb{K}$
Le produit d’une matrice par un scalaire est donné par :
Soient $A$ et $B$ deux matrices de même ordre et $\lambda\in \mathbb{K}$ un scalaire.
$\lambda\times (A+B) = \lambda\times A + \lambda\times B$ (distributivité)
Multplier une matrice par un scalaire se fait selon le même principe que pour l'addition. Les opérations sont effectuées terme à terme
A = np.ones((4,4))
print(A)
print
print(4*A)
print
print(A/2)
Soient $A = (a_{ik})_{ \begin{array}{c}1\leq i\leq m\\1\leq k\leq n \end{array}}$ une matrice de $\mathcal{M}_{m,n}(\mathbb{K})$ et $B = (b_{kj})_{ \begin{array}{c}1\leq k\leq n\\1\leq j\leq p \end{array}}$ une matrice de $\mathcal{M}_{n,p}(\mathbb{K})$, on définit le produit des matrices par $$A \times B = \left( \sum_{\substack{k=1}}^n a_{ik}\times b_{kj} \right)_{ \begin{array}{c}1\leq i\leq m\\1\leq j\leq p \end{array}}$$
Exercices
Effectuer les produits de matrice $A\times B$, $B\times A$, $C\times D$ et $C\times B$
$$ A = \begin{pmatrix} 2 & 1 & -1\\ -3 & 1 & 0\\ \end{pmatrix} \quad B = \begin{pmatrix} 0 & 4\\ 1 & -1 \\ 2 & 1\end{pmatrix}$$
$$ C = \begin{pmatrix} -1 & 1 & 0\\ 2 & -1 & 1\\ \end{pmatrix} \quad D = \begin{pmatrix} 4\\ 1\\ 2\\ \end{pmatrix}$$
Pour le produit matriciel on utilise la fonction : dot
A = np.array([3, 0, 1])
B = np.array([[1], [-1], [0]])
C = np.dot(A, B)
print(C)
print
A = np.arange(6).reshape(2,3)
C = np.dot(A, B)
print(C)
Soient $A \in \mathcal{M}_{m,n}(\mathbb{K})$, $B \in \mathcal{M}_{n,p}(\mathbb{K})$, $C \in \mathcal{M}_{p,q}(\mathbb{K})$
ATTENTION :
A = np.array([[0, 0],[1, 0]])
B = np.array([[0,0],[5, 8]])
C = np.dot(A,B) #C est une matrice nulle
print(C)
print
C = np.dot(B,A) #Le produit n'est pas commutatif
print(C)
Changement de base
Soient deux repères cartésiens orthonormés $(O,\vec{x_1}, \vec{x_2}, \vec{x_3})$ et $(O,\vec{x'_{1}}, \vec{x'_{2}}, \vec{x'_{3}})$
Déterminer les matrices $B$ et $P$ (matrice de passage) pour exprimer sous la forme d'un produit matricielle les coordonées des vecteurs $\vec{x'_{1}}, \vec{x'_{2}}, \vec{x'_{3}}$ en fonctions des vecteurs $\vec{x_1}, \vec{x_2}, \vec{x_3}$
Soit $A \in \mathcal{M}_{m,n}(\mathbb{K})$, une matrice carrée de terme général $a_{ij}$, on définit la trace de A comme la somme des éléments de la diagonale principale :
Exercices
Calculer la trace de la matrice suivante :
Pour quelle valeur de $x\in [-3, 2]$ la trace de la matrice $A$ est-elle minimale ? Et pour quelle valeur de $x$ est-elle maximale ?
Propriétés
Si $A$ et $B$ sont deux matrices carrées d’ordre $n$, alors
Si $A$ est une matrice $m\times n$ et $B$ une matrice $n\times m$, alors
Définition : Tansposée d'une matrice
Soit $A \in \mathcal{M}_{m,n}(\mathbb{K})$, de terme général $a_{ij}$ . On appelle transposée de $A$ et on note $A^T$ la matrice $B \in \mathcal{M}_{n,m}(\mathbb{K})$ de terme général $b_{ij} = a_{ji}$ .
Propriétés
Exercices
Exo : 1
Revenons sur notre changement de base, exprimez $\begin{pmatrix} \vec{x'_1}\\ \vec{x'_2}\\ \vec{x'_3}\\ \end{pmatrix}$
nous pouvons aussi vouloir exprimer les coordonées des vecteurs $\vec{x_{1}}, \vec{x_{2}}, \vec{x_{3}}$ en fonctions des vecteurs $\vec{x'_1}, \vec{x'_2}, \vec{x'_3}$, dans ce cas on a :
Exprimez $P$
Exo : 2
Quatre élèves $e_1$, $e_2$, $e_3$ et $e_4$ ont quatre notes de mathématiques $n_1$ , $n_2$ , $n_3$ et $n_4$ au cours du premier trimestre . Les notes de $e_1$ sont dans l’ordre $8, 12, 16, 10$ ; celle de $e_2$ sont $13, 15, 19, 14$ ; celles de $e_3$ sont $6, 8, 13, 9$ et celles de $e_4$ sont $10, 9, 7, 15$.
A=np.array([[8,12, 16, 10],[13,15,19,14],[6,8,13,9],[10,9,7,15]])
A = np.transpose(A)
print(A)
print
C = np.array([1./4, 1./4, 1./8, 3./8])
B = np.dot(C,A)
print(B)
Soit $k \geq 0$ un entier et $A \in \mathcal{M}_n(\mathbb{K})$, on définit la puissance k de la matrice A de la façon suivante :
Exercices
Déterminer la matrice $A^2$
On donne la matrice :
Vérifier que $A^3 = A^2 +8\,A +6\,I_3$
Soient $A \in \mathcal{M}_{m,n}(\mathbb{K})$, $B \in \mathcal{M}_{n,p}(\mathbb{K})$, comment développer l'identité remarquable $(A + B)^2$ ?
Avec Python
Une fonction naïve pour le calcul d'une matrice carrée à la puissance $k\in \mathbb{N^*}$
def pow_mat(A, k):
B = np.copy(A)
for i in range(k-1):
B = np.dot(B,A)
return B
A = np.tri(4,dtype=int)
print(A)
print
print(pow_mat(A,10))
Puissance n ième d'une matrice associée à un graphe
Définitions : Longueur et distance
Propriété
Soit $A \in \mathcal{M}_n(\mathbb{K})$ la matrice associée (encore appelée matrice d'adjacence) à un graphe (orienté ou non). Alors le terme de $A^n$ situé sur la $i^{ieme}$ ligne et la $j^{ieme}$ colonne est égal au nombre de chaîne de longueur $n$ reliant le sommet $i$ au sommet $j$.
La matrice d’adjacence, est une matrice carrée telle que les lignes et les colonnes identifient les sommets du graphe. Les éléments de la matrice identifient le nombre d’arcs ou d’arêtes entre deux sommets.
Exo 2:
figure avec Matplotlib
Les arêtes du graphe ci-contre représentent le réseau routier reliant 4 villes différentes et chaque arête mesure 2 km. (le dessin n'est pas à l'échelle)
Définition Une matrice $A \in \mathcal{M}_n(\mathbb{K})$ est dite inversible s’il existe $B \in \mathcal{M}_n(\mathbb{K})$ telle que $AB = I_n $. La matrice $B$ est alors unique et on la note $A^{ −1}$ .
Remarque : Par définition pour montrer qu’une matrice $A$ est inversible et que son inverse est $B$, il suffit donc de vérifier $AB = I$ et $BA = I$.
Montrer que la matrice $B$ est l'inverse de la matrice $A$
A = np.array([[1, 2, -3], [0, 1, 2], [0, 0, 1]])
B = np.array([[1, -2, 7], [0, 1, -2], [0, 0, 1]])
C = np.dot(A,B)
D = np.dot(B,A)
print(C)
print
print(D)
Soit la matrice $A = \begin{pmatrix} 1 & 1 & 1\\ 1 & -1 & 1\\ 4 & 2 & 1\end{pmatrix}$ qui vérifie $A^3 = A^2 +8\,A +6\,I_3$, en déduire l'expression de $A^{-1}$ puis calculer la matrice $A$
A = np.array([[1, 1, 1],[1, -1, 1],[4, 2, 1]])
A3 = pow_mat(A, 3)
print(A3 == pow_mat(A, 2) + 8*A + 6*np.eye(3))
print
inverse_A = 1./6 * (pow_mat(A,2) - A - 8*np.eye(3))
print(inverse_A)
Avec python et numpy
Calcul de l'inverse d'une matrice inversible
Soit Une matrice $A \in \mathcal{M}_n(\mathbb{K})$, et soient $X$, $B$ deux matrices colonne de hauteur $n$. Le système $AX = B$, d’inconnue $X$, possède une solution unique si et seulement si A est inversible.
Considérons l'exemple suivant:
Résoudre
Voici des conditions suffisantes pour dire, au premier coup d’œil, qu’une matrice est non inversible :
Calculer de la même manière l'inverse de la matrice $$A = \begin{pmatrix} 1 & 2 & -3\\ 0 & 1 & 2\\ 0 & 0 & 1\end{pmatrix}$$
Calculer l'inverse d'une matrice avec python et numpy
Pour cela on utilise np.linalg.inv(A) , attention 1/A ne désigne pas l’inverse $A^{−1}$ de $A$, mais la matrice dont les coefficients sont les inverses, terme à terme, de ceux de A.
A = np.array([[0, 1, 1],[1, 1, 1],[1, 0, 1]])
print(np.linalg.inv(A))
Comme on peut le voir le résultat de l'inverse d'une matrice avec python est automatiquement transformé en float. Cela peut être génant quand on travaille avec des entiers ou des rationnels
A = np.array([[4, 0, 0],[0, 6, 0],[0, 0, 8]])
A = np.linalg.inv(A)
print A
Une solution possible est d'utiliser le package fractions qui permet de mettre sous forme rationnelle les valeurs flottantes
import fractions
for l in A:
for val in l:
f = fractions.Fraction(val)
print f
Le passage à la forme rationnelle peut poser quelques problèmes si la valeur flottante n'est pas exacte, dans ce cas on peut limiter le nombre de chiffres significatifs au dénominateur en précisant une valeur maximale acceptable
def to_frac(mat, d):
import fractions
A = []
for l in mat:
line = []
for val in l:
line.append(fractions.Fraction(val).limit_denominator(d))
A.append(line)
return A
to_frac(A, 10)
On associe à chaque matrice un nombre permettant de déterminer si elle est inversible : le déterminant. Le déterminant d’une matrice n’est défini que si la matrice est carrée.
Définition
Soit une matrice $A \in \mathcal{M}_n(\mathbb{K})$, Le déterminant de $A$, noté $det(A)$, est l’élément de $\mathbb{K}$ défini par
De manière équivalente on a :
où $det(A_{ij})$ est le déterminant de la matrice de $\mathcal{M}_{n-1}(\mathbb{K})$ obtenue en enlevant à $A$ la ligne $i$ et la colonne $j$.
Exemples
Attention (d) et (b) représentent des matrices contenant un seul élément
Avec numpy
A = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])
A = np.linalg.det(A)
print A
Propriétés du déterminant :
Exercices
Calculer les déterminants des matrices suivantes :
Quelques exemples de calculs de déterminants avec numpy
A = np.array([[1, 1, 2],[3, 4, 5],[6, 7, 8]])
print "det(A) = ", np.linalg.det(A)
On multiplie la ligne $2$ par $3$
A[1,:] *= 3
print(A)
A = np.linalg.det(A)
print
print "det(A) = ",A
A = np.array([[1, 1, 2],[3, 4, 5],[6, 7, 8]], dtype='float')
print "det(A) = ", np.linalg.det(A)
Pour multiplie la dernière colonne par $-4.5$
A[:,-1] *= -4.5
print(A)
A = np.linalg.det(A)
print
print "det(A) = ",A
_2. Comment ajouter à une ligne une combinaison linéaire des autres lignes ?
A = np.array([[1, 1, 2],[3, 4, 5],[6, 7, 8]], dtype='float')
print "det(A) = ", np.linalg.det(A)
$L_1 \longleftarrow 3\,L_2 - 2\, L_3$
A[0,:] += (3*A[1,:]-2*A[2,:]) #Attention A[1,:] = A[1] mais A[:,1] différent de A[1]
print(A)
A = np.linalg.det(A)
print
print "det(A) = ",A
La notion de déterminant est intimement liée à la notion d’aire et de volume.
Définition
On appelle système linéaire à $n$ équations et $p$ inconnues $x_1, \dots, x_p$ tout ensemble d'équations de la forme :
On appelle solution du système tout p-uplet $(x_1, x_2,\dots,x_p) \in \mathbb{K}^p$ vérifiant les $n$ équations du système. le système est dit compatible s'il admet au moins une solution (sinon il est incompatible).
Si $A$ est inversible alors on peut écrire : $X = A^{-1}B$
Résoudre :
Avec numpy
A = np.array([[1,3,4],[3,5,-4],[4,7,-2]], dtype=float)
B = np.array([[50],[2],[31]])
inv_A = np.linalg.inv(A)
X = np.dot(inv_A, B)
print(X) #Solution de notre système
print
print(np.dot(A,X)) #On vérifie que X est bien solution du système
Le package numpy possède également une fonction permettant de résoudre les systèmes linéaires
X = np.linalg.solve(A, B)
print (X)
Exemple : Le passage du courant dans un circuit électrique est régi par trois lois fondamentales :
Le système linéaire correspondant peut être écrit à partir:
A = np.array([[5,3,3,3],[-2,9,6,6],[0,-3,14,10],[0,0,4,-21]], dtype=float)
B = np.array([[40],[-30],[20],[10]])
X = np.linalg.solve(A, B)
print (X)
Sur le tableau de notes d'un concours vous lisez les notes et les moyennes suivantes:
En déduire les coefficients de chaque matière
A = np.array([[7,12,8],[9,6,10],[11,16,14]],float)
B = np.array([9,8.6,14])
X = np.linalg.solve(A, B)
print (X)
Christophe Casseau ENSAM 2017-2018, Bachelor 2