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

Soyez le premier à donner votre avis sur cette source.

Vue 19 244 fois - Téléchargée 4 241 fois

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

Ajouter un commentaire

Commentaires

tybman
Messages postés
5
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
31 octobre 2006
-
Moi je suis un mathématicien et je trouve cela tout simplement fabuleux
cs_cantador
Messages postés
4992
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9 -
Zéro n'existait pas à l'origine..
c'est pour çà qu'il n'existe pas d'année zéro.
il a donc fallut inventer ce chiffre.
Pour ma part, je concerve cet élément tant que je peux dans les tableaux sinon à chaque fois je tombe sur des cas non prévus déclenchant des exceptions.
JnBiz
Messages postés
20
Date d'inscription
mardi 18 avril 2006
Statut
Membre
Dernière intervention
30 mai 2006
-
Brunews, il s'agit d'une convention mathématique, je n'y peux rien, de même le dernier numéro est le numéro n qui correspond également à la taille de la matrice (ce qui n'est pas le cas si on numérote à partir de 0). Une matrice n'est pas qu'un tableau, il y a des règles, des conventions, on ne peut pas faire ce qu'on veut et decréter que le premier élément est placé en (0,0).
C'est juste que les logiques mathématique et informatique différent.
Mais quand il ne s'agit pas de matrices, je rejoins évidemment votre point de vue.
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Salut f0xi,

à propos du NULL : à moins d'un cpu comprenant la philo, par force une comparaison à null (comme à quoi que ce soit d'autre) ne se fait que par arythmétique, aucune valeur 'floue' représentable en binaire ni autre base. Il est d'usage de définir NULL à zéro.

JnBiz > 1 comme base d'indexation n'est en RIEN logique, ça indique simplement l'incompréhension de ce qu'est un tableau. L'index indique l'offset pour accéder à l'élément partant de l'adresse de base du tableau:
exemple d'un tableau de INT32:
tab[n] se trouve à: adresse(tab) + n * sizeof(INT32)
Le 1er élém est donc bien à: adresse(tab) + 0 * sizeof(INT32)
Ceci ne te parait pas nettement plus logique ???
JnBiz
Messages postés
20
Date d'inscription
mardi 18 avril 2006
Statut
Membre
Dernière intervention
30 mai 2006
-
Je me suis fait mal comprendre:
J'ai très bien compris que les tableaux dynamiques commencent par 0, seulement dans l'utilisation pratique d'une matrice (donc par un humain) l'élément (1,1) est par convention mathématique le premier élément, d'où ce décalage.
De même pour l'utilisation des fonctions, methode(A,B,C) C := Methode(A,B) ont beau être équivalent pour le calcul, mais pour l'utilisateur (là encore humain) la 2° solution est plus pratique.
Pour résumer je cherche à faire quelque chose de pratique et de naturel pour l'humain qui ne le soit pas forcément pour l'ordinateur (avoue qu'il est plus facile de réecrire un programme que de réecrire l'algèbre des matrices ;-)).
Par contre la dernière solution add(M1,M2) (additionne M1 et M2 et place le resultat dans M1)) me parait un bon compromis, même si cela n'est pas forcément optimisé pour tout types de calculs (genre M3:=M1+M2). Il ne faut pas oublier que le principal facteur limitant dans le calcul matriciel est l'accès en mémoire qu'il faut limiter au max.
C'est pour ca que j'ai prévu 2 types de calcul:
M1.add(M2) (M1=M1+M2)
et M3:=add(M1,M2) (M3=M1+M2)

Maintenant je me demande si le plus pratique ne serait pas de faire un parser qui gérerait les expression du type "M3=(M1+M2)*M2" cela éviterait d'avoir à gérer des matrices temporaires ce qui est pénible.

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.