fonctions utilisées : ones(), zeros(), eig(),trace(), det(), inv(), cond(), rank(), poly(),compan(),hilb(), norm() invhilb(), diag(), flipud(),fliplr(), eye().

Travail sur les matrices avec Octave

Octave est très adapté à l'algèbre linéaire.

Vous trouverez de la documentation sur cette page

Valeurs propres d'une matrice

On cherche les valeurs propres de la matrice M, de taille 7×7 qui est bordée de 1 en bas et à droite et nulle ailleurs.

Création de la matrice

On peut créer une matrice avec le modèle suivant :


 m=[1, 2, 3; 4, 5, 6]
 
m =
   1   2   3
   4   5   6

Noter le rôle du point-virgule…

On peut aussi, à la place de nombres, mettre des matrices à condition que leur format convienne…(les vecteurs sont considérés comme des matrices particulières). C'est ce que nous allons faire pour créer la matrice M.

  1. On crée une matrice 6×6 nulle avec a=zeros(6)
  2. On crée une matrice 6×1 b=ones(6,1)
  3. On obtient la transposée de b avec c=b.' ( point + apostrophe )
  4. On crée la matrice M=[a,b;c,1]

La matrice est affichée… ce qu'on vient de faire est une concaténation de matrices.


Travail sur la matrice M

On peut demander le vecteur formé des valeurs propres de M avec u=eig(M). On obtient :

u =

  -2.00000
   0.00000
   0.00000
   0.00000
   0.00000
   0.00000
   3.00000

Sans surprise, trace(M) donne 1 , rank(M) donne 2 et det(M) donne 0.

Pour avoir M5, il suffit de saisir M**5


Polynome caractéristique et matrice compagnon

On obtient le polynome caractéristique de la matrice M avec la commande poly(M) . Il est donné sous la forme d'un vecteur ligne…

   1.00000  -1.00000  -6.00000   0.00000   0.00000   0.00000   0.00000   0.00000

Le polynome caractéristique est donc x7-x6-6x5

On peut aussi, dans l'autre sens écrire la matrice compagnon d'un polynome avec la commande compan()

u=[1, 2, 3, 4, 5, 6, 7]
 M=compan(u)

Sans surprise, le polynome caractéristique de M est le polynome correspondant au vecteur ligne… il suffit de saisir la commande poly(M) pour le vérifier.


Matrice de Hilbert

On voudrait étudier la matrice d' Hilbert d'ordre 5. C'est la matrice 5×5 H de terme général hi,j=1/(i+j-1)

On saisit H=hilb(5)

H =

   1.00000   0.50000   0.33333   0.25000   0.20000
   0.50000   0.33333   0.25000   0.20000   0.16667
   0.33333   0.25000   0.20000   0.16667   0.14286
   0.25000   0.20000   0.16667   0.14286   0.12500
   0.20000   0.16667   0.14286   0.12500   0.11111

la liste des vecteurs propres est obtenue avec eig(H)

 l=eig(H)
l =

   3.2879e-06
   3.0590e-04
   1.1407e-02
   2.0853e-01
   1.5671e+00

Si on veut des vecteurs propres , on peut saisir [v,l]=eig(H)

On obtiendra deux matrices v et l :

 [v,l]=eig(H)
v =

  -0.0061739   0.0471618   0.2142136  -0.6018715   0.7678547
   0.1166927  -0.4326673  -0.7241021   0.2759134   0.4457911
  -0.5061637   0.6673504  -0.1204533   0.4248766   0.3215783
   0.7671912   0.2330245   0.3095740   0.4439030   0.2534389
  -0.3762455  -0.5575999   0.5651934   0.4290134   0.2098226

l =

   0.00000   0.00000   0.00000   0.00000   0.00000
   0.00000   0.00031   0.00000   0.00000   0.00000
   0.00000   0.00000   0.01141   0.00000   0.00000
   0.00000   0.00000   0.00000   0.20853   0.00000
   0.00000   0.00000   0.00000   0.00000   1.56705

Dans la matrice v, on trouve 5 vecteurs propres et la matrice l nous redonne les valeurs propres. Enfin pas tout à fait : la plus petite est devenue nulle car la précision est insuffisante; on peut, par exemple saisir

output_precision(8)
[v,l]=eig(H)

Le résultat sera donné en notation scientifique avec 8 chiffres significatifs.

La commande inv(H) affiche la matrice inverse de H. Le mieux est de saisir invhilb(5) qui utilise la formule donnant directement chaque terme de la matrice inverse de H.

La commande norm(H) ou norm(H,2) donne la norme 2 de H. On peut remplacer 2 par 1, Inf (norme infinie) ou "fro" (norme de Frobenius).

 n=norm(H)
n =  1.5671

La commande cond(H) donne le conditionnement de H (C'est le produit de la norme de H par la norme de son inverse)

cond(H)
ans =  4.7661e+05

On trouve un nombre énorme. Cela signifie que les méthodes d'analyse numérique appliquées à la matrice H risquent d'être très peu précises. Les matrices de Hilbert sont connues pour leur grand (donc mauvais) conditionnement…

Diagonale, sous-diagonale, sur diagonale

Il s'agit maintenant de travailler avec la matrice 9×9 représentée ci-dessous.

Voici un script qui permet de l'obtenir :

u=[1:8]
v=u.'
w=flipud(v)
A=diag(u,1)
B=diag(w,-1)
M=A+B

La commande u=[1:8] donne :

u =

   1   2   3   4   5   6   7   8

La commande v=u.' transpose u

v =

   1
   2
   3
   4
   5
   6
   7
   8

On retourne le vecteur v avec la commande w=flipud(v) (retournement vertical (up-down)); pour retourner une matrice horizontalement (left-right), on utilise w=fliplr(v)

w =

   8
   7
   6
   5
   4
   3
   2
   1

On crée une matrice 9×9 dont la sur-diagonale est u avec A=diag(u,1) puis la matrice dont la sous-diagonale est w avec B=diag(w,-1) et leur somme donne M.

remarques

La commande diag(u,0) crée une matrice 8×8 qui a pour diagonale le vecteur u et des 0 ailleurs; diag(u,2) crée une matrice 10×10 qui a pour sur-sur-diagonale le vecteur u et des 0 ailleurs.

Pour avoir la matrice identité d'ordre 7, il suffit de saisir eye(7).

Pour obtenir u=[5, 7, 9, 11, 13] on peut saisir u=[5:2:13], l'incrémentation est 2.

Utiliser des boucles

On voudrait créer la matrice A, 5×5 dont les termes ai j vérifient ai j=(i+j-1)2.

Le script suivant convient :

A=zeros(5);
for a=1:5,
	for b=1:5,
		A(a,b)=(a+b-1)**2;
	end
end
A

fait le 17 et 18 août 2008