In [ ]:
from __future__ import division, print_function # Python 3
from sympy import init_printing
init_printing(use_latex='mathjax',use_unicode=False) # Affichage des résultats
Cette section concerne l'algèbre linéaire et les matrices. On trouvera d'autres exemples dans le tutoriel de Sympy sur le même sujet: http://docs.sympy.org/latest/tutorial/matrices.html
En SymPy, on peut créer une matrice avec la fonction Matrix
:
In [ ]:
from sympy import Matrix
Il suffit d'écrire les entrées lignes par lignes avec la syntaxe suivante:
In [ ]:
Matrix([[2, 5, 6], [4, 7, 10], [1, 0, 3]])
Out[ ]:
Une autre façon équivalente est de spécifier le nombre de lignes, le nombre de colonnes et puis la liste des entrées:
In [ ]:
Matrix(2, 3, [1, 2, 3, 4, 5, 6])
Out[ ]:
Par défaut, si on ne spécifie pas les dimensions de la matrice, un vecteur colonne est retourné:
In [ ]:
Matrix([1,2,3,4])
Out[ ]:
In [ ]:
M = Matrix([[5, 2], [-1, 7]])
N = Matrix([[0, 4], [0, 5]])
M + N
Out[ ]:
In [ ]:
M * N
Out[ ]:
In [ ]:
4 * M
Out[ ]:
In [ ]:
M ** 5
Out[ ]:
De même, on peut calculer l'inverse d'une matrice si elle est inversible:
In [ ]:
M**-1
Out[ ]:
In [ ]:
N**-1
Out[ ]:
La transposition d'une matrice se fait avec .transpose()
:
In [ ]:
from sympy import I
M = Matrix(( (1,2+I,5), (3,4,0) ))
M
Out[ ]:
In [ ]:
M.transpose()
Out[ ]:
In [ ]:
from sympy import I
M = Matrix(( (1,2+I,5), (3,4,0) ))
M
Out[ ]:
On accède à l'élément en position (i,j)
en écrivant M[i,j]
:
In [ ]:
M[0,1]
Out[ ]:
In [ ]:
M[1,1]
Out[ ]:
Attention: Les indices des positions commencent à zéro!!
On accède aux lignes et au colonnes d'une matrices avec les méthodes row
et col
:
In [ ]:
M.row(1)
Out[ ]:
In [ ]:
M.col(0)
Out[ ]:
In [ ]:
from sympy import ones,zeros
ones(2)
Out[ ]:
In [ ]:
zeros((2, 4))
Out[ ]:
La fonction eye
de sympy permet de créer une matrice identité:
In [ ]:
from sympy import eye
eye(3)
Out[ ]:
La fonction diag
permet de créer une matrice diagonale:
In [ ]:
from sympy import diag
diag(1,2,3)
Out[ ]:
Les éléments de la diagonales peuvent être eux-mêmes des matrices:
In [ ]:
diag(1, 2, Matrix([[7,8],[2,3]]))
Out[ ]:
In [ ]:
M = Matrix([[1, 2, 0, 3], [2, 6, 5, 1], [-1, -4, -5, 2]])
M.rref()
Out[ ]:
In [ ]:
M = Matrix([[1, 2, 0, 3], [2, 6, 5, 1], [-1, -4, -5, 2]])
M.nullspace()
Out[ ]:
In [ ]:
M = Matrix([[2, 5, 6], [4, 7, 10], [1, 0, 3]])
M.det()
Out[ ]:
In [ ]:
M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
from sympy.abc import x
M.charpoly(x)
Out[ ]:
On ajoute .as_expr()
pour obtenir l'expression symbolique du polynôme caractéristique:
In [ ]:
M.charpoly(x).as_expr()
Out[ ]:
In [ ]:
from sympy import factor
factor(_)
Out[ ]:
In [ ]:
M
Out[ ]:
Soient les vecteurs colonnes w
et v
suivants:
In [ ]:
w = Matrix((1,2,3,4))
v = Matrix((1,1,1,0))
w
Out[ ]:
In [ ]:
v
Out[ ]:
En général, l'image par M
d'un vecteur n'a rien à voir avec ce vecteur. Par exemple, l'image par M
de w
n'a rien à voir avec w
:
In [ ]:
M * w
Out[ ]:
Dans certains cas particuliers, l'image par M
d'un vecteur retourne un multiple scalaire de ce vecteur. C'est ce qui se produit pour le vecteur v
:
In [ ]:
M * v
Out[ ]:
Le résultat précédent est égal à 5 fois le vecteur v
:
In [ ]:
5 * v
Out[ ]:
Un vecteur $v$ qui satisfait l'équation $Mv = \lambda v$ pour un certain nombre réel (ou complexe) $\lambda$ est appelé vecteur propre. Le nombre $\lambda$ qui satisfait l'équation est appelé valeur propre. Il se trouve que les valeurs propres d'une matrice sont les racines de son polynôme caractéristique. Le calcul des valeurs et vecteurs propres d'une matrice est utile dans presque tous les domaines des mathématiques.
En sympy, on calcule les valeurs propres d'une matrice avec la méthode eigenvals
. Le résultat est un dictionnaire qui associe à chaque valeur propre sa multiplicité algébrique (comme pour le calcul des racines):
In [ ]:
M.eigenvals()
Out[ ]:
Et on calcule les vecteurs propres d'une matrice avec la méthode eigenvects
:
In [ ]:
M.eigenvects()
Out[ ]:
Le calcul précédent montre bien que le vecteur colonne v = [1, 1, 1, 0]^T
est bien un vecteur propre de la matrice M
associé à la valeur propre 5
comme on l'avait vu plus tôt. Il permet aussi de réaliser qu'un autre vecteur colonne linéairement indépendant de v
est aussi un vecteur propre associé à la valeur propre 5
. Finalement, il y a deux autres vecteurs propres associés aux valeurs propres -2
et 3
.