Algo récursif du pivot de gauss - Algo - Programmation
Marsh Posté le 15-04-2005 à 22:47:43
Zipo a écrit : Je cherche un algorithme récursif de la méthode de résolution des systèmes linéaires par pivot de Gauss, est ce que qqn aurait ça sous la main ?? |
La récursion, c'est esthétique, intello et tout, mais c'est très casse-gueule... Un pétage de mémoire automatique (aka 'pile' sur la plupart des implémentations) est toujours à craindre si la récursion s'enfonce un peu trop...
Marsh Posté le 15-04-2005 à 22:49:53
Emmanuel Delahaye a écrit : La récursion, c'est esthétique, intello et tout, mais c'est très casse-gueule... Un pétage de mémoire automatique (aka 'pile' sur la plupart des implémentations) est toujours à craindre si la récursion s'enfonce un peu trop... |
oui je sais mais c'est justement pour comparer la version récusive avec l'itérative
Marsh Posté le 16-04-2005 à 04:47:49
Emmanuel Delahaye a écrit : La récursion, c'est esthétique, intello et tout, mais c'est très casse-gueule... Un pétage de mémoire automatique (aka 'pile' sur la plupart des implémentations) est toujours à craindre si la récursion s'enfonce un peu trop... |
C'est sur si on prend un language imperatif qui ne trouve rien de mieux que de passer en iteratif ...
Je pensais au fait qu'une structure de boucle generale (while par exemple) était équivalente à un simple appel recursif de la fonction sur elle meme en incrementant un certain i ... et en faisant un return quand ce fameux i atteignai une certaine valeur.
Marsh Posté le 19-04-2005 à 18:21:36
ReplyMarsh Posté le 19-04-2005 à 19:17:58
tu viens de l'avoir
Marsh Posté le 19-04-2005 à 19:39:19
Ah vous voulez que je récursive manuellement la version itérative ? ouai pas con mais ça risque d'être super chaud non?
j'ai trouvé une version C++ itérative que j'ai traduite en C comme ça :
Code :
|
la récursivation me semble assez chaude à faire non?
Marsh Posté le 27-04-2005 à 08:19:44
Salut!
Beurk ton code !
Précautions, ça te dit quelques chose?
Quelques manques de précaution évidents :
- si un pivot est nul, adieu la résolution ( tu peux remplacer les pivots nuls par des epsilons très petits, ta solution devient approximative )
- les divisions par zéro!!!!! (l.54)
- tu peux aussi faire un test pour savoir si le système admet une solution, cela t'évitera des surprises désagréables (calcul du rang de la matrice associée au système, calcul du déterminant, des trucs comme ça)
Pour la récursion, cela ne me semble pas très difficile puisque la méthode du pivot est une méthode récursive :
Avec N = nombre d'équations de départ et n = nombre d'équations restant après une étape de la méthode du pivot
ResolRecur(n,N)
- Si n=1 alors fin (trouver les solutions)
- Sinon appliquer la méthode du pivot sur la sous matrice de taille n*(n+1) et ResolRecur(n-1,N)
Ainsi à chaque étape ton système est réduit d'une équation et d'une variable jusqu'à n=1. Voili, N est en paramètre uniquement pour savoir la taille de la matrice.
Bonne chance!
Marsh Posté le 28-04-2005 à 10:44:00
Je viens de traduire en récursif, j'obtiens ça :
ça vous parait correct ?
Code :
|
j'ai mis un test pour les divisions par 0 apocalypse, par contre pourrai-tu m'expliquer + en détail l'histoire du epsilon ? mon prof nous en a parlé mais j'ai pas tout compris
Marsh Posté le 28-04-2005 à 17:53:20
Salut zipo!
Alors deux choses :
- pour ton programme :
il est pas super clair et optimisé surtout pour la résolution après triangularisation :
* le tableau s est inutile, tu peux stocker tes réponses dans la n+1 ième colonne.
* en général dans un tableau à deux dimensions : la première représente les lignes et la deuxième les colonnes...
* est-ce que ça serait pas plus simple de faire ceci : une fois une solution trouvée, disons la première, ligne n-1, colonne n dans ton pg. Tu soustrais pour toutes les lignes i telles que i<(n-1) (simple boucle) au terme de la colonne n (derrière le =) c*s[n-1] où c est le coeffiscient de la ligne i qui correspond à la variable dont tu viens de trouver la solution. Et après tu peux remplacer ce coef par zéro (même si c'est pas utile puisque tu ne les regardera plus ). Comme ça quand tu passes à la ligne suivante (du dessus) tu n'as plus rien à faire qu'une division. (si tu comprends pas je te ferai un exemple).
- pour l'histoire des coeffiscients nuls et des epsilons :
En général lorsqu'on résout un système de manière systématique, on suit cet ordre :
* vérification que le système a une solution et une seule (déterminant non nul je crois)
* on applique le pivot de gauss
Mais le problème est que même si le système a une solution, selon dans quel ordre les équations sont rentrées il se peut qu'un pivot soit nul et donc la résolution foire alors qu'il y a une solution. Il y a alors deux possibilités :
* changer l'ordre des équations ou des variables en priant d'en trouver un dans lequel le pb ne se représente pas, c'est certainement la meilleure solution. Elle est expliquée à cette adresse : http://gershwin.ens.fr/vdaniel/Doc [...] ode90.html
un lien sympa et très clair avec exemple : http://www.dil.univ-mrs.fr/~garret [...] /Pb_01.pdf
* méthode des epsilons qui abouti à une solution approximative. Je ne sais pas ton niveau en maths et j'ai peur de t'embrouiller et de devoir faire cinq pages de commentaires. Si tu vraiment intéressé je repotasserai mes cours de DEUG et j'essayerai de te synthétiser ça.
Bonne chance!
Marsh Posté le 15-04-2005 à 22:40:41
Bonjour
Je cherche un algorithme récursif de la méthode de résolution des systèmes linéaires par pivot de Gauss, est ce que qqn aurait ça sous la main ??
J'ai trouvé la version itérative sur le net (il yen a plein) mais impossible de trouver la version récursive, alors que je sais qu'elle existe !
Merci beaucoup
Message édité par Zipo le 15-04-2005 à 22:47:42
---------------
- mon feed-back