Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008
-
30 juin 2008 à 11:29
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008
-
10 juil. 2008 à 15:30
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!!
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 30 juin 2008 à 14:39
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.
Sylphe67
Messages postés4Date d'inscriptionjeudi 10 juillet 2008StatutMembreDernière intervention11 juillet 2008 10 juil. 2008 à 11:59
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).
Sylphe67
Messages postés4Date d'inscriptionjeudi 10 juillet 2008StatutMembreDernière intervention11 juillet 2008 10 juil. 2008 à 15:06
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 30 juin 2008 à 11:40
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008 30 juin 2008 à 12:12
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.
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008 30 juin 2008 à 15:05
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!
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 30 juin 2008 à 18:23
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.
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008 30 juin 2008 à 18:48
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'); ]
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008 1 juil. 2008 à 09:00
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!
Manubbosse
Messages postés16Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention10 juillet 2008 10 juil. 2008 à 14:31
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!