Utilisateur anonyme
-
7 août 2006 à 23:11
Saluuuuut
Messages postés2Date d'inscriptionjeudi 28 juin 2007StatutMembreDerniè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.
Saluuuuut
Messages postés2Date d'inscriptionjeudi 28 juin 2007StatutMembreDerniè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és3Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention11 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és2Date d'inscriptionjeudi 28 juin 2007StatutMembreDerniè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és1Date d'inscriptionsamedi 23 juin 2007StatutMembreDernière intervention23 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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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és4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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és1Date d'inscriptionlundi 30 avril 2007StatutMembreDerniè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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 8 août 2006 à 23:29
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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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;
}
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és573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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
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és1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 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
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)
4 juil. 2007 à 10:04
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
29 juin 2007 à 11:19
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
28 juin 2007 à 14:49
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
23 juin 2007 à 01:08
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
5 mai 2007 à 09:30
4 mai 2007 à 14:19
4 mai 2007 à 13:46
8 août 2006 à 23:29
8 août 2006 à 23:03
8 août 2006 à 16:56
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.
8 août 2006 à 16:29
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).
8 août 2006 à 14:56
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
8 août 2006 à 14:45
- 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;
}
8 août 2006 à 14:42
est ce qu on peut calculer les vecteurs propres en l'utilisant?
8 août 2006 à 14:32
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...
8 août 2006 à 13:39
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
8 août 2006 à 09:38
merci
8 août 2006 à 01:05
// 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
7 août 2006 à 23:11
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.