Algunos libros antiguos que he visto dicen que el número mínimo de etapas de un método Runge-Kutta explícito de un orden específico es desconocido para los pedidos . ¿Sigue siendo cierto?
¿Qué bibliotecas hay para trabajar automáticamente con métodos Runge-Kutta de alto orden?
ode
runge-kutta
Kirill
fuente
fuente
Respuestas:
Límites
Eso sigue siendo cierto. En el libro de Butcher , página 196, dice lo siguiente: en un artículo de 1985, Butcher demostró que necesita 11 etapas para obtener el pedido 8 , y esto es nítido. Para el pedido 10, Hairer obtuvo una familia de métodos de 17 etapas , pero no se sabe si uno puede hacerlo mejor. La misma información se proporciona en la Sección II.5 de Hairer, Norsett y Wanner vol. I . La última referencia también pasa por algunas de las técnicas para desarrollar pares de alto orden (hasta el orden 8).
Hay un límite superior en el número mínimo de etapas requeridas para cualquier orden, ya que puede construirlas por extrapolación. Esto se conoce desde hace mucho tiempo; vea este reciente artículo mío para una explicación. Sin embargo, este límite es cuadrático en el orden y ciertamente es bastante pesimista. El software de nodo que se describe a continuación puede generar coeficientes exactos para estos métodos, y también para los métodos de corrección diferida (que son métodos Runge-Kutta) de cualquier orden.
Creo que @Etienne tiene razón al decir que los métodos de mayor orden que se han construido a mano se deben a Terry Feagin. Con respecto a su otro comentario, este documento contiene unos 9 (8) pares:
Aquí hay una tabla del número (acumulativo) de condiciones de pedido requeridas para cada pedido ; esta tabla va más allá de las proporcionadas en la literatura y se produjo utilizando nodepy:norte pags
Software
Para métodos de orden muy alto, el número y la complejidad de las condiciones de la orden se vuelven imposibles de manejar a mano. Algunos paquetes simbólicos (Mathematica, al menos) tienen capacidades para generar condiciones de orden Runge-Kutta. Probablemente hay algunos otros paquetes por ahí, pero soy consciente de lo siguiente (que escribí):
Otra nota interesante sobre las condiciones del pedido, que se vuelve significativa en pedidos tan altos, es que hay dos formas de derivarlas, y le dan condiciones diferentes (pero colectivamente equivalentes): una se debe a Butcher, la otra a Albrecht .
fuente
La respuesta de @DavidKetcheson llega a los puntos importantes: siempre se pueden construir métodos de orden suficientemente alto mediante extrapolación, es un límite muy pesimista y siempre se puede hacer mucho mejor, todos los buenos se obtienen a mano (con la ayuda de alguna computadora herramientas de álgebra), no se conoce un límite inferior, y los métodos de mayor orden se deben a Feagin. Teniendo en cuenta algunos de los comentarios, quise completar la respuesta con una discusión de los cuadros actuales en el campo.
Si desea un compendio de cuadros RK, puede encontrar uno en este código de Julia . Las citas del papel del que provienen se encuentran en las cadenas de documentos para los constructores de cuadros. La documentación del desarrollador para DifferentialEquations.jl enumera todos estos cuadros como disponibles para su uso , y puede ver aquí que todos estos se prueban usando Travis y AppVeyor suites de integración continua para asegurarse de que no solo se cumplan las condiciones del pedido, sino que realmente lograr la convergencia solicitada (prueba de verificación). De estos, puede ver que hay:
(que pude encontrar que fueron publicados). De nuevo, todo derivado a mano.
Las pruebas de convergencia muestran que algunas de las derivaciones no se llevaron a cabo con la precisión suficiente para trabajar con números de más de 64 bits (se comentan así ). Entonces, es una peculiaridad interesante a tener en cuenta: en estos pedidos altos, generalmente solo se obtienen coeficientes que "ante un error
x
" satisfacen las condiciones del pedido, pero cuando se usa la aritmética de precisión arbitraria, en realidad se pueden detectar estos límites. Por lo tanto, la precisión con la que lleva a cabo los coeficientes es importante, y debe elegirla para cubrir la precisión que desea probar (/ usar, por supuesto).Si quieres un montón de gráficos de estabilidad, puedes
plot(tableau)
usar la receta Plots.jl. Un conjunto bien de notas que tiene una gran cantidad de este escrito se puede encontrar en la página web de Peter Stone (ir a continuación y haga clic en especificar el orden de 10 esquemas y obtendrá un montón de archivos PDF). Al desarrollar DifferentialEquations.jl, creé ese conjunto de cuadros para analizarlos sistemáticamente en los problemas de prueba / mirar los indicadores analíticos para ver cuáles deberían incluirse en la biblioteca principal. Tomé algunas notas rápidas aquí . Como puede ver en los algoritmos incluidos en la biblioteca principal, los que encontré valiosos fueron los métodos de Verner y Feagin. El método de noveno orden de Verner es el método de orden más alto con un interpolante que también coincide con el orden. Eso es algo que hay que reconocer: los métodos Feagin no tienen un interpolante a juego (aunque puedes arrancar Hermite, pero eso es realmente ineficiente).Dado que todos se implementan con implementaciones muy eficientes, puede jugar con ellos usted mismo y ver cuánto importan realmente las diferentes características. Aquí hay un cuaderno Jupyter que muestra los métodos Feagin en uso . Tenga en cuenta que la trama de convergencia realmente va a
1e-48
error. Los métodos de orden superior son solo más eficientes que los de orden inferior cuando realmente se necesita una tolerancia muy muy baja. Puede encontrar algunos puntos de referencia que usan algunos de ellos en DiffEqBenchmarks.jl , aunque cuando se usan generalmente es el método Verner de noveno orden, y generalmente muestra que el punto de referencia no está en el régimen donde este alto orden es eficiente.Entonces, si desea jugar y trabajar con algunos métodos de alto orden, RK-Opt es lo que encontré es una buena herramienta para obtener algunos (como mencionó @DavidKetcheson), y DifferentialEquations.jl tiene todos los métodos publicados (¿creo? ) implementado para que pueda probar / comparar fácilmente con ellos. Sin embargo, a menos que encuentre una suposición que pueda descartarse, de mis pruebas no he podido encontrar algo que supere los métodos de Verner (órdenes 6-9) y Feagin (órdenes 10+). Sin embargo, YMMV, y me encantaría ver más investigaciones sobre esto.
fuente