Alguns livros antigos que eu vi dizem que o número mínimo de estágios de um método Runge-Kutta explícito de uma ordem especificada é desconhecido para ordens . Isso ainda é verdade?
Quais bibliotecas existem para trabalhar automaticamente com os métodos Runge-Kutta de alta ordem?
ode
runge-kutta
Kirill
fonte
fonte
Respostas:
Limites
Isso ainda é verdade. No livro de Butcher , página 196, diz o seguinte: Em um artigo de 1985, Butcher mostrou que você precisa de 11 estágios para obter o pedido 8 , e isso é nítido. Para a ordem 10, Hairer derivou uma família de métodos de 17 estágios , mas não se sabe se alguém pode fazer melhor. A mesma informação é dada na Seção II.5 de Hairer, Norsett, & Wanner vol. I . A última referência também passa por algumas das técnicas para o desenvolvimento de pares de alta ordem (até a ordem 8).
Há um limite superior no número mínimo de estágios necessários para qualquer ordem, pois você pode construí-los por extrapolação. Isso é conhecido há muito tempo; veja este artigo recente para uma explicação. No entanto, esse limite é quadrático na ordem e certamente é bastante pessimista. O software nodepy discutido abaixo pode gerar coeficientes exatos para esses métodos e também para métodos de correção adiada (que são métodos de Runge-Kutta) de qualquer ordem.
Acredito que @ Etienne está correto ao dizer que os métodos de ordem mais alta construídos à mão são devidos a Terry Feagin. Em relação ao seu outro comentário, este artigo contém cerca de 9 (8) pares:
Programas
Para métodos de pedidos muito altos, é impossível lidar com o número e a complexidade das condições do pedido manualmente. Alguns pacotes simbólicos (Mathematica, pelo menos) possuem recursos para gerar condições de pedidos Runge-Kutta. Provavelmente existem outros pacotes por aí, mas estou ciente do seguinte (ambos os quais escrevi):
Outra observação interessante sobre as condições de pedidos, que se torna significativa em pedidos tão altos, é que existem duas maneiras de derivá-las e elas oferecem condições diferentes (mas coletivamente equivalentes): uma é devida a Butcher e a outra à Albrecht .
fonte
@ A resposta de DavidKetcheson atinge os grandes pontos: você sempre pode construir métodos de ordem suficientemente alta usando extrapolação, isso é um limite muito pessimista e você sempre pode fazer muito melhor, todos os bons são derivados à mão (com a ajuda de algum computador ferramentas de álgebra), nenhum limite inferior é conhecido e os métodos de ordem mais alta são devidos ao Feagin. Dados alguns comentários, eu queria concluir a resposta com uma discussão dos atuais quadros de ponta no campo.
Se você deseja um compêndio de tablados RK, pode encontrar um neste código Julia . As citações para o artigo de onde vieram estão nas docstrings para os construtores de quadro. A documentação do desenvolvedor para DifferentialEquations.jl lista todos esses quadros como disponíveis para uso , e você pode ver aqui que todos foram testados usando os conjuntos de integração contínua Travis e AppVeyor para garantir que não apenas as condições do pedido sejam atendidas, mas eles realmente alcançar a convergência solicitada (teste de verificação). A partir destes, você pode ver que existem:
(que eu pude achar que foram publicadas). Mais uma vez, todos derivados à mão.
Os testes de convergência mostram que algumas das derivações não foram executadas com precisão suficientemente alta para trabalhar com números superiores a 64 bits (eles são comentados assim ). Portanto, é uma peculiaridade interessante a ser observada: nessas ordens altas, você normalmente obtém apenas coeficientes que "com erro
x
" satisfazem as condições da ordem, mas, ao usar aritmética de precisão arbitrária, é possível detectar esses limites. Portanto, a precisão com que você executa os coeficientes é importante, e você deve escolhê-la para cobrir a precisão que deseja testar (/ use, é claro).Se você quiser um monte de gráficos de estabilidade, basta
plot(tableau)
usar a receita Plots.jl. Um bom conjunto de notas que contém grande parte disso pode ser encontrado no site de Peter Stone (vá abaixo e clique em digamos os esquemas de ordem 10 e você obterá um monte de PDFs). Ao desenvolver o DifferentialEquations.jl, criei esse conjunto de tabelas para analisá-las sistematicamente em problemas de teste / observe os indicadores analíticos para ver quais devem ser incluídos na biblioteca principal. Fiz algumas anotações rápidas aqui . Como você pode ver nos algoritmos incluídos na biblioteca principal, os que achei valiosos foram os métodos Verner e Feagin. O método de ordem 9 da Verner é o método de ordem mais alta, com um interpolante correspondente à ordem também. É algo a reconhecer: os métodos Feagin não têm um interpolante correspondente (embora você possa inicializar Hermite, mas isso é realmente ineficiente).Como todos eles são implementados com implementações muito eficientes, você pode brincar com eles e ver o quanto os diferentes recursos realmente importam. Aqui está um caderno Jupyter que mostra os métodos Feagin em uso . Observe que o gráfico de convergência realmente está
1e-48
errado. Os métodos de ordem alta são apenas mais eficientes do que os métodos de ordem inferior quando você realmente precisa de uma tolerância muito baixa. Você pode encontrar alguns benchmarks que usam alguns deles em DiffEqBenchmarks.jl , embora, quando usados, geralmente sejam o método Verner de 9ª ordem e geralmente mostrem que o benchmark não está no regime em que essa alta ordem é eficiente.Portanto, se você quiser brincar e trabalhar com alguns métodos de alta ordem, o RK-Opt é o que eu achei ser uma boa ferramenta para derivar alguns (como o @DavidKetcheson mencionou) e o DifferentialEquations.jl tem todos os métodos publicados (eu acho? ) implementado para que você possa facilmente testar / comparar com eles. No entanto, a menos que você encontre uma suposição que possa ser descartada, nos meus testes não consegui encontrar algo que superasse os métodos Verner (pedidos de 6 a 9) e Feagin (pedidos de 10 ou mais). YMMV, porém, e eu adoraria ver mais pesquisas sobre isso.
fonte