Mathématiques : calcul de détérminant de matrice

Mathématiques : calcul de détérminant de matrice - C++ - Programmation

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!!! :bounce:  :bounce:  :bounce:  
ps: c + mathématiques qu'autre chose, mais je le fait en c++ alors!


---------------
!jb!
Reply

Marsh Posté le 27-07-2004 à 03:43:36   

Reply

Marsh Posté le 27-07-2004 à 07:49:38    

quelle est ta question sur le C++ ?

Reply

Marsh Posté le 27-07-2004 à 10:03:14    

Pivot de Gauss...

Reply

Marsh Posté le 27-07-2004 à 10:04:11    

chez boost sinon

Reply

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" ?

Reply

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

Reply

Marsh Posté le 27-07-2004 à 13:16:40    

decomposition suivant une ligne ou une colonne + recursivité


---------------
--- WinSplit Revolution ---
Reply

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


---------------
!jb!
Reply

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

Reply

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

Reply

Marsh Posté le 27-07-2004 à 14:09:14   

Reply

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!


---------------
!jb!
Reply

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


Message édité par el muchacho le 27-07-2004 à 16:53:48

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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

Reply

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


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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.

Reply

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!

Reply

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  :bounce:  :bounce:  :bounce:  
mici


---------------
!jb!
Reply

Marsh Posté le 28-07-2004 à 08:22:28    

Ace17 a écrit :


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.


 
 
Bein le développement suivant une ligne ou colonne, ça a rien à voir avec les cofacteurs, hein....


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 28-07-2004 à 13:38:34    

mon compte marche pas sur cppfrance.com lol ... c bien ma veine!


---------------
!jb!
Reply

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?


Message édité par Ace17 le 28-07-2004 à 13:49:43
Reply

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

Reply

Marsh Posté le 28-07-2004 à 15:13:18    

Ace17 a écrit :

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?


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


Message édité par el muchacho le 28-07-2004 à 15:22:53

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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


---------------
!jb!
Reply

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.

Reply

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


Message édité par Ace17 le 28-07-2004 à 17:32:51
Reply

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


---------------
!jb!
Reply

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+

Reply

Marsh Posté le 29-07-2004 à 01:33:53    

ah ben voila, je savais que j avais oublié un truc lol
Merci


Message édité par lunarnet76 le 29-07-2004 à 01:34:05

---------------
!jb!
Reply

Marsh Posté le 29-07-2004 à 07:05:36    

>lunarnet : au vu de ta question, tu t'es lancé dans Gauss, non ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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


---------------
!jb!
Reply

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.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

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


et... il se passe quoi si tu ajoute a fois une ligne a une autre???


Message édité par lunarnet76 le 30-07-2004 à 01:49:42
Reply

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.

Reply

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!
                           :bounce:
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!"; `???

Reply

Marsh Posté le 18-08-2004 à 08:37:55    

Il marche avec une matrice d'ordre 100 ton algo? :D

Reply

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

Reply

Marsh Posté le 18-08-2004 à 09:23:03    

Il faut que A soit inversible pour pouvoir la décomposer ainsi

Reply

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?

Reply

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)


Message édité par lunarnet76 le 18-08-2004 à 14:13:45
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed