@ 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:
- 5 ordem 9 métodos
- 6 ordem 10 métodos
- 2 ordem 12 métodos
- 1 ordem 14 método
(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.