Matrices

NB : le module numpy n'est pas présent dans toutes les distributions de Python.

In [1]:
from numpy import array,eye,zeros,ones,random,diag,dot
In [2]:
A = array([[1, 2],[3, 5]])
print(A)
[[1 2]
 [3 5]]

Matrice unité ou identité :

In [3]:
I = eye(2)
print(I)
[[1. 0.]
 [0. 1.]]
In [4]:
print( 2*A + 3*I)
[[ 5.  4.]
 [ 6. 13.]]

Remarque :

In [5]:
 print(2*A + 3)
[[ 5  7]
 [ 9 13]]
In [6]:
print(zeros((2,3)))
print(diag(array([1,2,3])))
print(ones((1,4)))
print(random.rand(5))
[[0. 0. 0.]
 [0. 0. 0.]]
[[1 0 0]
 [0 2 0]
 [0 0 3]]
[[1. 1. 1. 1.]]
[0.25954602 0.86026096 0.85808508 0.93944921 0.84818768]

 Addition de matrices

In [7]:
B = array([[0,5],[2,-1]])
print(A , " = A")
print(B , " = B")
print(A+B, " = A+B")
[[1 2]
 [3 5]]  = A
[[ 0  5]
 [ 2 -1]]  = B
[[1 7]
 [5 4]]  = A+B

 Produit de matrices

In [8]:
print(A , " = A")
print(B , " = B")
print(dot(A,B), " = AxB")
[[1 2]
 [3 5]]  = A
[[ 0  5]
 [ 2 -1]]  = B
[[ 4  3]
 [10 10]]  = AxB

Comparer avec :

In [9]:
print(A*B)
[[ 0 10]
 [ 6 -5]]

 Inverse

In [10]:
from numpy import linalg
linalg.inv(A)
Out[10]:
array([[-5.,  2.],
       [ 3., -1.]])

vérification :

In [11]:
dot(A,linalg.inv(A))
Out[11]:
array([[1.00000000e+00, 2.22044605e-16],
       [0.00000000e+00, 1.00000000e+00]])

Puissance de matrice

In [12]:
linalg.matrix_power(A,3)
Out[12]:
array([[ 43,  74],
       [111, 191]])

Résolution de systèmes linéaires

Le système $$\left\lbrace \begin{array}{l} 2x+y=7\\3x+4y=8 \end{array} \right. $$ s'écrit sous forme matricielle : $$AX=C$$ avec $A=\begin{pmatrix}2&1\\3&4 \end{pmatrix}$, $X=\begin{pmatrix} x\\y \end{pmatrix}$ et $C=\begin{pmatrix} 7\\8 \end{pmatrix}$.

En multipliant (à gauche !) les deux membres de $AX=C$ par $A^{-1}$, on obtient $$A^{-1} \times AX=A^{-1} \times C$$ soit $$I_2 X=A^{-1} \times C$$ $$X=A^{-1} \times C$$

Dans notre exemple, $$X=\begin{pmatrix}0,8&-0,2\\-0,6&0,4 \end{pmatrix} \times \begin{pmatrix} 7\\8 \end{pmatrix} = \begin{pmatrix} 4\\-1 \end{pmatrix}$$

In [13]:
A = array([[2,1],[3,4]])
C = array([[7],[8]])
dot(linalg.inv(A) , C)
Out[13]:
array([[ 4.],
       [-1.]])

Problèmes

Deux systèmes très semblables :

$$\left\lbrace \begin{array}{l} x-y=1\\x-1.00001*y=0 \end{array} \right. $$ et $$\left\lbrace \begin{array}{l} x-y=1\\x-0.99999*y=0 \end{array} \right. $$

Mais des solutions très différentes.

Solution du premier :

In [14]:
A1 = array([[1,-1],[1,-1.00001]])
C1 = array([[1],[0]])
dot(linalg.inv(A1) , C1)
Out[14]:
array([[100000.99999934],
       [ 99999.99999934]])

solution du second :

In [15]:
A2 = array([[1,-1],[1,-0.99999]])
dot(linalg.inv(A2) , C1)
Out[15]:
array([[ -99999.00000046],
       [-100000.00000046]])
In [ ]: