Sí, no hay demasiados recursos en esto por alguna razón. Durante mucho tiempo, el goto estándar era "solo usar métodos BDF". Este mantra se estableció en piedra por algunas razones históricas: para un código de Gear fue el primer solucionador rígido ampliamente disponible, y para otro el paquete MATLAB no incluyó / no incluye un método RK implícito. Sin embargo, esta heurística no siempre es correcta, y yo diría que al hacer la prueba generalmente es incorrecta. Déjame explicarte en detalle.
Los métodos BDF tienen un alto costo fijo
El paso de tiempo adaptativo y el orden adaptativo en los métodos BDF tienen un costo realmente alto. Los coeficientes tienen que ser recalculados, o los valores deben ser interpolados a diferentes tiempos. Se ha trabajado mucho para hacer que los códigos BDF actuales funcionen mejor aquí (hay dos "formas" bien conocidas para la implementación que intentan manejar este problema de manera diferente), pero en realidad es solo un problema de ingeniería de software muy difícil. Debido a esto, en realidad, la mayoría de los códigos BDF son todos descendientes del código original de Gear: Gear's, vode, lsoda, Sundial's CVODE, incluso los solucionadores DAE DASKR y DASSL son descendientes del mismo código.
Lo que esto significa es que, si su problema es "demasiado pequeño", el alto costo fijo realmente importa y los métodos RK implícitos funcionarán mejor.
Los métodos BDF de alto orden son muy inestables para valores propios complejos
Los métodos BDF le permiten controlar el orden máximo y hacerlo más conservador por una razón: los métodos BDF de orden superior no pueden manejar incluso los autovalores complejos de "tamaño mediano". Entonces, en estos casos, para ser estables, tienen que abandonar su pedido. Esta es la razón por la cual el método BDF de sexto orden, aunque técnicamente estable, a menudo se ignora porque incluso el quinto orden ya tiene problemas aquí (y el sexto orden es aún menos estable). Solo hasta el segundo orden es A-estable, por lo que siempre puede retroceder hasta allí, pero luego los pasos están dominados por errores.
Entonces, cuando usa códigos BDF en problemas no triviales, no obtiene el quinto orden todo el tiempo. Las oscilaciones hacen que su orden disminuya.
Los métodos BDF tienen un alto costo inicial
i ττ
Los métodos BDF, al ser métodos de varios pasos, tienen la mejor escala
Fradau
¿Qué puntos de referencia están disponibles?
El libro de Hairer y los DiffEqBenchmarks (explicados a continuación) son probablemente los mejores en términos de diagramas de precisión de trabajo fácilmente disponibles. La resolución de ecuaciones diferenciales ordinarias II de Hairer tiene un montón de diagramas de precisión de trabajo en las páginas 154 y 155. Los resultados de los problemas que eligió coinciden con lo que dije anteriormente por las razones que dije anteriormente: RK implícito será más eficiente si el problema no es "suficientemente largo". Otra cosa interesante a tener en cuenta es que los métodos de Rosenbrock de alto orden aparecen como los más eficientes en muchas de sus pruebas (como Rodas
) en el régimen donde el error es mayor, y el RK implícito radau5
es el más eficiente en errores menores. Pero sus problemas de prueba no son, en su mayoría, discretizaciones de PDE grandes, así que tenga en cuenta los puntos anteriores.
¿Cómo se prueba / benchmark?
Me gusta probar esto con DifferentialEquations.jl en Julia (descargo de responsabilidad: soy uno de los desarrolladores). Esto está en Julia. El lenguaje de programación realmente debería tener una nota aquí. Recuerde que a medida que aumenta el costo de la llamada a la función, los métodos BDF son bastante mejores. En R / MATLAB / Python, la función del usuario es el único código R / MATLAB / Python que los solucionadores optimizados tienen que usar realmente: si está usando envolturas SciPy o Sundials, todo es código C / Fortran, excepto la función que pasa . Esto significa que, en lenguajes dinámicos (que no son Julia), los métodos BDF funcionan mejor de lo normal porque las llamadas a funciones no son muy optimizadas (esta es probablemente la razón por la cual Shampine se incluyó ode15s
en el paquete MATLAB, pero no hay un método RK implícito) .
FODEProblem
@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())
donde el primero usa Sundials CVODE
(método BDF), y el segundo usa Hairer radau
(RK implícito).
Para cualquiera ODEProblem
, puede usar las herramientas de evaluación comparativa para ver cómo se escalan los diferentes algoritmos para diferentes tolerancias adaptativas. Algunos resultados se publican en DiffEqBenchmarks.jl . Por ejemplo, en el problema ROBER (sistema de 3 EDO rígidas) puede ver que los relojes de sol en realidad son inestables y divergen con una tolerancia lo suficientemente alta (mientras que los otros métodos convergen muy bien), mostrando la nota anterior sobre problemas de estabilidad. En el problema de Van Der Pol , puedes ver que es más un lavado. Tengo mucho más de lo que no he publicado, pero probablemente no lo conseguiré hasta que termine algunos métodos de Rosenbrock de orden superior (Rodas es la versión de Fortran de esos).
(Nota: esos puntos de referencia rígidos necesitan actualización. Por un lado, el texto necesita actualización ya que por alguna razón los métodos de ODE.jl divergen ...)
Métodos de extrusión y RKC
También hay métodos de extrapolación como los seulex
que se hacen para problemas rígidos. Estos son "orden adaptativo infinito", pero eso solo significa que son asimétricamente buenos cuando se busca un error muy bajo (es decir, si se busca resolver problemas rígidos a un nivel inferior 1e-10
o igual, en cuyo caso probablemente pueda usar un método explícito) . Sin embargo, en la mayoría de los casos no son tan eficientes y deben evitarse.
Runge-Kutta Chebyschev es un método explícito que también funciona en problemas difíciles que debes considerar. Todavía no lo tengo envuelto en DifferentialEquations.jl, así que no tengo ninguna evidencia sólida de cómo funciona.
Otros métodos a considerar: métodos especializados para PDEs rígidas
Probablemente debería tener en cuenta que los métodos de Rosenbrock de alto orden funcionan realmente bien, muchas veces incluso mejor, para problemas rígidos de tamaño pequeño a mediano cuando puede calcular fácilmente el jacobiano. Sin embargo, para algunos PDE, creo que los problemas de difusión por advección entran en esta categoría, Rosenbrock puede perder algunos órdenes de precisión. Además, necesitan jacobianos muy precisos para mantener su precisión. En Julia, esto es fácil porque los solucionadores vienen con una diferenciación simbólica y automática que puede ser correcta para la máquina épsilon. Sin embargo, cosas como las de MATLABode23s
puede tener problemas porque estas implementaciones usan diferencias finitas. Para BDF y métodos RK implícitos, los errores en el jacobiano conducen a una convergencia más lenta, mientras que para Rosenbrock, dado que estas no son ecuaciones implícitas y son métodos RK con inversiones jacobianas allí, solo pierden el orden de precisión.
Otros métodos a considerar son los métodos exponenciales de RK, la diferencia exponencial de tiempo (ETD), el factor de integración implícito (IIF) y los métodos exponenciales de Rosenbrock. Los primeros tres hacen uso del hecho de que, en muchas discretizaciones PDE,
tut= A u + f(u )
UNA umiUNUN
UNJu +g( u )JF= Ju + g
Todavía otros métodos: las últimas creaciones
Los métodos que son totalmente implícitos obviamente funcionan bien para las ecuaciones rígidas. Si el PDE no es lo suficientemente grande, no se puede "paralelizar en el espacio" lo suficiente como para usar HPC. En cambio, puede crear discretizaciones paralelas en el tiempo que son totalmente implícitas y, por lo tanto, buenas para ecuaciones rígidas, pero paralelas para hacer un uso completo del hardware. XBraid es un solucionador que utiliza una técnica como esta, y los métodos principales son PFFAST y métodos pararealistas. DifferentialEquations.jl está desarrollando un método de red neuronal que funciona de manera similar.
Nuevamente, esto es óptimo cuando no tiene una discretización espacial lo suficientemente grande como para paralelizar de manera eficiente, pero tiene los recursos disponibles para el cálculo paralelo.
Conclusión: tome consideraciones asintóticas con un grano de sal
Δ t
Los métodos BDF son asintóticamente los mejores, pero en la mayoría de los casos probablemente no esté trabajando en ese régimen. Pero si la discretización espacial tiene suficientes puntos, los métodos BDF pueden paralelizar eficientemente en el espacio (paralelizando la resolución lineal) y tendrán la menor cantidad de llamadas a funciones, y por lo tanto harán lo mejor. Pero si su discretización PDE no es lo suficientemente grande, eche un vistazo a los métodos implícitos RK, Rosenbrock, RK exponencial, etc. El uso de un paquete de software como DifferentialEquations.jl que facilita el intercambio entre los diferentes métodos puede ser realmente útil para que comprenda qué método funciona mejor para su dominio problemático, ya que en muchos casos no se puede conocer de antemano.
[Si tiene algún problema de ejemplo que desea agregar al conjunto de pruebas, no dude en ayudarnos a obtener algo allí. Quiero mantener un recurso muy completo sobre esto. Espero tener todos los puntos de referencia de Hairer en forma de cuaderno ejecutable "pronto", y quisiera otros problemas que sean representativos de los campos científicos. Cualquier ayuda es apreciada!]