begin process at 2012 05 27 15:39:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > DIAGONALISATION MATRICES SYMETRIQUES NXN

DIAGONALISATION MATRICES SYMETRIQUES NXN




 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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture CLASS MATRICE C++ par elkasimi2007
Source avec une capture CALCUL D'INCERTITUDE par Minilogus
DIAGONALISATION DE MATRICES 3X3 SYMETRIQUES par JCDjcd

Commentaires et avis

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.

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

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

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

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...

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?

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;
}

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

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).

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.

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.

Commentaire de JCDjcd le 08/08/2006 23:29:53

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

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

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.

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 ...

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

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

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

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 résoudre formule (a+b)^n à l'aide de la formule du binôme de Newton [ par sixiko ] Bonjour, Je dois réaliser dans l'urgence un programme sous dev++ permettant d'initialiser et créer une matrice pour gérer jusqu'à n=10 selon la formu decomposition en valeur singuliére d'une matrice creuse [ par cybxx ] bonjour,je cherche une implémentation qui décompose en valeur singulière une matrice creuse défini positive en C.l'idée est de récupéré les valeur pro 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales