Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
159 views
ubuntu2004
Kernel: SageMath 9.8

Quelques exemples d'algèbre linéaire en SAGE

%display latex

Vecteurs lignes et vecteurs colonnes

M = matrix([[1,2,3],[4,5,6]]) M

Marche aussi en majuscule:

M = Matrix([[1,2,3],[4,5,6]]) M

Par défault, SAGE formatte en convention "vecteurs ligne":

l=vector([1,2,3]) l
M*l

Un "vecteur colonne" est une matrice à une colonne:

C = matrix([[-3],[2],[-1]]) C

Formellement, le produit matriciel LCL\:C est un vecteur à une coordonnée (et oui, SAGE est une machine):

L*C

Ce n'est pas le produit scalaire LC=2L \cdot C = -2. Ce dernier est

(L*C)[0]

Mais en fait, SAGE fait tout ça automatiquement:

c=vector([-3,2,-1]) c
l.dot_product(c)

Une abbreviation concise pour le produit scalaire:

l*c
l*c == l.dot_product(c)

SAGE reconnait si on multiplie une matrice avec un vecteur ou un vecteur avec une matrice:

A = matrix([[2,2,1],[0,-1,1]]) A
u = vector([1,-1,1]) u

Matrice avec vecteur:

A*u
v = vector([1,-1]) v

Vecteur avec matrice:

v*A
A
A.transpose()
(A.transpose())*v
B = matrix([[2,2,1],[0,-1,1],[4,7,1]]) B
A*B
det(B)
B^-1
B*B^-1
(B^-1)*B
identity_matrix(20)

Espaces vectoriels et applis linéaires

Déclarons les "symboles" xx, yy et zz:

var('x','y','z')
(x, y, z)
x,y,z = var('x,y,z')
x
t = x t
var('toto')
x + 1
x+y
x + 1 + 3
expand((x + y)*(2*x - z))
vector([x,y,z])

Appli linéaire (convention "vecteur à droite")

Construisons l'appli linéaire f:R3R2f: \mathbb{R}^3 \rightarrow \mathbb{R}^2 donnée par (xyz)(xyzy) \left( \begin{matrix} x \\ y \\ z \end{matrix} \right) \mapsto \left( \begin{matrix} x - y\\ z - y \end{matrix} \right)

f(x,y,z) = [x - y, z -y] f
(x, y, z) |--> (x - y, -y + z)
F = linear_transformation(SR^3,SR^2,f) F
F.matrix(side='right')

SR est le "domaine de calcul symbolique" (c'est à dire on peut mixer nombres et symboles) qu'on utilise pour faire les calculs en SAGE. Mais moralement on est dans R3\mathbb{R}^3 et R2\mathbb{R}^2, respectivement.

On peut par exemple créer des vecteurs "symboliques":

vector([x,y,z])
vector([x+y,x-z,y+z])

Calculons f(x+y,xz,y+z)f(x+y,x-z,y+z):

F(vector([x+y,x-z,y+z]))

Noyau

F.kernel()
F.matrix('left').left_kernel()
F.matrix('left').right_kernel()
F.matrix('right').right_kernel()
F.matrix('right').left_kernel()
F.kernel().basis()
dim(F.kernel())

Base canonique

C3 = (SR^3).basis() C3
e1 = C3[0] e2 = C3[1] e3 = C3[2]
e1
F(e1)

Matrice d'appli linéaire

C'est la matrice de ff par rapport aux bases canoniques.

Un peu long pour l'écrire à chaque fois. Mais on peut faire une abbréviation par le biais d'une "fonction Python":

def mat(f): return f.matrix(side='right')
mat(F)
mat(F)*e1

Rang

F.rank()
mat(F).rank()
F.image()

Les lignes de cette matrice sont les vecteurs de la base de im(f)im(f).

F.image().basis()
dim(F.image())
F.rank() == dim(F.image())

Et oui, c'est la définition du rang...

dim(F.kernel()) + F.rank()
M = mat(F) M

Garanti par le théorème du rang.

F1 = linear_transformation(SR^3,SR^2,M,side='right') F1
F == F1

Composition d'applis linéaires

a,b=var('a,b') g(a,b) = [a+b,-(a+b),a-b] G = linear_transformation(SR^2,SR^3,g) G

Quand on demande à SAGE d'afficher une appli linéaire, elle donne la matrice avec la convention "à gauche" même si on a construit l'appli explicitement avec la convention "à droite". Bug?...

mat(G)
h(x,y,z) = [x+z,x+y] h
H = linear_transformation(SR^3,SR^2,h) H
G*H

Avec notre convention "à droite" ça donne

mat(G*H)
mat(G*H) == (G*H).matrix().transpose()