Class tcmatrix, diagonalisation de toutes matrices complexes.

Soyez le premier à donner votre avis sur cette source.

Vue 13 518 fois - Téléchargée 1 216 fois

Description

C'est la suite logique de la class TMatrix qui gérait exclusivement des matrices réelles.
http://www.delphifr.com/codes/CLASS-CALCUL-MATRICIEL-DIAGONALISATION-MATRICES-SYMETRIQUES-REELLES_37616.aspx

Ici on définit une class TCMatrix gérant des matrices complexes de dimensions variables.
Les opérations gérées sont:
-12 fonctions de création de matrices
-16 fonctions de base:addition,soustraction,multiplication,inversion,determinants...
-Décompositions LU,QR,QL,Hessenberg,Schur pour toutes matrices complexes.
-Le calcul des valeurs propres et des vecteurs propres de toutes matrices hermitiennes.
-Le calcul des valeurs propres et des vecteurs propres de toutes matrices complexes (ou réelles).

L'unité TCMatrix permet également:

-Le calcul de l'ensemble des racines de tout polynôme complexe.
-La résolution d'équations différentielles de la forme y'=M*y ou M est une matrice complexe et y un vecteur colonne.
-La résolution d'équation différentielles d'ordre n de la forme an*(d^ny/dt^n)+..+a1*dy/dt+a0*y=0
ou les aj sont des nombres complexes.

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

Source / Exemple :


Le zip contient les unitées Matrix,CMatrix et Cplx qui sert à la gestion des nombres complexes.

Conclusion :


La plupart des fonctions sont surchargées pour supporter à la fois les matrices réelles et complexes.
La diagonalisation utilise la méthode QR avec décalages pour les matrices hermitiennes, pour les matrices non hermitiennes on utilise la décomposition de Schur.

La précision relative obtenue est encore de l'ordre de 10^-17 pour toutes matrices, par contre la diagonalisation d'une matrice complexe non hermitienne demande environs 10X plus de temps que pour une matrice symetrique réelle (2 secondes pour une matrice 100x100).

Limitations:

-La diagonalisation est lente pour les matrices non hermitiennes.
-Le calcul des vecteurs propre d'une matrice non hermitienne ayant des valeurs propres dégénérées pose problème.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
jeudi 11 octobre 2007
Statut
Membre
Dernière intervention
2 décembre 2010

Por favor un ejemplo de utilizacion de la unidad CMatrix.pas ,
gracias
Messages postés
2
Date d'inscription
jeudi 11 octobre 2007
Statut
Membre
Dernière intervention
2 décembre 2010

Por favor un ejemplo del manejo de la unit CMatrix, por favor.
En el Caso de las funciones (inv, det, etc) de matrices, parece que estoy cometiendo errores en la declaracion de mis variable de tipo para las matrices, hasta ahora no logré utilizar muchas funciones de la unit CMatrix.

Gracias, disculpas por el idioma
Messages postés
1
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
16 juillet 2007

I need example from use the cmatrix.pas and cplax.pas
Thanks
Beatriz
Messages postés
1
Date d'inscription
lundi 4 décembre 2006
Statut
Membre
Dernière intervention
3 janvier 2007

Bonjour,
pour la function NormC
il faut :
for i := 1 to M.rowCount
et non M.colCount

sinon je trouve qu'une procédure comme :

procedure MatToStringGrid(M:TMatrix;var grille:Tstringgrid);
var i,j,r,c:integer ;
begin
//Renvoit le contenu de M sous forme d'une Stringgrid
R:=M.rowcount;
C:=M.ColCount ;
grille.Rowcount:=R;
grille.Colcount:=C;
for i:=1 to R do begin
for j:=1 to C do begin
grille.Cells[j-1,i-1]:= floattostr(M.Cells[i,j])
end;
end;
end;

est bien pratique pour la visualisation des matrices.
Messages postés
18
Date d'inscription
mardi 18 avril 2006
Statut
Membre
Dernière intervention
30 mai 2006

Salut foxi,
j'ai essayé de tenir compte des différentes remarques que tu m'as faites sur cette source et sur l'autre source.
En particulier j'ai simplifié les boucles, remplacer les destroy par des free, pour le setlength(array,m,n) c'est corrigé, par contre le array2:=array1 ne semble pas marcher avec les tableaux dynamiques.

Voila, j'en suis encore à une phase de "recherche", donc le code n'est pas garanti 100% stable.
Une fois que j'aurais fini le côté mathématique, j'essayerais de faire un code un peu plus "propre", notamment pour la gestion des class dans laquelle je débute en m'inspirant du tutorial de grandvizir.
Afficher les 6 commentaires

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.