Class de calcul matriciel, diagonalisation de matrices symètriques réelles.

Description

Bon, voila, j'avais ecrit pour mon TIPE des bouts de programmes de calcul matriciel, et récemment j'ai du écrire des programmes en Matlab pour l'école. Je me suis dit qu'il était dommage de ne pas pouvoir utiliser ces fonctions dans mon langage favoris ;-) J'ai trouvé aussi que le sujet était intéressant d'un point de vu mathématique. Après quelques tests d'algorithmes sous Matlab j'ai vu que cela était faisable.

Cette unité définit donc une Class: TMatrix gérant des matrices réelles de dimensions variables.
Pour éviter autant que possible de remplir une matrice élément par élément, on définit une dizaine de fonctions de création de vecteurs et de matrices particulières (Equivalent des fonctions matlab Rand, LinSpace, SpDiags...).

Les opérations gérées sont:
Les fonctions de base addition, soustraction, multiplication, transposition, calcul de produits scalaires, de normes pour tous type de matrices.
Le reste des opérations est principalement destiné aux matrices carrés:

-Inversion, calcul de déterminants
-Divers types de décompositions: LU, QR, QL, Hessenberg pour toutes matrices carrés.
-Le calcul des valeurs propres d'une matrice symétrique (en O(n^2))
-Le calcul des valeurs propres et des vecteurs propres d'une matrice symétrique (en O(n^3))

Une procédure permet de tracer des courbes 1D et 2D de plusieurs types représentant les matrices.

Source / Exemple :


Zip

Conclusion :


Les 2 fonctions de diagonalisation utilisent la méthode itérative de factorisation QR avec décalage de Wilkinson.
Cette méthode à l'avantage d'être rapide ( 0,2 secondes pour une matrice 100X100 ), de plus elle est numériquement très stable, ce qui permet d'obtenir des valeurs et des vecteurs propres d'une précision de 10^-17.
Pour plus de précisions sur l'algorithme lire: http://www-math.mit.edu/~persson/18.335/lec16.pdf

Je vais étendre le travail aux matrices complexes, en particuliers pour diagonaliser tout types de matrices réelles et tout types de matrices complexes.
Cependant j'hésite encore entre 2 solutions: soit développer une class à part de matrices complexes, soit intégrer les matrices complexes dans une unique class de manière à ce que chaque fonction gére indifféremment des matrices réelles et complexes ce qui nécessite plus de travail.
Tout vos commentaires sont les bienvenus, notamment si vous savez comment autoriser des calculs du type M1:=add(M1,mul(M2,M3)) sans que cela ne génère des zones de mémoire non libérables, voir même surcharger les opérateurs.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.