Résolution d'un systeme d'équations [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008
-
Manubbosse
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008
-
Bonjour à tous!!

Dans le cadre d'un stage, je dois (entre autre) programmer un logiciel de calcul de facteur solaire. Heureusement pour moi, je ne dois m'occuper que du coeur de calcul. Je suis, en effet, un grand débutant en programmation.

Pour l'instant, mon programme stocke les données entrées.

Je dois maintenant résoudre un systeme pouvant aller jusqu'à 150 équations à 150 inconnues et je suis quelque peu bloqué...
On m'avait dit d'utiliser une librairie mais cela me laisse perplexe.
Pour résoudre ce type de systeme, il y a de nombeuses méthodes plus ou moins efficaces. Existe-il une librairie en C/C++ qui "choisirait automatiquement" la meilleure méthode de résolution?

Merci à vous et désolé si le néophyte que je suis s'exprime mal!!

Manu 

12 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
va falloir utiliser des méthodes itératives alors. Quant à ta question, ça m'étonnerait qu'on puisse déterminer la meilleure méthode de façon automatique; cela dépend de la forme du système, mais pas seulement.
Mais comme disait luhtor, 150 inconnues cela reste une taille raisonnable (du moment que les équations ne sont pas trop tordues), donc a priori contente-toi de trouver une méthode qui fonctionne, peu importe si une autre t'aurait gagner 10µs.
Messages postés
4
Date d'inscription
jeudi 10 juillet 2008
Statut
Membre
Dernière intervention
11 juillet 2008

Bonjour,

N'ayant pas vu la tête du système que tu cherche à résoudre ni la façon dont il est dérivé, je ne puis faire que des suppositions. Voilà la technique que j'utiliserais :
1) Réécrire le système en remplaçant toutes les inconnues T par les inconnues phi = sigma * T^4, k étant une constante adaptée à ton problème (cette étape améliore la précision de l'étape 2),
2) Linéariser le système et le résoudre avec une méthode d'inversion exacte (pas de prob. puisque taille ~ 150*150),
3) Revenir au vrai système, le non linéaire. Le résoudre à l'aide d'une méthode itérative (par ex. Newton), en utilisant comme condition initiale de l'algorithme la solution obtenue à la fin de l'étape 2.

En résumé, le passage par la résolution du linéarisé permet de trouver une "bonne" condition initiale pour l'algorithme itératif de résolution du système non linéaire. L'expérience montre que le temps de calcul passé à l'étape 2 est largement compensé par le gain réalisé lors de l'étape 3 (très peu d'itérations seront nécessaires si ton système décrit une physique non chaotique).
Messages postés
4
Date d'inscription
jeudi 10 juillet 2008
Statut
Membre
Dernière intervention
11 juillet 2008

Déterminer une matrice jacobienne revient à déterminer les quantités dF_i/dx_j (en prenant tes notations).

Pour le faire numériquement, je connais deux techniques.

Technique 1 : calcul par taux de variation
C'est la technique de base, facile à mettre en oeuvre, efficace, mais qui pose parfois des problèmes de convergence car assez peu précise.
Il s'agit simplement d'utiliser des développements de Taylor d'ordre 1 :
dF_i/dx_j      =(env.)     ( F_i(x_j+h) - F_i(x_j) ) / h,
où h est une petite quantité scalaire qu'il faut fixer numériquement. En pratique, il faut prendre h supérieur à la précision machine (de l'ordre de 1.e-14 en double précision), mais assez petit quand même pour que le dév. de Taylor ait un sens. Lorsque le système d'équations est adimensionné, h = 1.e-8 ou 1.e-9 fonctionne très bien.

Technique 2 : différenciation automatique
En langage C++, il existe des bibliothèques qui peuvent différencier automatiquement ton code lors de la compilation de façon à pouvoir fournir à l'execution gradients, matrices jacobiennes, hessiennes... numériquement avec pour seule erreur l'erreur machine, la différenciation utilisant les formules usuelles, exactes. Il faut reconnaitre que le principe est assez génial !
Dans le temps, j'avais utilisé celle-ci :
http://www.fadbad.com/fadbad.html
La prise en main se fait vite, car des exemples concrets sont fournis dans le lot.

En tout cas, mon expérience personnelle m'a montré que la différenciation automatique est qqchose de couteux en tps de compilation sur de gros codes, et que, pour les cas que j'avais considérés, le gain en précision ne modifiait pas la vitesse de convergence des algorithmes de Newton. Bref, je te conseille de mettre en oeuvre la technique 1 pour commencer.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oui, tu as des méthodes plus ou moins adaptés à tel ou tel problème. Mais il y a aussi des méthodes systématiques. Les librairies offrent les deux. Le gain éventuel à choisir la bonne méthode, c'est la vitesse de  résolution. Mais pour un aussi petit système (150x150) n'importe quelle méthode te fournira un résultat instantané. (Evidemment, ca dépend après cb de fois tu dois résoudre ce système).

Seule précision, les quelques lignes précédentes ont un intéret si ton problème est linéaire, ce qui est le cas j'imagine.
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Merci pour cette précision.

Par contre j'ai un gros doute mais je crois bien que mon system n'est pas linéaire. Il y a, en effet, des équation avec du T^4 (ou T est une des inconnues) et des exponentielles. 

Comment faire dans ce cas la?

Merci

Manu 
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Les équations ne sont effectivement pas trop tordues! A part un exposant 4 dans certaines et une exponentielle dans une autre, ça devrait donc aller...

Merci a vous!
Je m'en vais rechercher une bibliotheque avec ces différentes méthodes et en choisir une qui fonctionne!

Manu 
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Autant pour moi, les puissances quatrièmes rendent le truc totalement non linéaire :) Mais tu peux pas utiliser des méthodes de radiosité ou truc du genre qui te permettrait de construire un modèle nodale. Et ca, ca se résoue facilement puisque ca se met sous la forme d'un système matriciel.
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Je n'ai jamais entendu parler de radiosité ou de modèle nodale. Il m'est donc difficile de te répondre!! [javascript:Insert_Emoticon('/imgs2/smile_wink.gif'); ]

Qu'est ce que c'est?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Ca ressemble un petit peu a une des parties de mon systeme (qui considere également des rayonnements de surface) mais les autres parties sont différentes.
Aujourd'hui je vais essayer de lancer la résolution avec la méthode de Newton (si j'arrive à la trouver parceque là, je galere un peu ) pour voir si ça donne de bons résultats. Je pense que ça me permettra d'avancer quelque peu!
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Bonjour,

Merci pour ta réponse!
Etant donné que c'est une résolution pour un probleme phsique tres appliqué. Je pense déja connaitre "à peu près" les conditions initiales.
J'ai trouvé un code qui utilise la méthode de Newton mais il me manque la matrice jacobienne de mon systeme. (en considérant tout mon systeme comme F(x) avec x=(x1,x2,...xn) vecteur des inconnes)

Donc si par hasard, tu, ou quelqun, connait un code qui permet de déterminer cette matrice, je suis preneur!

Merci!  
Messages postés
16
Date d'inscription
mercredi 25 juin 2008
Statut
Membre
Dernière intervention
10 juillet 2008

Ok, merci!

Je vais voir ça!