Skip to Content

Chapitre 08 : Maple en algèbre linéaire

FONCTIONS DE BASE:

 

> restart;

Les vecteurs et les matrices peuvent être définis comme des tableaux rectangulaires, par la

fonction array , rencontrée dans le chapitre sur les tableaux :

 

Vecteur-ligne d'ordre 3 sans initialisation:

> A:=array(1..3);

A := array(1 .. 3,[])

Vecteur-ligne d'ordre 3 avec initialisation:

> B:=array([x,y,z]);

B := vector([x, y, z])

Vecteur-colonne d'ordre 3 sans initialisation:

> U:=array(1..3,1..1);print(U);

U := array(1 .. 3,1 .. 1,[])

matrix([[U[1,1]], [U[2,1]], [U[3,1]]])

Vecteur-colonne d'ordre 3 avec initialisation:

> V:=array([[x],[y],[z]]);

V := matrix([[x], [y], [z]])

 

Matrice carrée d'ordre 2 sans initialisation:

> M:=array(1..2,1..2);print(M);

M := array(1 .. 2,1 .. 2,[])

matrix([[M[1,1], M[1,2]], [M[2,1], M[2,2]]])

Matrice carrée d'ordre 2 avec initialisation:

> N:=array([[a,b],[c,d]]);

N := matrix([[a, b], [c, d]])

 

Opérations sur les vecteurs et les matrices , avec la fonction evalm :

Somme de vecteurs ou de matrices de même dimension avec +

> evalm(A+U);

matrix([[A[1]+U[1,1]], [A[2]+U[2,1]], [A[3]+U[3,1]]...

Multiplication de vecteurs ou de matrices de dimensions compatibles avec &*

> evalm(M &* N);

matrix([[M[1,1]*a+M[1,2]*c, M[1,1]*b+M[1,2]*d], [M[...

Calcul de la matrice inverse, lorsque N est inversible, avec ^(-1)

> evalm(N^(-1));

matrix([[d/(a*d-b*c), -b/(a*d-b*c)], [-c/(a*d-b*c),...

Puissance n-ième avec ^n

> evalm(N^3);

matrix([[(a^2+b*c)*a+(a*b+b*d)*c, (a^2+b*c)*b+(a*b+...

Multiplication par un scalaire avec *

> evalm(2*M-5*N);

matrix([[2*M[1,1]-5*a, 2*M[1,2]-5*b], [2*M[2,1]-5*c...

 

LES OUTILS DU PACKAGE linalg:

 

Le package linalg contient plus d'une centaine d'outils en algèbre linéaire:
  

> with(linalg);

[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...
[BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp,...

 

Les fonctions matrix et vector permettent de définir respectivement une matrice (tableau

rectangulaire d'objets) ou un vecteur (tableau d'objets à une seule ligne) :


Définition d'une matrice 2x4 :

> P:=matrix([[s,t,u,v],[w,x,y,z]]);

P := matrix([[s, t, u, v], [w, x, y, z]])

Définition d'un vecteur-ligne d'ordre 4 et d'une matrice-colonne d'ordre 3:

> V:=vector([a,b,c,d]);

V := vector([a, b, c, d])

> C:=matrix([[1],[2],[3]]);

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

Une matrice a le type matrix , un vecteur a le type vector .

 

Opérations sur les matrices:

 

A la place de la fonction evalm , on peut utiliser les outils spécifiques du package linalg :

 

Multiplication de vecteurs ou de matrices de dimensions compatibles avec multiply

 

> multiply(M,N);

matrix([[M[1,1]*a+M[1,2]*c, M[1,1]*b+M[1,2]*d], [M[...

Calcul de la matrice inverse,lorsque N est inversible, avec inverse

> inverse(N);

matrix([[d/(a*d-b*c), -b/(a*d-b*c)], [-c/(a*d-b*c),...

Multiplication par un scalaire lambda avec scalarmul

> scalarmul(P,lambda);

matrix([[lambda*s, lambda*t, lambda*u, lambda*v], [...

Test d'égalité de deux matrices avec equal

> equal(M,N);

false

 

Etude d'une matrice:

 

Déterminant et trace d'une matrice carrée (somme des éléments diagonaux):

> N:=matrix([[1,2],[4,-3]]);det(N);trace(N);

N := matrix([[1, 2], [4, -3]])

-11

-2

Rang d'une matrice:

> rank(N);

2

kernel(A); ou nullspace(A); détermine une base du noyau de A
colspace(A); détermine une base du sous-espace engendré par les vecteurs-colonnes de A
rowspace(A); détermine une base du sous-espace engendré par les vecteurs-lignes de A

> A:=matrix([[2,-2],[-1,1]]);kernel(A);

A := matrix([[2, -2], [-1, 1]])

{vector([1, 1])}

> colspace(A);

{vector([1, -1/2])}

> rowspace(A);

{vector([1, -1])}

 

Matrice caractéristique: lambda*I-A , det(lambda*I-A) .

> charmat(A,lambda);

matrix([[lambda-2, 2], [1, lambda-1]])

> charpoly(A,lambda);

lambda^2-3*lambda

Valeurs propres de A (ce sont les racines du polynôme caractéristique):

> eigenvals(A);

0, 3

Un vecteur propre associé à la valeur propre lambda est un vecteur X non nul tel que A*X = lambda*X .

> eigenvects(A);

[0, 1, {vector([1, 1])}], [3, 1, {vector([-2, 1])}]...

 

Le résultat affiché signifie que lambda = 0 est une valeur propre d'ordre 1 de vecteur propre associé

X = (1, 1) et que lambda = 3 est une valeur propre d'ordre 1 de vecteur propre associé X = (-2, 1) .

 

Modification d'une matrice:

 

> print(P);

matrix([[s, t, u, v], [w, x, y, z]])

 

row(P,k) permet d'extraire la k-ième ligne de la matrice P. Le résultat est un vecteur.

col(P,k) permet d'extraire la k-ième colonne de la matrice P. Le résultat est un vecteur.

> row(P,2),col(P,3);

vector([w, x, y, z]), vector([u, y])

 

rowdim(P) et coldim(P) retournent le nombre de lignes et de colonnes de la matrice P .

> rowdim(P),coldim(P);

2, 4

 

augment(M1,M2,...,Mn) permet de concaténer horizontalement les n matrices M1,M2,...,Mn :

> augment(A,P);

matrix([[2, -2, s, t, u, v], [-1, 1, w, x, y, z]])

 

stackmatrix(M1,M2,...,Mn) permet de concaténer verticalement les n matrices M1,M2,...,Mn :

> stackmatrix(A,N);

matrix([[2, -2], [-1, 1], [1, 2], [4, -3]])

 

copyinto(M,N,m,n) : copie M dans N , l'élément M[1,1] étant copié en

> copyinto(N,P,1,2);

matrix([[s, 1, 2, v], [w, 4, -3, z]])

 

swapcol(M,m,n) et swaprow(M,m,n) permettent d'échanger les colonnes (ou les lignes)

m et n de la matrice M :

> swaprow(A,1,2);

matrix([[-1, 1], [2, -2]])

 

transpose(M) permet de transposer la matrice M :

> print(M);transpose(M);

matrix([[M[1,1], M[1,2]], [M[2,1], M[2,2]]])

matrix([[M[1,1], M[2,1]], [M[1,2], M[2,2]]])

addcol(M,m,n,k) ou addrow(M,m,n,k) rendent une matrice obtenue à partir de M par

l'opération col n := col n + k * col m (respectivement lig n := lig n + k * lig m ) :

 

> print(N);addcol(N,1,2,mu);

matrix([[1, 2], [4, -3]])

matrix([[1, mu+2], [4, 4*mu-3]])

Matrices particulières:

> vandermonde([a,b,c,d]);

matrix([[1, a, a^2, a^3], [1, b, b^2, b^3], [1, c, ...

> JordanBlock(expr,4);

matrix([[expr, 1, 0, 0], [0, expr, 1, 0], [0, 0, ex...

 

LES OUTILS DU PACKAGE LinearAlgebra:

 

A partir de la version 7, existe dans Maple un nouveau package LinearAlgebra avec

des outils similaires à ceux du package linalg et destiné à supplanter l'ancien. En voici les fonctions:

> with(LinearAlgebra);

[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...
[Add, Adjoint, BackwardSubstitute, BandMatrix, Basi...

 

On définit une matrice A dont on calcule le déterminant, la matrice et le polynôme caractéristique,

ainsi que les valeurs propres et vecteurs propres associés:

> A:=Matrix([[1,-1,-1],[-2,2,3],[2,-2,-3]]);
    Determinant(A);
    CharacteristicMatrix(A,lambda);
    factor(CharacteristicPolynomial(A,lambda));
    Eigenvalues(A);
    Eigenvectors(A);

A := _rtable[4468540]

0

_rtable[14270440]

(lambda-1)*lambda*(lambda+1)

_rtable[14253092]

_rtable[14253172], _rtable[14279184]

 


 

Exercice corrigé 8:

 

Rechercher les matrices carrées X d'ordre 2 telles que X^2+X = A , où A := MATRIX([[1, 1], [1, 1]]) .

> with(linalg):A:=matrix(2,2,1);X:=matrix(2,2):

A := matrix([[1, 1], [1, 1]])

> Y:=evalm(X^2+X-A);

Y := matrix([[X[1,1]^2+X[1,2]*X[2,1]+X[1,1]-1, X[1,...

> Y:={seq(seq(Y[i,j],j=1..2),i=1..2)};

Y := {X[1,1]^2+X[1,2]*X[2,1]+X[1,1]-1, X[1,2]*X[2,1...
Y := {X[1,1]^2+X[1,2]*X[2,1]+X[1,1]-1, X[1,2]*X[2,1...

> solutions:={solve(Y)}:
    for k to nops(solutions) do
        X:=matrix(2,2):assign(solutions[k]):print(X);
    end do:

matrix([[0, 1], [1, 0]])

matrix([[-3/2, -1/2], [-1/2, -3/2]])

matrix([[1/2, 1/2], [1/2, 1/2]])

matrix([[-1, -1], [-1, -1]])

Donc 4 matrices solutions.

 


 

Travail dirigé 8:

 

TD 8.1:

Ecrire une procédure pcd(L::list) retournant à partir d'une liste donnée L la liste obtenue par

permutation circulaire vers la droite des éléments de L .

Exemple:

> pcd([a,b,c,d,e,f,g]);

[g, a, b, c, d, e, f]

 

TD 8.2:

Ecrire une procédure circulante_droite(n::posint) retournant à partir de l'entier n> 0

une matrice carrée d'ordre n telle que

 

- sa première ligne est constituée par les entiers de 1 à n .

- pour k> 1 , sa k-ième ligne est déduite de la ligne précédente par permutation

circulaire vers la droite de ses éléments.

 

Exemple:

> circulante_droite(5);

matrix([[1, 2, 3, 4, 5], [5, 1, 2, 3, 4], [4, 5, 1,...

 

TD 8.3:

Test d'égalité de 2 matrices:

 

2 matrices M et N sont égales si et seulement si elles ont même nombre de lignes, même

nombre de colonnes, et les mêmes coefficients .

Sans avoir recours à la fonction préexistante equal de Maple, écrire une procédure

egal(M: : matrix , N: : matrix) retournant la valeur booléenne true si M=N et false sinon.

 

 

 

 

haut de cette page

MicroMaths - Abderrahim Bourguig - Tous droits réservés