Première solution : avec une liste de listes, correspondant à la liste de ses lignes.
M = matrix( [ [1, 2, 3], [4, 5, 6] ] )
M
Deuxième solution : avec une simple liste de coefficients, mais il faut alors préciser la taille de la matrice (nombre de lignes, puis nombre de colonnes) avant de donner la liste des coefficients.
M = matrix(2, 3, [1, 2, 3, 4, 5, 6])
M
On peut également préciser à quelle structure les coefficients doivent appartenir (en premier argument de matrix()
).
N = matrix(RR, 2, 3, [1, 2, 3, 4, 5, 6])
N
Certaines matrices sont déjà prédéfinies : la matrice identité, la matrice nulle, la matrice pleine de $1$.
matrix.identity(4)
matrix.zero(2, 3)
matrix.ones(2, 3)
Pour accéder au coefficient de ligne $i$ et colonne $j$ d'une matrice $M$ (attention, la première ligne/colonne commence à $0$) :
M = matrix(2, 3, [1, 2, 3, 4, 5, 6])
show(M)
i, j = 1, 2
M[i,j]
Pour avoir la colonne $j$ entièrement :
M[:,2]
Pour avoir la ligne $i$ entièrement :
M[1,:]
Les opérations élémenetaires sur les matrices sont bien implantées : addition, multiplication (par une matrice ou par un scalaire), mise à la puissance si c'est possible.
A = matrix(2, 2, [0, 1, 1, 0])
show(A, M)
X = A * M
show(X)
X + M
Attention à ce que les opérations soient bien possibles :
# A + M
# M * A
Pour obtenir le rang d'une matrice :
M.rank()
Pour calculer sa transposée
M.transpose()
Pour calculer le déterminant d'une matrice :
M = matrix(ZZ, [[1, 1, 1], [1, 3, 7], [1, 9, 49]])
show(M)
M.determinant()
det(M)
Pour calculer sa trace :
M.trace()
Pour savoir si elle est inversible :
M.is_invertible()
Attention, l'inversibilité dépend dans quel anneau les coefficients sont considérés (les matrices inversibles sur $\mathbb{Z}$ sont celles de déterminant $\pm 1$). Modifions cet anneau en QQ
au lieu de ZZ
.
M = M.change_ring(QQ)
M.is_invertible()
Pour calculer son inverse :
M.inverse()
M**(-1)
Pour calculer son polynôme caractéristique :
M.characteristic_polynomial()
Pour obtenir ses valeurs propres :
valeurs_propres = M.eigenvalues()
valeurs_propres
Les valeurs propres étant des racines d'un polynôme de degré arbitraire, ils appartiennent au corps des éléments algébriques, noté AlgebraicField
ou QQbar
dans sagemath.
valeurs_propres[0].parent()
Pour diagonaliser la matrice, en général on doit donc se placer dans ce corps des éléments algébriques :
M.diagonalization(QQbar)
On peut créer un objet de type vecteur avec la commande vector()
:
v = vector(QQ, [1, 2, 3, 4])
v
Les espaces vectoriels engendrés par les lignes et les colonnes sont accessibles avec les commandes .row_space()
et .column_space()
M = matrix(QQ, [[1, 2, 3], [4, 5, 6]])
print("M = ")
show(M)
V = M.row_space()
print("V = ")
print(V)
W = M.column_space()
print("W = ")
print(W)
On peut accéder à une base d'un espace vectoriel avec .basis()
, à sa dimension avec .dimension()
, et à la taille de ses vecteurs (en nombre de coordonnées) avec .degree()
V.basis()
V.dimension(), V.degree()
On peut obtenir les noyaux à gauche et à droite d'une matrice $M$ avec .left_kernel()
et .right_kernel()
. Ce sont des espaces vectoriels si la matrice $M$ est définie sur un corps (par exemple, QQ
ou RR
).
M = matrix(QQ, [[1,1,1,1], [2,2,2,2], [3,4,5,6]])
show(M)
M.left_kernel()
M.right_kernel()
Vérifions le théorème du rang :
print(M.rank() + M.right_kernel().dimension() == M.ncols())
print(M.rank() + M.left_kernel().dimension() == M.nrows())
Supposons que l'on souhaite résoudre le système linéaire
$$
\left\{\begin{array}{cccccccc}
&x &+ & y &+ & z &= & 0 \\
&2x &+ &y &- &z &= &1 \\
&3x& + &2y&&& = &1
\end{array}\right.
$$
On se place dans le corps QQ
.
Méthode :
Attention ! Sagemath écrit les vecteurs comme des vecteurs lignes. Si vous souhaitez afficher un vecteur v
sous forme de colonne, tapez v.column()
.
A = matrix(QQ, [[1, 1, 1], [2, 1, -1], [3, 2, 0]])
b = vector(QQ, [0, 1, 1])
u = A.solve_right(b)
V = A.right_kernel()
print("Les solutions du système sont les élément de la forme u + v avec\n")
print(" u =")
show(u.column())
print(" et v un élément de l'espace vectoriel de dimension", V.dimension(), "dont une base est")
show([v.column() for v in V.basis()])
v = V.basis()[0]
A*(u + 6*v) == b