Vous recherchez Runge-Kutta 8ème ordre en C / C ++

10

Je voudrais utiliser la méthode Runge-Kutta de 8e ordre (89) dans une application de mécanique / astrodynamique céleste, écrite en C ++, à l'aide d'une machine Windows. Par conséquent, je me demande si quelqu'un connaît une bonne bibliothèque / implémentation documentée et gratuite à utiliser? C'est correct s'il est écrit en C, tant qu'il n'y a pas de problèmes de compilation à prévoir.

Jusqu'à présent, j'ai trouvé cette bibliothèque (mymathlib) . Le code semble correct, mais je n'ai trouvé aucune information sur les licences.

Pouvez-vous m'aider en révélant certaines des alternatives que vous pourriez connaître et qui conviendraient à mon problème?

EDIT:
Je vois qu'il n'y a pas vraiment autant de codes sources C / C ++ disponibles que je m'y attendais. Par conséquent, une version Matlab / Octave serait également acceptable (doit toujours être gratuite).

James C
la source

Réponses:

8

La bibliothèque scientifique GNU (GSL) (C) et Boost Odeint (C ++) proposent des méthodes Runge-Kutta de 8e ordre.

Les deux sont open source, et sous linux et mac, ils devraient être directement disponibles depuis le gestionnaire de paquets. Sous Windows, il vous sera probablement plus facile d'utiliser Boost plutôt que GSL.

GSL est publié sous licence GPL, et Boost Odeint sous licence Boost.

Edit: Ok, Boost Odeint n'a PAS la méthode Runge-Kutta 89, seulement le 78, mais il fournit une recette pour faire des steppers Runge-Kutta arbitraires.

Cependant, les méthodes de 8e ordre sont assez élevées et sont probablement excessives pour votre problème.

Prince-Dormand fait référence à un type spécifique de Runge-Kutta et n'est pas directement lié à la commande, mais le plus courant est 45. Matlabs ode45, qui est leur algorithme ODE recommandé, est une implémentation Prince-Dormand 45. Il s'agit du même algorithme que celui implémenté dans Boost Odeint Runge_Kutta_Dopri5 .

LKlevin
la source
1
Merci de votre réponse. OK, c'est gênant maintenant, j'ai jeté un coup d'œil à Boost Odeint avant même de demander ici, et je n'ai trouvé que "runge_kutta_fehlberg78". Est-ce la bonne chose? En fait, je ne connais pas les différences entre les méthonds lorsqu'il est utilisé dans la pratique, mais je cherchais un RK89 (appelé aussi Dormand-Prince lorsque je recherche sur Internet). Pouvez-vous commenter ou développer votre réponse à ce sujet s'il vous plaît? Je vous remercie.
James C
Message mis à jour pour répondre à vos questions. Prince-Dormand 45 résoudra très bien vos problèmes.
LKlevin
15

Si vous faites de la mécanique céleste sur de longues échelles de temps, l'utilisation d'un intégrateur Runge-Kutta classique ne préservera pas l'énergie. Dans ce cas, l'utilisation d'un intégrateur symplectique serait probablement préférable. Boost.odeint implémente également un schéma Runge-Kutta symplectique de 4ème ordre qui fonctionnerait mieux pendant de longs intervalles de temps. GSL ne met en œuvre aucune méthode symplectique, pour autant que je sache.

Geoff Oxberry
la source
Merci de votre réponse. Un Runge-Kutta symplectique du 4ème ordre donnerait-il de meilleurs résultats que le RKF78, s'il était utilisé avec des satellites de la Terre (orbite basse et orbite plus profonde), peut-être sur une période de 1 à 3 orbites?
James C
@JamesC Oui. Sur une longue période, la méthode symplectique est bien meilleure.
eccstartup
@eccstartup - Que considéreriez-vous comme une longue période ici? Parce que cela pourrait être aussi long qu'une orbite d'une planète autour du Soleil, ou quelques orbites d'un satellite météorologique autour de la Terre etc.
James C
@JamesC Je n'ai pas observé ce gros problème. Mais pour mes problèmes de modèle, avec de nombreuses orbites calculées, les méthodes symplectiques donnent des orbites très parfaites.
eccstartup
Donc, c'est un conseil de programmer que vous possédez une version de la méthode Runge-Kutta implicite, qui comprend de nombreuses méthodes symplectiques avec un ordre aussi élevé que vous le souhaitez.
eccstartup
4

résumant certains points:

  1. S'il s'agit d'une intégration à long terme d'un modèle non dissapatif, un intégrateur symplectique est ce que vous recherchez.
  2. Sinon, puisqu'il s'agit d'une équation de mouvement, les méthodes Runge-Kutta Nystrom seront plus efficaces qu'une transformation en un système de premier ordre. Il existe des méthodes RKN d'ordre élevé en raison de DP. Il y a quelques implémentations, comme ici dans Julia, elles sont documentées et en voici une MATLAB .
  3. Des méthodes Runge-Kutta d'ordre élevé ne sont nécessaires que si vous voulez une solution de haute précision. S'il s'agit de tolérances inférieures, un RK de 5e ordre sera probablement plus rapide (pour la même erreur). La meilleure chose à faire si vous devez résoudre ce problème souvent est de tester un tas de méthodes différentes. Dans cet ensemble de repères sur les problèmes à 3 corps, nous voyons que (pour la même erreur) les méthodes RK d'ordre élevé ne sont qu'une amélioration marginale de la vitesse, mais comme erreur -> 0, vous pouvez voir que l'amélioration va déjà à> 5x contre Dormand -Prince 45 ( DP5) lorsque vous regardez à 4 chiffres de précision (les tolérances sont cependant beaucoup plus faibles pour cela. Les tolérances ne sont qu'un stade approximatif dans tous les problèmes). Au fur et à mesure que vous réduisez les tolérances, l'amélioration d'une méthode RK d'ordre élevé augmente, mais vous devrez peut-être commencer à utiliser des nombres plus précis.
  4. L'algorithme d'ordre 7/8 de Dormand-Prince a un tableau du 8e ordre différent de la méthode DP853 de Hairer's dop853et DifferentialEquations.jl DP8(qui sont les mêmes). La dernière méthode 853 ne peut pas être implémentée dans la version tableau standard d'une méthode Runge-Kutta car son estimateur d'erreur n'est pas standard. Mais cette méthode est beaucoup plus efficace et je ne recommanderais même pas d'utiliser les anciennes méthodes Fehlberg 7/8 ou DP 7/8.
  5. Pour les méthodes RK d'ordre élevé, les méthodes Verner «efficaces» sont l'étalon-or. Cela apparaît dans les repères que j'ai liés. Vous pouvez les coder dans Boost vous-même, ou utiliser l'un des 2 packages qui les implémentent si vous les souhaitez plus facilement (Mathematica ou DifferentialEquations.jl).
Chris Rackauckas
la source
2

Je voudrais ajouter que même si ce que Geoff Oxberry suggère pour une intégration à long terme (en utilisant des intégrateurs symplectiques) est vrai, dans certains cas, cela ne fonctionnera pas. Plus précisément, si vous avez des forces dissipatives, votre système ne conserve plus l'énergie, et vous ne pouvez donc pas recourir à des intégrateurs symplectiques dans ce cas. La personne qui posait la question parlait d'orbites terrestres basses, et ces orbites présentent une grande quantité de traînée atmosphérique, c'est-à-dire une force dissipative qui empêche d'utiliser de tels intégrateurs symplectiques.

Dans ce cas spécifique (et pour les cas où vous ne pouvez pas utiliser / n'avez pas accès à / ne souhaitez pas utiliser d'intégrateurs symplectiques), je recommanderais l'utilisation de l'intégrateur Bulirsch-Stoer si vous avez besoin de précision et d'efficacité sur de longues périodes. Il fonctionne bien par expérience et est également recommandé par les recettes numériques (Press et al., 2007).

viiv
la source
Non, je ne recommande pas les recettes numériques. Surtout, dans la plupart des cas, Burlirsch-Stoer ne devrait pas être recommandé. Il s'agit d'un problème bien connu avec le livre. Voir un tas de réfutations des meilleurs chercheurs dans le domaine ici: uwyo.edu/buerkle/misc/wnotnr.html . Si vous voulez des repères à ce sujet, consultez le premier livre de Hairer où vous verrez que BS ne réussit presque jamais bien. Un ordre supérieur n'est plus efficace que lorsque les erreurs sont suffisamment faibles, et nous (et d'autres) avons effectué des analyses comparatives pour montrer de manière assez cohérente qu'il n'est efficace que pour la précision en virgule flottante.
Chris Rackauckas
Je ne peux pas trop parler pour NR car je l'ai utilisé principalement pour les ODE, mais il me semble que les plaintes sur la page vers laquelle vous créez un lien sont anciennes et ont été traitées par les auteurs de NR dans leur réponse (fin de la page), mais c'est hors sujet. Concernant l'intégration à long terme des orbites avec une grande précision (disons 13-14 chiffres), ce que je mentionnais dans ma réponse, il est prouvé depuis longtemps que les méthodes d'extrapolation fonctionnent bien (voir le chapitre de Montenbruck & Gill sur l'intégration numérique). Des articles plus récents l'utilisent également, et cela m'a prouvé, ainsi qu'à d'autres, une méthode fiable et efficace.
viiv
M&G le teste uniquement contre dop853 et les méthodes RK d'ordre supérieur plus modernes, comme celles dues à Verner, sont beaucoup plus efficaces. M&G semble également mesurer uniquement à l'aide d'évaluations de fonctions, qui sont un faible indicateur de calendrier. Cela ne contrevient pas non plus aux méthodes Runge-Kutta Nystrom qui sont spécifiquement pour les ODE du deuxième ordre et sont plus efficaces que les méthodes RK du premier ordre appliquées au deuxième ordre. À 13-14 chiffres, BS est probablement compétitif sur la plupart des problèmes, mais c'est loin d'être le choix évident et je n'ai pas vu de diagramme de précision de travail avec des méthodes récentes en désaccord avec cela.
Chris Rackauckas
M&G teste RKN contre RK, et BS et d'autres contre RKN (pages 123-132 et 151-154) et disent qu'elles sont les plus efficaces des méthodes RK (sans compter Verner même s'ils le citent). BS s'est avéré efficace à 13-14 chiffres, ce qui était ma revendication, je l'ai vu testé contre dop853, ABM (12), Taylor et RK8 standard et il fonctionne bien. Je dois admettre que je ne l'ai pas vu testé contre RKN mais d'après ce que je peux voir de M&G, il n'est pas loin de FILG11 par exemple. Je suis vraiment intéressé par Verner RK et regarderai vos liens ci-dessus. Avez-vous un document qui les teste tous pour voir?
viiv
Je suis retourné et j'ai réexécuté un tas de benchmarks sur DiffEqBenchmarks.jl et odexn'a pas tendance à bien se passer . Donc, au moins pour les ODE de premier ordre et pour les tolérances >=1e-13, l'extrapolation ne semble pas bien fonctionner et elle n'est généralement pas proche. Cela est conforme à l'allégation ci-dessus.
Chris Rackauckas