Mathématiques : calcul de détérminant de matrice - C++ - Programmation
Marsh Posté le 27-07-2004 à 10:46:24
pour calculer le déterminant c'est plutot simple question algorithme... mais le probleme c'est qu'il ne sera pas factorisé...
tu as des matrices numériques ou "algébriques" ?
Marsh Posté le 27-07-2004 à 12:37:05
Je ne pense pas qu'un gars qui ne sache pas calculer un déterminant s'attaque a une classe de matrice dont les termes sont formels...
Marsh Posté le 27-07-2004 à 13:16:40
decomposition suivant une ligne ou une colonne + recursivité
Marsh Posté le 27-07-2004 à 13:43:53
ben en fait g pas de probleme pour transposer l'algorithme en c++ mais je me rappel plus comment on fait pour calculer un détérminant!!! lol ... en fait je cherche a savoir quels sont les choses qu'on peut faire pour calculer un détérminant, mais surtt la version la plus facilement transposable en c++...
ps:"tu as des matrices numériques ou "algébriques" ?" ben g un tableau rempli de nombre quoi (d int koi)lol
Marsh Posté le 27-07-2004 à 13:51:15
Citation : ps:"tu as des matrices numériques ou "algébriques" ?" ben g un tableau rempli de nombre quoi (d int koi)lol |
bien vu Ace17
et pour revenir aux matrices, il n'y a pas 36000 façons de calculer un déterminant NxN ...
tu décompose en ligne ou colonnes (donc le plus simples est de prendre la premiere ligne vu que c'est numérique)
et pour chaque terme , par récursivité tu calcule les "petits" déterminant formés...
Marsh Posté le 27-07-2004 à 14:09:14
TriadPtale a écrit : par récursivité tu calcule les "petits" déterminant formés... |
Méthode des cofacteurs, google donne http://www.les-mathematiques.net/b/c/j/node17.php3
Marsh Posté le 27-07-2004 à 14:21:54
par récursivité : ah ok!!!
c vrai ke c logik en + lol ...
j vais essayer ca !!
merci!
Marsh Posté le 27-07-2004 à 16:46:17
Les cofacteurs, c'est très inefficace.
Je dirais diagonalisation (par un pivot de Gauss par ex. ou une décomposition LU). Le déterminant est alors trivial (c'est le produit des éléments diagonaux pour une matrice carrée).
Marsh Posté le 27-07-2004 à 18:37:27
Mais oubliez la un peu la méthode des cofacteurs! Calculer un déterminant de cette facon la c'est un peu du meme genre que la version récursive naive de fibonacci (en pire)! Ca marche pour n = 2, 3, 4 mais des que n=100 vous pouvez toujours attendre d'avoir le résultat...
La méthode des cofacteurs n'a qu'un intéret *théorique*. Personne ne calcule un déterminant en "récursivant" des développements par rapport a une ligne/colonne.
Et pour répondre a el muchacho, il ne s'agit pas de diagonalisation mais de trigonalisation
Marsh Posté le 27-07-2004 à 18:53:33
Ca s'appelle trigonaliser, mettre la matrice sous forme triangulaire supérieure ? Ah merde, ça remonte à loin...
Marsh Posté le 27-07-2004 à 19:59:31
Triangulaire supérieure ou inférieure, c'est bien trigonaliser, tout comme mettre sous forme diagonale c'est diagonaliser.
Marsh Posté le 27-07-2004 à 22:54:40
mais on trigonalise comment? on fait des opérations de ligne et de colones pour avoir genre
1 2 3 4
0 1 3 4
0 0 1 4
0 0 0 1
non?
genre
1 2 le det c -2
3 4
si on trigonalise ca donne
1 2
0 6
ah ouais ca marche lol, mais c sure ke ca marche pour au dela de 4x4???
sinon c sure ke c 100 fois + simple! et g deja tout c k il me faut!
Marsh Posté le 28-07-2004 à 04:22:50
re.. g un probleme toujours, mon algorithme de triagonalisation ne marche pas bien...
redligne(l) modifie la ligne (l-1)spécifié en mettant des 0 et des 1, et je l ai tésté et elle marche sans aucun probleme!
sousligne(1,2) enleve a la ligne 1 la ligne 2
num[][] est ma matrice
void Matrice::redgauss(){
for (int i=0;i<nl;i++){
//on soustrait des autres lignes celle ci
for (int l=(i+1);l<nl;l++){
redligne(i+1);
//+1 a cause de ma fonction que j'ai fait comme ca
redligne(l+1);
//+1 a cause de ma fonction que j'ai fait comme ca
if (num[l][i]!=0){
redligne(l+1);
sousligne(l+1,i+1);
}
}
}
afficher();//affiche la matrice
}
Si quelqu'un pouvait me dire ou est le probleme, ca fait des heures que je cherche lol
mici
Marsh Posté le 28-07-2004 à 08:22:28
Ace17 a écrit : |
Bein le développement suivant une ligne ou colonne, ça a rien à voir avec les cofacteurs, hein....
Marsh Posté le 28-07-2004 à 09:21:48
> lunarnet :
cours : http://asi.insa-rouen.fr/enseignem [...] direct.pdf
codes : http://www.cppfrance.com/gma/Gauss
Marsh Posté le 28-07-2004 à 13:38:34
mon compte marche pas sur cppfrance.com lol ... c bien ma veine!
Marsh Posté le 28-07-2004 à 13:49:31
farib a écrit : Bein le développement suivant une ligne ou colonne, ça a rien à voir avec les cofacteurs, hein.... |
Tu me fous le doute la...
Le déterminant que tu calcules lorsque tu as rayé ta ligne et ta colonne (modulo la multiplication par (-1)^(i+j) ) ce serait pas un cofacteur?
Marsh Posté le 28-07-2004 à 15:01:49
j'ai fait un programme de calcul de determinant de matrice N*N en delphi, ça peut surement t'aider :
http://perso.wanadoo.fr/tutoprog/det.html
bye
Marsh Posté le 28-07-2004 à 15:13:18
Ace17 a écrit : Tu me fous le doute la... |
Ben si.
Et le programme de tafteck est encore une implémentation des cofacteurs. Il serait temps d'apprendre qu'utiliser les cofacteurs pour calculer un déterminant est la pire des méthodes existante, vu que c'est qq chose comme du N^3 !!
Marsh Posté le 28-07-2004 à 15:34:53
oui c vrai, c super nul lol, mais c con car ca au moins j arrive a le faire lol, j'ai de grave probleme pour les moments ou il y a des zeros! bouh!!!
Par contre c dure aussi d'intégré la methôde des cofacteurs dans ma classe de matrice simplement parce que il faut spécifié la taille des tableaux! ce que je n'ai pas besoin de faire avec ma class! donc c 2 fois + nul que c ke tu dit lol
Marsh Posté le 28-07-2004 à 15:35:27
en effet, la meilleure méthode est la trigonalisation, pour les matrices plus complexe je crois qu'il faut utiliser la méthode de Jordan pour pouvoir trigonaliser n'importe qu'elle matrice.
Marsh Posté le 28-07-2004 à 17:32:34
tarfteck a écrit : en effet, la meilleure méthode est la trigonalisation, pour les matrices plus complexe je crois qu'il faut utiliser la méthode de Jordan pour pouvoir trigonaliser n'importe qu'elle matrice. |
Non, pas la peine, Gauss marche a tous les coups. Et il ne s'agit pas vraiment de trigonalisation, dans la mesure ou il ne s'agit pas de trouver une base dans laquelle la matrice de l'application soit triangulaire mais d'arriver a une matrice triangulaire de meme déterminant, et ce, par des opérations élémentaires
Marsh Posté le 29-07-2004 à 00:25:17
euh g une question: si on multiplie une ligne par un nombre est-ce que ca change le détérminant???
Marsh Posté le 29-07-2004 à 01:33:05
si tu multiplies une ligne par a ou une colonne par a le déterminant est multiplié par a ...
si tu ajoute a fois une colonne a une autre tu ne changes pas le déterminant.
Et si tu echanges 2 lignes d'une matrice le determinant est multiplié par -1
voila
A+
Marsh Posté le 29-07-2004 à 01:33:53
ah ben voila, je savais que j avais oublié un truc lol
Merci
Marsh Posté le 29-07-2004 à 07:05:36
>lunarnet : au vu de ta question, tu t'es lancé dans Gauss, non ?
Marsh Posté le 29-07-2004 à 12:23:19
oui , je réduisais les lignes et les colones en multipliant par le premier terme de la ligne non nul (enfin l'inverse de ce nombre) et je soustrayer les lignes. J'avais oublié le détail du dessus du coup je ne trouver jamais de détérminant juste!!!
Marsh Posté le 30-07-2004 à 01:24:43
Ok, je m'en doutais. N'oublie pas de choisir le pivot maximal à chaque étape, de façon à minimiser les erreurs d'arrondi dans tes calculs. C'est le point à ne pas oublier de l'algo. Si tu ne fais pas cela, avec certaines matrices, tu as de fortes chances de te retrouver avec un résultat grossièrement faux à la fin.
Etudie bien la référence que je t'ai donnée, les algos de calcul numérique sont pleins de pièges.
Marsh Posté le 30-07-2004 à 01:39:25
tarfteck a écrit : si tu multiplies une ligne par a ou une colonne par a le déterminant est multiplié par a ... |
et... il se passe quoi si tu ajoute a fois une ligne a une autre???
Marsh Posté le 30-07-2004 à 08:16:19
Tu ne changes pas le déterminant si tu ajoutes une ligne a une autre. Tu peux meme l'ajouter a fois, ca ne change toujours pas le déterminant.
Marsh Posté le 18-08-2004 à 03:28:04
ca y est j'ai enfin réussi mon algorithme qui marche sans aucun probleme, tester sur des centaines d exemples! ca fait plaisir parce que j'y ai passé des semaines!
mais en fait mon seul probleme reste le depassement de donnée: les int ne sont pas assez grand et ca fait tout buggé des fois, y a pas un moyen de savoir si un int arrive a son maximum histoire de mettre un cout<<"votre int est trop grand,choisissez en un autre!"; `???
Marsh Posté le 18-08-2004 à 09:10:36
j'arrive aprés la bataille mais...
j'ajouterais un vote pour la décomposition LU
surtout si aprés on fait mumuse avec Cholesky et on a même la fonction inverse
Marsh Posté le 18-08-2004 à 09:23:03
Il faut que A soit inversible pour pouvoir la décomposer ainsi
Marsh Posté le 18-08-2004 à 09:24:17
Ace17 a écrit : Il faut que A soit inversible pour pouvoir la décomposer ainsi |
certes, mais vu qu'on peut calculer facilement le determinant comme ça?
on s'arrête à cette phase là non?
Marsh Posté le 18-08-2004 à 14:11:11
Ben en fait l avantage c'est que j'ai appris Gauss en cour donc le but c'était de l'utiliser, sinon mon algo marche pour NxN mais la c sure que aprés 10x10 le pc est totalement dépassé par les valeurs qu'il a, mais il suffit d avoire un determinant 4x4 et hop c foutu pour peu que les nombres soit premier genre 4665*4651*5999*4566*9 et c fini, en fait faudrai juste que je limite les nombres a 3 chifres comme ca plus de problémes!!!!
ps: ces nombres ne sont pas premiers mais g pas que ca a faire d'en trouver lol, et en fait le probleme c'est que vu qu'ils sont premiers ils sont irreductibles (mes matrices sont composés de fraction)
Marsh Posté le 27-07-2004 à 03:43:36
Salut a tous!
Je fais actuellement une class matrice avec tous les trucs basiques (transposer, opérations divers etc...)
et je n'arrive pas a trouver de méthode pour calculer les détérminants NxN, j'ai trouver sur le net plusieurs code source deja tout fait mais je n'ai rien compris... alors si vous pouviez m'aider et me donner un algorithme (enfin juste comment on fait quoi, pas de code source, ou le - possible)...
Merci!!!
ps: c + mathématiques qu'autre chose, mais je le fait en c++ alors!
---------------
!jb!