Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DIAGONALISATION MATRICES SYMETRIQUES NXN


Information sur la source



Description

Cliquez pour voir la capture en taille normale
J'avais déjà fait une source sur la diagonalisation d'une matrice symétrique 3x3.
Ici je présente la généralisation au cas des matrices NxN (avec par exemple N=10).

L'algorithme ressemble a celui des puissances itérées :
Soit M une matrice symetrique réelle. Elle est donc diagonalisable dans une
base orthonormée. On note O la matrice de passage de la base canonique a
la base de diagonalisation. O est un matrice orthogonale est on a la relation :
M = O.D.tO où tO est la transposée de O et D une matrice diagonale.

Le but est de trouver O, ie les vecteurs propres. On obtient les valeurs propres
en calculant D = tO.M.O (tO = O^-1 !!!)

Le principe est de faire :
O := M.O (on applique M a chaque vecteur colonne)
O := GramSchmidt(O) (procédé d'orthonormalisation de Gram-Schmidt)
Puis de répéter autant de fois que nécéssaire.
Le premier  vecteur colonne de O va converger vers un vecteur propre
de norme 1 et de valeur propre maximale. Ensuite le second vecteur
colonne vers le vecteur propre associé & la seconde plus grande valeur
propre (en module !), ect...

Vous pouvez verifier que les valeurs propres sont dans l'ordre
decroissant en module
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Stiko le 07/08/2006 23:11:43

salut,
je suis debutant en C mais si j ai une matrice symétrique M de dimension 10.coment je peut integerer dans le programme et qu est ce qu il faut chager pour seulement afficher les valeurs et les vecteurs propres correspondants??(je sais je suis chiant)

mersipour votre patience.

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 01:05:29

voila comment utiliser le programme :

// creation d'une matrice
M = CreateMatrix(10,10);
// initialisation de l'element (i,j) de la matrice M à pi
SetItemMatrix(M,i,j,3.1415);
// obtenir la valeur (i,j) de la matrice M
m_ij = GetItemMatrix(M,i,j);

utiliser cet algorithme autant de fois que necessaire :
       {
       P_MATRIX mul;
       mul = MulMatrix(M,O);
       DeleteMatrix(O);
       O = mul;
       GramSchmidtMatrix(O,O);
       }

M etant la matrice initiale, et O la matrice initialement a Id
Apres quelques iterations, tu recuperes les vecteurs propres
dans les colonnes de O, et les valeurs propres sur le diagonale
de tO.M.O

signaler à un administrateur
Commentaire de Stiko le 08/08/2006 09:38:18

est ce qu il ya une possibilite d avoir les resultat sans faire tous les iterations et afficher les resultats directement?
merci

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 13:39:08

ben NON :
tu es oblige de faire l'algorithme si tu veux faire l'algorithme !!!
tu ne peux pas avoir le resultat d'un coup de baguette magique !

tu fais dans le WM_CREATE une boucle <for> avec le code
de ci-dessus, et tu auras "directement" le resultat

signaler à un administrateur
Commentaire de Galmiza le 08/08/2006 14:32:59

Salut,

L'itération doit etre transparente pour l'utilisateur, nan ?
Il n'y a qu'une seule base dans laquelle la matrice symétrique est diagonale. On devrait pouvoir faire:

MATRIX m = ...;   // m matrice symétrique
MATRIX transformation; // chgt de base
MATRIX diag;
BOOL success = DiagMatrix(&diag, &transformation, &m);

Et avoir acces aux résultats.
Avec pourquoi pas d'autres parametres comme la précision souhaitée...

signaler à un administrateur
Commentaire de Stiko le 08/08/2006 14:42:07

j'ai u petit programme qui calcule les valeurs propres.
est ce qu on peut calculer les vecteurs propres en l'utilisant?

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 14:45:27

heu ... la base n'est pas unique :
- s'il y a deux valeurs propres identiques
- on peut echanger deux vecteurs de la base
- on peux changer les signes des vecteurs

J'ai effectivement pas fait la fonction DiagSym()
mais j'ai donné les indications comment la faire :
BOOL diagSym(P_MATRIX M,P_MATRIX O,n)
{
int k;
for(k=0;k<n;k++) // <n> iterations
       {
       P_MATRIX mul;
       mul = MulMatrix(M,O);
       DeleteMatrix(O);
       O = mul;
       GramSchmidtMatrix(O,O);
       }
return TRUE;
}

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 14:56:10

ben non ... mais l'inverse oui.
Avec une valeur propre, tu peut essayer de trouver les vecteurs
en cherchant le noyau de M-lambda.Id, mais ca devient
aussi difficile que de chercher directement les vecteurs

signaler à un administrateur
Commentaire de Kirua le 08/08/2006 16:29:08

Ça me paraît vraiment bizarre de faire "converger" vers les vecteurs propres!

Quand tu fais les choses à la main, tu trouves les valeurs propres à partir des racines des polynômes, puis à partir de là les espaces propres et tu prends un représentant non nul de chaque espace.

Toutes ces opérations sont "mécaniques", tout à fait transcriptibles en algorithmes mais ... il y a le souci de la précision des racines du polynôme caractéristique de M. Est-ce que c'est pour ça que tu fais le travail à l'envers? (enfin, ça me semble être à l'envers, parce que trouver l'espace propre n'est pas si dur; c'est juste compliqué à mettre sous forme de structure, c'est vrai).

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 16:56:22

Je ne vois pas le problème de faire converger un vecteur
vers un vecteur propre ... Il y a une topologie associée à
la norme euclidienne, donc converger veut dire que la norme
de la difference tend vers 0

C'est possible de la faire dans ce sens,
mais regardons l'algorithme globalement :
- calcul du polynome caracteristique :
c'est pas facile, c'est long, et surtout c'est pas
numériquement stable
- factorisation du polynome :
(mêmes remarques)
autre problème : les racines multiples
- pour chaque valeurs propres resourdre (M-lambda.Id).X=0 :
resolution par pivot de Gauss, algo. en O(n^3)
avec ici un probleme si le sous-espace propre est de dimension >=2


Alors moi je propose un algorithme un peu plus "direct", et
je pense un peu plus stable. Mais il y a d'autre algorithme
beaucoup plus robuste (problème par exemple de deux
valeurs propres très proches)
Il est vrai que cet algo. doit s'effectuer sur des petites matrices.
10x10 c'est raisonnable, mais faut pas essayer de monter plus haut.

signaler à un administrateur
Commentaire de Stiko le 08/08/2006 23:03:50

la matrice sque j utilise est de dimension 10 est ec que vous pouvez m envoyer l algo.commme je suis pas specialiste en mathematique j espere que je peut arriver a une solution a la fin.

signaler à un administrateur
Commentaire de JCDjcd le 08/08/2006 23:29:53

je l'ai donné 4 postes au-dessus !

signaler à un administrateur
Commentaire de salahtroudi le 04/05/2007 13:46:55

je veux le programme complet en C qui permet de diagonaliser une matrice carré de dimension (NxN)avec tous les fichier.H nécessaire pour l'exécution. merci

signaler à un administrateur
Commentaire de econs le 04/05/2007 14:19:58 administrateur CS

Bien que ce ne soit pas très poliment demandé, tu as quand même tout sur cette page.

signaler à un administrateur
Commentaire de JCDjcd le 05/05/2007 09:30:07

tout est effectivement la, sauf que c'est de la diagonalisation de matrices SYMETRIQUES, le cas general est plus problematique ...

signaler à un administrateur
Commentaire de khsou le 23/06/2007 01:08:51

Bonjour,

Tout d'abord je vous remerci énormement pour le travail que vous l'avez fait. en regardant l'algo
l'algo que vous l'avez utilisé pour la recherche des valeurs et des vecteurs propres d'une matrice 3X3 on remarque que la convergence est assuré aprés 10 itérs.
ma question pourquoi ce choix particulier du nbre d'iters? est ce qu'on peut pas tomber dans un cas ou la convergence est atteinte à un nbre bq plus ou bq moins inferieur que 10.
ma deuxieme question lorsque vous calculer les valeurs propres en faisant le rapport des modules qui sont bien éviedemment positifs vous trouveres des valeurs positifs et c'est pas tjrs le cas.
normalement vous devriez tenir compte de signe des valeurs propres en faisant la projection entre les Yi et les Xi

Je vous remerci encore une autre fois et j'attend votre reponse.

il est bien clair qe la convergence est attenu

Cordialement

signaler à un administrateur
Commentaire de Saluuuuut le 28/06/2007 14:49:57

Coucou tous

Je suis débutant en c et je cherche un code permettant de trouver les valeurs et vecteurs propres d'une matrice 3*3. Quelle ne fut poas ma joie quand j'ai vu celui qui était proposé sur ce site.

Je n'y coonait pas grand chose mais je suis surpris qu'il existe un paramDGB.h et qu'il n'y aie pas de paramDGB.c.

Voudriez vous eclairer ma lanterne SVP.

Saluuuuut

signaler à un administrateur
Commentaire de ksirob le 29/06/2007 11:19:30

Salut JCDjcd,

Bon, c sûr que pour les débutants c pas facile.
Il manque peut-être une fonction principale de la forme :

dsyev(H, p, diagevals, X) avec
p les dimensions,
H la matrice d'entrée,
diagevals les valeurs propres,
X les vecteurs propres.

Sinon en fait, le problème est de comprendre comment tu codes ????
Sinon Scot Shaw a mis en place une méthode de calcul intéressante mais que je n'arrive pas à intégre à mon prog principal...

++ et merci

signaler à un administrateur
Commentaire de Saluuuuut le 04/07/2007 10:04:35

Coucou,

J'ai essayé d'utiliser le programme de diag° 3*3 qui est proposé mais rien ne se passe et je reçois le message suivant sans passage par la console :

Switching to target: default
Linking console executable: C:\Documents and Settings\utilisateur\Bureau\VectProp\console.exe
.objs\util.o:util.c:(.text+0x4e2): undefined reference to `GetObjectType@4'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)

Je ne sais pas ce que ça sous entend...

Merci d'avance

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Multiplication de matrice symétrique [ par sortileges125 ] Voilà mon problème,Je cherche à faire une multiplication de deux matrices symétriques mais seulement avec la partie supérieure ou la partie inférieure Covariance et valeur propre [ par Stiko ] Salut, j aimerais savoir si vous connaissez de codes deja faite pour le caalcul de valeurs propres et la matrice de covariance en c++. merci classe contenant un attribut de son propre type [ par Sk8yo ] Bonjour,voila je cherche a créer une classe contenant un attribut de cette meme classe,du genre:----------------------class A{  private:    A attribut opencv BIBLIO [ par atefensi ] ds la bibliotheque opencv quel est la différence entre iplimage et cvmat? est ce qu'on peut utiliser simultanement la matrice comme  de type iplimage Comment renvoyer la valeur hexadecimal d'un pixel de l'écran? (debutant) [ par jphenixb ] Bonjours, je cherche a pointer sur un pixel particulier apres avoir fait un print screen puis renvoyer la valleur de ce pixel sur l'écran.Malheureusem besoin d'aide, débutant.. [ par boozid ] Je débute en C, pouvez vous me dire ce qu'il ne va pas ? -&gt; Mes qqes lignes de programme sont censé divisé a par b et de retourner la valeur : le Aide sur la construction d'une fonction [ par iamor ] Bonsoir, je souhaite améliorer un programme que j'ai codé pour qu'il soit plus clean, mais pour se faire j'aurai besoin d'avoir une petite aide sur la est ce une api? [ par tezca_system ] Bonjour,je cherche un moyen de verifier le nom de mon executable lors de sa propre executio Valeur de subkey (const BYTE*) [ par deck_bsd ] Bonjour à tous,Voila , j'ai une fonction qui crée une nouvelle subKey. Elle se crée bien, l'ennui c'est que aparement je n'ai pas compris comment lui problème getline pour la lecture d'un fichier C++ [ par janiaut ] Bonjour, je suis novice dans la programmation en C/C++ et j'ai quelques problèmes sur la lecture d'un fichier. Je vous explique ce qu'on me programme


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.