Octave est très adapté à l'algèbre linéaire.
Vous trouverez de la documentation sur cette page
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.
On peut créer une matrice avec le modèle suivant :
m=[1, 2, 3; 4, 5, 6]
m =
1 2 3
4 5 6Noter 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.
a=zeros(6)b=ones(6,1) c=b.' ( point + apostrophe )M=[a,b;c,1]La matrice est affichée… ce qu'on vient de faire est une concaténation de matrices.
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
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.00000Le 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.
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.11111la 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.56705Dans 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.5671La 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+05On 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…
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+BLa commande u=[1:8] donne :
u =
1 2 3 4 5 6 7 8La commande v=u.' transpose u
v =
1
2
3
4
5
6
7
8On 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
1On 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.
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.
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
Afait le 17 et 18 août 2008