|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Bonjour à tous,
Je voudrais resoudre les équations du pendule double grâce à la méthode de Runge Kutta à pas variable. Mais je n'arrive pas à definir et à utiliser correctement le pas pour chaque étapes. je m'explique: j'ai d'abord créé une boucle pour un pas constant ici 0.001 qui marche très bien. L'utilisation d'un pas variable me ferai gagner du temps de calcul qui me permettrais de résoudre l'équation sur un temps plus long. Comment prendre en compte le pas variable? L'idée est la suivante : après avoir obtenus om1 et om2 avec un pas h, on les compares avec om1_1 et om2_1 qui on été calculés avec un pas h/2 et qui sont donc plus précis. Si la difference est inférieur à la précision demandée, on garde le pas, sinon on le reduit et on recommence. Voir théorie :http://media4.obspm.fr/public/m2r/co...on3_2_4_6.html ou théorie et code: http://www.physique.usherbrooke.ca/p...HQ405_ipad.pdf (p61) ou encore http://users-phys.au.dk/fedorov/Numeric/10/odes.pdf et enfin un chapitre de Numerical recipes ici: http://www.pit.physik.uni-tuebingen....mrec/c16-2.pdf. J'ai donc tenter de rajouter une boucle Runge Kutta plus précise dans la première, de comparer les resultats et ensuite de modifier le pas si necassaire. Voici le code : Code :
J'ai l'impression que le problème vient du fait que même avec un pas plus petit, l'erreur calculée ne diminue pas, elle augmente. Dès lors, on ne se trouve plus jamais dans le cas 'err<=p' et le programme ne s'arrête plus. Est ce que quelqu'un sait pourquoi l'erreur augment alors que le pas diminue ? Est-ce que vous pensez que le problème est purement mathématique ou qu'il vient du programme? Si vous avez des remarques ou des commentaires sur le code, je prend! Merci d'avance pour vos réponses. |
||
|
|
00
|
|
|
#2 |
|
Membre actif
![]() ![]() Guillaume Développeur informatique Inscription : janvier 2012 Messages : 27 ![]() |
Penses à factoriser ton code tu fais un copier/coller de deux fois la même portion de code ce qui n'est pas bien ^^.
Pour ton problème, si tu passes par une erreur acceptable, il faut mettre à jour om1 et om2 pour qu'ils prennent om1_1 et om2_1 comme valeur sinon cela ne sert à rien. De même pour Om1 et Om2 qui doivent prendre les valeurs om1_1 et om2_1. Après je ne connais pas la méthode, mais d'après le document pdf, le pas de temps est modifié aussi p66 Ligne 42 du document code: http://www.physique.usherbrooke.ca/p...HQ405_ipad.pdf |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mai 2008 Messages : 5 ![]() |
Merci pour ta réponse.
Concernant le copier coller: Les deux boucles sont presques les même mais elles prennent des valeurs différente à chaque pas, ce sont en fait deux boucle complètement différentes. Il est vrai que j'aurais du utiliser une seule routine dans une définition et l'appeler deux fois avec des valeurs différentes. Pour la mise à jour des valeurs: d'après ce que j'ai compris, la deuxième boucle ne sert que de vérification, et on utilise les valeurs de la première si l'erreur est acceptable. C'est pourquoi ce sont om1 et om2 qui sont ajoutés. Par ailleurs, j'ai demander à mon prof d'info pourquoi l'erreur augmente alors que le pas diminue qui m'a répondu: que lorsqu'on utilises une routine à pas variable il faut faire attention au fait que lorsque le pas devient très petit, l'erreur numérique tend vers zéro (en théorie), par contre l'ereur que l'on fait (due à la précision de représentation) lors des calculs augmente... il faut donc trouver un optimum. Un algorithme est proposé dans les numerical recipes dont on peux s'inspirer. http://apps.nrbook.com/c/index.html, (aller aux pages pages 714-722). Finalement mise en place d'une routine à pas variable est finalement un peu trop complexe pour mon niveau de programmation, initié depuis quelques semaines... Je n'aurais pas le temps de corriger le programme dans les prochains jours, le sujet est donc résolue. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com