A configuração de benchmark
No software Julia DifferentialEquations.jl , implementamos muitos métodos de ordem superior, incluindo os métodos Feagin. Você pode vê-lo em nossa lista de métodos e, em seguida, existem muitos outros que podem ser usados como tabelas fornecidas . Como todos esses métodos são reunidos, é possível comparar facilmente entre eles. Você pode ver os benchmarks que eu tenho online aqui e ver que é muito simples comparar muitos algoritmos diferentes. Portanto, se você quiser levar alguns minutos para executar os benchmarks, faça isso. Aqui está um resumo do que sai.
Primeiramente, é importante observar que, se você olhar para cada um dos benchmarks, verá que nossos métodos DP5
e ordem (Ordem 5 de Dormand-Prince) DP8
são mais rápidos que os códigos Hairer Fortran ( dopri5
e dop853
) e, portanto, essas implementações são muito bem otimizadas . Isso mostra que, conforme observado em outro segmento, o uso excessivo dos métodos Dormand-Prince é porque os métodos já foram escritos, não porque ainda são os melhores. Portanto, a comparação real entre as implementações mais otimizadas é entre os métodos Tsitorous, Verner e Feagin do DifferentialEquations.jl.
Os resultados
Em geral, os métodos de uma ordem superior a 7 têm um custo computacional adicional que geralmente não é compensado pela ordem, dadas as tolerâncias escolhidas. Uma razão para isso é que as opções de coeficiente para métodos de ordem inferior são mais otimizadas (elas têm pequenos "coeficientes de erro de truncamento de princípio", que importam mais quando você não é assimtopicamente pequeno). Você pode ver que em muitos problemas, como aqui, os métodos Verner Efficient 6 e 7 se saem extremamente bem, mas métodos como o Verner Efficient 8 podem ter uma inclinação mais baixa. Isso ocorre porque os "ganhos" de ordem superior são compostos com tolerâncias mais baixas, portanto sempre há uma tolerância em que os métodos de ordem superior serão mais eficientes.
No entanto, a questão é então, quão baixo? Em uma implementação bem otimizada, isso fica muito baixo por dois motivos. A primeira razão é porque os métodos de ordem inferior implementam algo chamado FSAL (primeiro igual ao anterior). Essa propriedade significa que os métodos de ordem inferior reutilizam uma avaliação de função da etapa anterior na próxima etapa e, portanto, têm efetivamente uma avaliação de função a menos. Se isso for usado corretamente, algo como um método de 5ª ordem (Tsitorous ou Dormand-Prince) está na verdade fazendo 5 avaliações de função em vez das 6 que os tablóides sugerem. Isso também se aplica ao método Verner 6.
A outra razão é devido a interpolações. Uma razão para usar um método de ordem muito alta é executar menos etapas e simplesmente interpolar valores intermediários. No entanto, para obter os valores intermediários, a função de interpolação pode precisar de mais avaliações de função do que as usadas para dar o passo. Se você olhar para os métodos Verner, são necessárias oito avaliações de funções extras para o método Pedido 8 para obter um interpolante Pedido 8. Muitas vezes, os métodos de baixa ordem fornecem um interpolante "gratuito", por exemplo, a maioria dos métodos de 5ª ordem tem uma interpolação de 4ª ordem gratuita (sem avaliações de funções extras). Portanto, isso significa que, se você precisar de valores intermediários (que serão necessários para um bom gráfico, se você estiver usando um método de alta ordem), haverá alguns custos ocultos extras. Considere o fato de que esses valores interpolados são realmente importantes para o tratamento de eventos e a solução de equações diferenciais de atraso e você verá por que o custo extra da interpolação é fator importante.
Então, e os métodos Feagin?
Portanto, você verá que os métodos Feagin estão faltando suspeitosamente nos benchmarks. Eles são bons, os testes de convergência funcionam em números de precisão arbitrários etc., mas para realmente fazê-los funcionar, você precisa pedir tolerâncias absurdamente baixas. Por exemplo, descobri em benchmarks não publicados que o Feagin14
desempenho supera Vern9
(o Método Eficiente Verner de 9ª ordem) em tolerâncias semelhantes 1e-30
. Para aplicações com dinâmica caótica (como nos problemas de Pleides ou astrofísica de três corpos), você pode querer essa quantidade de precisão devido à dependência sensível (erros nos sistemas caóticos são compostos rapidamente). No entanto, a maioria das pessoas provavelmente está computando com números de ponto flutuante de precisão dupla, e eu não encontrei uma referência em que eles tenham desempenho superior nesse domínio de tolerância.
Além disso, não há interpolante para ir junto com os métodos Feagin. Então, o que eu faço é simplesmente colocar uma interpolação Hermite de terceira ordem sobre eles, para que assim exista (e funciona surpreendentemente bem). No entanto, se não houver uma função de interpolação padrão, você poderá executar o método Hermite recursivo (use essa interpolação para obter o ponto médio e, em seguida, faça uma interpolação de 5ª ordem, etc.) para obter uma interpolação de alta ordem, mas isso é muito caro e o resultado interpolação não tem necessariamente um termo de erro de truncamento de princípio baixo (portanto, só é bom quando dt
é realmente pequeno, que é exatamente o oposto do caso que queremos!). Portanto, se você precisar de uma interpolação realmente boa para corresponder à sua precisão, precisará pelo menos voltar a algo assim Vern9
.
Nota sobre extrapolação
Observe que os métodos de extrapolação são simplesmente algoritmos para gerar métodos Runge-Kutta de ordem arbitrária. No entanto, por sua ordem, eles tomam mais medidas do que o necessário e têm altos coeficientes de erro de truncamento de princípio, e, portanto, não são tão eficientes quanto um método RK bem otimizado em uma determinada ordem. Mas, dada a análise anterior, isso significa que existe um domínio de tolerância extremamente baixa em que esses métodos se saem melhor do que os métodos RK "conhecidos". Mas em todos os benchmarks que corri, parece que não cheguei tão baixo.
Nota sobre estabilidade
A escolha realmente não tem nada a ver com problemas de estabilidade. De fato, se você passar pelos quadros DifferentialEquations.jl (você pode apenas plot(tab)
para as regiões de estabilidade), verá que a maioria dos métodos possui regiões de estabilidade suspeitamente semelhantes. Esta é realmente uma escolha. Geralmente, ao derivar os métodos, o autor geralmente faz o seguinte:
- Encontre os menores coeficientes de erro de truncamento do princípio (ou seja, os coeficientes para os próximos termos do pedido)
- Sujeito às restrições do pedido
- E torne a região de estabilidade próxima à do método Dormand-Prince Order 5.
Por que a última condição? Bem, como esse método tende a ser sempre estável com a maneira como são feitas as escolhas adaptativas de etapas controladas por PI, é uma boa opção para regiões de estabilidade "suficientemente boas". Portanto, não é por acaso que todas as regiões de estabilidade tendem a ser semelhantes.
Conclusão
Existem trocas em todas as opções de método. Os métodos RK de ordem mais alta simplesmente não são tão eficientes em tolerâncias mais baixas, porque é mais difícil otimizar a escolha de coeficientes e porque o número de avaliações de funções se compõe (e cresce ainda mais rápido quando há interpolação). No entanto, se a tolerância ficar baixa o suficiente, elas vencem, mas as tolerâncias necessárias podem estar muito abaixo das aplicações "padrão" (isto é, realmente aplicáveis apenas a sistemas caóticos).