Buscando Runge-Kutta octavo orden en C / C ++

10

Me gustaría usar el método de octavo orden Runge-Kutta (89) en una aplicación de mecánica / astrodinámica celestial, escrita en C ++, usando una máquina Windows. Por lo tanto, me pregunto si alguien conoce una buena biblioteca / implementación documentada y de uso gratuito. Está bien si está escrito en C, siempre que no haya problemas de compilación que se puedan esperar.

Hasta ahora he encontrado esta biblioteca (mymathlib) . El código parece estar bien, pero no he encontrado ninguna información sobre licencias.

¿Me pueden ayudar revelando algunas de las alternativas que podrían conocer y que se adaptarían a mi problema?

EDITAR:
veo que en realidad no hay tantos códigos fuente C / C ++ disponibles como esperaba. Por lo tanto, una versión de Matlab / Octave también estaría bien (todavía tiene que ser de uso gratuito).

James C
fuente

Respuestas:

8

Tanto la Biblioteca Científica GNU (GSL) (C) como Boost Odeint (C ++) presentan métodos Runge-Kutta de octavo orden.

Ambos son de código abierto, y bajo linux y mac deberían estar disponibles directamente desde el administrador de paquetes. En Windows, probablemente será más fácil usar Boost en lugar de GSL.

GSL se publica bajo la licencia GPL y Boost Odeint bajo la licencia Boost.

Editar: Ok, Boost Odeint NO tiene el método Runge-Kutta 89, solo el 78, pero proporciona una receta para hacer steppers arbitrarios Runge-Kutta.

Sin embargo, los métodos de octavo orden son bastante altos y probablemente sean excesivos para su problema.

Prince-Dormand se refiere a un tipo específico de Runge-Kutta, y no está directamente relacionado con el orden, pero el más común es 45. Matlabs ode45, que es su algoritmo ODE recomendado, es una implementación de Prince-Dormand 45. Este es el mismo algoritmo implementado en Boost Odeint Runge_Kutta_Dopri5 .

LKlevin
fuente
1
Gracias por su respuesta. OK, eso es vergonzoso ahora, he echado un vistazo a Boost Odeint incluso antes de preguntar aquí, y solo encontré "runge_kutta_fehlberg78". ¿Es esto lo correcto? En realidad, no sé las diferencias entre los methonds cuando se usan en la práctica, pero estaba buscando un RK89 (llamado también Dormand-Prince mientras busco en Internet). ¿Puede comentar o ampliar su respuesta con respecto a este asunto por favor? Gracias.
James C
Publicación actualizada para responder sus preguntas. Prince-Dormand 45 probablemente resolverá tus problemas muy bien.
LKlevin
15

Si está haciendo mecánica celeste a largo plazo, el uso de un integrador clásico Runge-Kutta no preservará la energía. En ese caso, usar un integrador simpléctico probablemente sería mejor. Boost.odeint también implementa un esquema de Runge-Kutta simpléctico de cuarto orden que funcionaría mejor durante largos intervalos de tiempo. GSL no implementa ningún método simpléctico, por lo que puedo decir.

Geoff Oxberry
fuente
Gracias por su respuesta. ¿Un Runge-Kutta simpléctico de cuarto orden daría mejores resultados que RKF78, si se usa con satélites de la Tierra (órbita baja y órbita espacial más profunda), tal vez durante un período de 1-3 órbitas?
James C
@JamesC Sí. En un período largo, el método simpléctico es mucho mejor.
eccstartup
@eccstartup - ¿Qué considerarías un largo período aquí? Porque podría ser tan largo como una órbita de un planeta alrededor del Sol, o unas pocas órbitas de un satélite meteorológico alrededor de la Tierra, etc.
James C
@JamesC No he observado ese gran problema. Pero para mis problemas de modelo, con muchas órbitas calculadas, los métodos simplécticos dan órbitas muy perfectas.
eccstartup
Por lo tanto, es un consejo programar su propia versión del método implícito Runge-Kutta, que incluye muchos métodos simplécticos con el orden más alto que desee.
eccstartup
4

resumiendo algunos puntos:

  1. Si se trata de una integración a largo plazo de un modelo no disipativo, lo que está buscando es un integrador simpléctico.
  2. De lo contrario, dado que es una ecuación de movimiento, los métodos de Runge-Kutta Nystrom serán más eficientes que una transformación a un sistema de primer orden. Hay métodos RKN de alto orden debido a DP. Hay algunas implementaciones, como aquí en Julia, están documentadas y aquí hay una MATLAB .
  3. Los métodos de Runge-Kutta de alto orden solo son necesarios si desea una solución de alta precisión. Si se trata de tolerancias más bajas, es probable que un RK de quinto orden sea más rápido (por el mismo error). Lo mejor que puede hacer si necesita resolver esto a menudo es probar varios métodos diferentes. En este conjunto de puntos de referencia sobre problemas de 3 cuerpos , vemos que (por el mismo error) los métodos RK de alto orden son solo una mejora marginal en la velocidad, aunque como error -> 0, puede ver que la mejora ya va a> 5x contra Dormand -Prince 45 ( DP5) cuando está buscando 4 dígitos de precisión (las tolerancias son mucho más bajas para esto. Las tolerancias son solo un estadio en cualquier problema). A medida que reduce las tolerancias, la mejora de un método RK de alto orden aumenta, pero es posible que deba comenzar a usar números de mayor precisión.
  4. El algoritmo de orden 7/8 de Dormand-Prince tiene un cuadro diferente de octavo orden que el método DP853 de Hairer dop853y DifferentialEquations.jl DP8(que son los mismos). El último método 853 no se puede implementar en la versión de cuadro estándar de un método Runge-Kutta ya que su estimador de errores no es estándar. Pero este método es mucho más eficiente y no recomendaría incluso usar los métodos más antiguos Fehlberg 7/8 o DP 7/8.
  5. Para los métodos RK de alto orden, los métodos Verner "Eficientes" son el estándar de oro. Eso se muestra en los puntos de referencia que he vinculado. Puede codificarlos en Boost usted mismo, o usar uno de los 2 paquetes que los implementan si lo desea más fácil (Mathematica o DifferentialEquations.jl).
Chris Rackauckas
fuente
2

Me gustaría agregar que si bien lo que Geoff Oxberry sugiere para la integración a largo plazo (utilizando integradores simplécticos) es cierto, en algunos casos no funcionará. Más específicamente, si tiene fuerzas disipativas, su sistema ya no conserva la energía y, por lo tanto, no puede recurrir a integradores simplécticos en ese caso. La persona que hizo la pregunta estaba hablando de órbitas terrestres bajas, y tales órbitas exhiben una gran cantidad de resistencia atmosférica, que es una fuerza disipativa que impide el uso de integradores simplécticos.

En ese caso específico (y para los casos en los que no puede usar / no tiene acceso a / no quiere usar integradores simplécticos), recomendaría el uso del integrador Bulirsch-Stoer si necesita precisión y eficiencia a largo plazo. Funciona bien por experiencia, y también lo recomiendan las Recetas Numéricas (Press et al., 2007).

viiv
fuente
No, no recomiendo recetas numéricas. Especialmente, en la mayoría de los casos, Burlirsch-Stoer no debe recomendarse. Este es un problema bien conocido con el libro. Vea un montón de refutaciones de los mejores investigadores en el campo aquí: uwyo.edu/buerkle/misc/wnotnr.html . Si desea puntos de referencia sobre esto, vea el primer libro de Hairer donde verá que BS casi nunca funciona bien. Un orden más alto solo es más eficiente cuando los errores son lo suficientemente bajos, y nosotros (y otros) hemos realizado evaluaciones comparativas para mostrar de manera bastante consistente que solo es eficiente para la precisión de punto flotante.
Chris Rackauckas
No puedo hablar demasiado por NR, ya que lo utilicé principalmente para EDO, pero me parece que las quejas en la página a la que se vincula son antiguas y han sido abordadas por los autores de NR en su respuesta (final de la página), Pero esto está fuera de tema. Con respecto a la integración a largo plazo de las órbitas con alta precisión (digamos, 13-14 dígitos), que es lo que estaba mencionando en mi respuesta, desde hace tiempo se ha demostrado que los métodos de extrapolación funcionan bien (ver el capítulo de Montenbruck & Gill sobre Integración numérica). Los documentos más recientes también lo usan, y me ha demostrado a mí y a otros un método confiable y eficiente.
viiv
M&G solo lo prueba con dop853 y los métodos RK de alto orden más modernos, como los de Verner, son mucho más eficientes. M&G también parece medir utilizando evaluaciones de funciones, que son un indicador débil de sincronización. Tampoco tiene en cuenta los métodos de Runge-Kutta Nystrom, que son específicamente para ODE de segundo orden y son más eficientes que los métodos RK de primer orden aplicados bastante a los de segundo orden. Con 13-14 dígitos, BS es probablemente competitivo en la mayoría de los problemas, pero está lejos de ser la elección obvia y no he visto un diagrama de precisión de trabajo con métodos recientes en desacuerdo con eso.
Chris Rackauckas
M&G prueba RKN contra RK, y BS y otros contra RKN (páginas 123-132 y 151-154) y dicen que son los métodos RK más eficientes (sin incluir a Verner a pesar de que lo citan). BS demostró ser eficiente con 13-14 dígitos, lo cual fue mi afirmación, lo he visto probado contra dop853, ABM (12), Taylor y RK8 estándar y funciona bien. Tengo que admitir que no lo he visto probado contra RKN pero, por lo que puedo ver de M&G, no está lejos de FILG11, por ejemplo. Estoy realmente interesado en el RK de Verner y veré sus enlaces arriba. ¿Tienes un documento que los prueba a todos para ver?
viiv
Regresé y volví a ejecutar un montón de puntos de referencia en DiffEqBenchmarks.jl y odexno me va bien. Entonces, al menos para las EDO de primer orden y para las tolerancias >=1e-13, la extrapolación no parece funcionar bien y, por lo general, ni siquiera está cerca. Esto está en línea con el reclamo anterior.
Chris Rackauckas