DIAGONALISATION MATRICES SYMETRIQUES NXN

Utilisateur anonyme - 7 août 2006 à 23:11
Saluuuuut Messages postés 2 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 4 juillet 2007 - 4 juil. 2007 à 10:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38978-diagonalisation-matrices-symetriques-nxn

Saluuuuut Messages postés 2 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 4 juillet 2007
4 juil. 2007 à 10:04
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
ksirob Messages postés 3 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 11 mai 2007
29 juin 2007 à 11:19
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
Saluuuuut Messages postés 2 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 4 juillet 2007
28 juin 2007 à 14:49
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
khsou Messages postés 1 Date d'inscription samedi 23 juin 2007 Statut Membre Dernière intervention 23 juin 2007
23 juin 2007 à 01:08
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
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
5 mai 2007 à 09:30
tout est effectivement la, sauf que c'est de la diagonalisation de matrices SYMETRIQUES, le cas general est plus problematique ...
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
4 mai 2007 à 14:19
Bien que ce ne soit pas très poliment demandé, tu as quand même tout sur cette page.
salahtroudi Messages postés 1 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 4 mai 2007
4 mai 2007 à 13:46
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
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 23:29
je l'ai donné 4 postes au-dessus !
Utilisateur anonyme
8 août 2006 à 23:03
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.
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 16:56
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.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 août 2006 à 16:29
Ç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).
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 14:56
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
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 14:45
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;
}
Utilisateur anonyme
8 août 2006 à 14:42
j'ai u petit programme qui calcule les valeurs propres.
est ce qu on peut calculer les vecteurs propres en l'utilisant?
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
8 août 2006 à 14:32
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...
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 13:39
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
Utilisateur anonyme
8 août 2006 à 09:38
est ce qu il ya une possibilite d avoir les resultat sans faire tous les iterations et afficher les resultats directement?
merci
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
8 août 2006 à 01:05
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
Utilisateur anonyme
7 août 2006 à 23:11
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.
Rejoignez-nous