Tempo implícito entre BDF e Runge Kutta

16

Existem razões para escolher um Runge Kutta implícito de alta ordem (IMRK) em vez do intervalo de tempo do BDF? BDF parece muito mais fácil para mim como estágio IMRK precisa linear resolve por passo de tempo. A estabilidade para BDF e IMRK parece ser um ponto discutível. Não consigo encontrar recursos comparando / contrastando steppers implícitos de tempo.qqq

Se ajudar, o objetivo final é selecionar um escalonador de tempo implícito de ordem superior para o PDE de difusão de advecção.

user107904
fonte

Respostas:

34

Sim, não há muitos recursos nisso por algum motivo. Por muito tempo, o padrão foi "apenas usar métodos BDF". Esse mantra foi gravado em pedra por algumas razões históricas: para um código o Gear foi o primeiro solucionador rígido amplamente disponível, e para outro o conjunto MATLAB não incluiu / não inclui um método RK implícito. No entanto, essa heurística nem sempre é correta, e eu diria que, ao testar, geralmente está errado. Deixe-me explicar em detalhes.

Os métodos BDF têm um alto custo fixo

Timestepping adaptável e ordem adaptativa nos métodos BDF têm um custo realmente alto. Os coeficientes precisam ser recalculados ou os valores precisam ser interpolados para diferentes momentos. Tem havido muito trabalho para melhorar os códigos atuais do BDF aqui (existem dois "formulários" conhecidos para implementação que tentam lidar com esse problema de maneira diferente), mas na verdade é apenas um problema de engenharia de software muito difícil. Por esse motivo, na verdade, a maioria dos códigos BDF são todos descendentes do código original do Gear: Gear, vode, lsoda, CVODE do Sundial, mesmo os solucionadores de DAE DASKR e DASSL são descendentes do mesmo código.

O que isso significa é que, se o problema é "muito pequeno", o alto custo fixo realmente importa e os métodos RK implícitos terão um desempenho melhor.

Métodos BDF de alta ordem são muito instáveis ​​para autovalores complexos

Os métodos BDF permitem controlar o pedido máximo e torná-lo mais conservador por uma razão: os métodos BDF de ordem superior não conseguem lidar muito bem com autovalores complexos de "tamanho médio". Portanto, nesses casos, para serem estáveis, eles precisam abandonar seu pedido. Essa é a razão pela qual o método BDF de 6ª ordem, embora tecnicamente estável, geralmente é ignorado porque até a 5ª ordem já tem problemas aqui (e a 6ª ordem é ainda menos estável). Somente até a 2ª ordem é A-estável, portanto sempre pode voltar para lá, mas o passo é dominado por erros.

Portanto, ao usar códigos BDF em problemas não triviais, você não recebe a 5ª ordem o tempo todo. Oscilações causam uma queda na ordem.

Os métodos BDF têm um alto custo inicial

Euττ

Os métodos BDF, sendo métodos de várias etapas, têm o melhor dimensionamento

fradau

Quais referências estão disponíveis?

O livro de Hairer e as marcas DiffEqBench (explicadas abaixo) são provavelmente os melhores em termos de diagramas de precisão de trabalho facilmente disponíveis. A resolução de equações diferenciais ordinárias II de Hairer possui vários diagramas de precisão de trabalho nas páginas 154 e 155. Os resultados dos problemas que ele escolheu correspondem ao que afirmei acima pelas razões expostas acima: RK implícito será mais eficiente se o problema não for solucionado. "suficientemente grande". Outra coisa interessante a ser observada é que os métodos de Rosenbrock de alta ordem são os mais eficientes em muitos de seus testes (como Rodas) no regime em que o erro é maior e o RK implícito radau5é o mais eficiente em erros mais baixos. Mas seus problemas de teste geralmente não são discretizações de grandes PDEs, portanto, leve em consideração os pontos acima.

Como você faz testes / benchmarks?

Eu gosto de testar isso com DifferentialEquations.jl em Julia (aviso: sou um dos desenvolvedores). Isso é em Julia. A linguagem de programação deve realmente receber uma nota aqui. Lembre-se de que, à medida que o custo da chamada de função aumenta, os métodos BDF são melhores. No R / MATLAB / Python, a função do usuário é o único código R / MATLAB / Python que os solucionadores otimizados precisam usar: se você estiver usando wrappers SciPy ou Sundials, é todo o código C / Fortran, exceto a função que você passa . Isso significa que, em linguagens dinâmicas (que não são Julia), os métodos BDF se saem melhor do que normalmente, porque as chamadas de função são muito otimizadas (essa é provavelmente a razão pela qual Shampine foi incluído ode15sno pacote MATLAB, mas nenhum método RK implícito) .

fODEProblem

@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())

onde o primeiro usa relógios de sol CVODE(método BDF) e o segundo usa Hairer radau(RK implícito).

Para qualquer ODEProblem, você pode usar as ferramentas de benchmarking para ver como os diferentes algoritmos escalam para diferentes tolerâncias adaptativas. Alguns resultados são publicados em DiffEqBenchmarks.jl . Por exemplo, no problema ROBER (sistema de 3 ODEs rígidas), você pode ver que os relógios de sol são instáveis ​​e divergem com uma tolerância alta o suficiente (enquanto os outros métodos convergem perfeitamente), mostrando a observação acima sobre problemas de estabilidade. No problema de Van Der Pol , você pode ver que é mais uma lavagem. Tenho muito mais do que não publiquei, mas provavelmente não vou conseguir até terminar alguns métodos Rosenbrock de ordem superior (Rodas é a versão Fortran deles).

(Nota: esses benchmarks rígidos precisam ser atualizados. Por um lado, o texto precisa ser atualizado, pois por alguma razão os métodos do ODE.jl divergem ...)

Métodos de extrpolação e RKC

Existem também métodos de extrapolação, como os seulexque são feitos para problemas rígidos. Eles são "ordem adaptativa infinita", mas isso significa apenas que eles são assintopicamente bons quando você procura um erro muito baixo (ou seja, procura resolver problemas rígidos em valores mais 1e-10ou menos, nesse caso, provavelmente você pode usar um método explícito) . No entanto, na maioria dos casos, eles não são tão eficientes e devem ser evitados.

Runge-Kutta Chebyschev é um método explícito que também funciona com problemas rígidos que você deve considerar. Ainda não o envolvi em DifferentialEquations.jl, por isso não tenho nenhuma evidência concreta de como isso acontece.

Outros métodos a considerar: métodos especializados para EDPs rígidas

Provavelmente, deve-se notar que os métodos de Rosenbrock de alta ordem se saem muito bem, muitas vezes ainda melhor, para problemas rígidos de pequeno e médio porte, quando você pode calcular facilmente o jacobiano. No entanto, para alguns PDEs, acredito que os problemas de difusão de advecção se enquadram nessa categoria; a Rosenbrock pode perder algumas ordens de precisão. Além disso, eles precisam de jacobianos muito precisos para manter sua precisão. Em Julia, isso é fácil porque os solucionadores vêm com diferenciação simbólica e automática, que pode ser correta para usinar epsilon. No entanto, coisas como o MATLABode23spode ter problemas porque essas implementações usam diferenciação finita. Para os métodos BDF e RK implícito, os erros no Jacobiano levam a uma convergência mais lenta, enquanto para Rosenbrock, uma vez que essas não são equações implícitas e são métodos RK com inversões jacobianas, apenas perdem a ordem de precisão.

Outros métodos a serem observados são os métodos RK exponenciais, diferenciação temporal exponencial (ETD), fator de integração implícita (IIF) e métodos exponenciais de Rosenbrock. Os três primeiros fazem uso do fato de que, em muitas discretizações do PDE,

vocêt=UMAvocê+f(você)

UMAUMAvocêeUMAUMA

UMAJvocê+g(você)Jf=Jvocê+g

Ainda outros métodos: as últimas criações

Métodos totalmente implícitos obviamente se dão bem em equações rígidas. Se o PDE não for grande o suficiente, você não poderá efetivamente "paralelizar no espaço" o suficiente para fazer uso de HPCs. Em vez disso, você pode criar discretizações paralelas no tempo que são totalmente implícitas e, portanto, boas para equações rígidas, mas paralelas para fazer pleno uso do hardware. O XBraid é um solucionador que usa uma técnica como essa, e os principais métodos são os métodos PFFAST e parareal. DifferentialEquations.jl está desenvolvendo um método de rede neural que funciona de maneira semelhante.

Novamente, isso é ideal quando você não possui uma discretização espacial grande o suficiente para paralelizar com eficiência, mas possui os recursos para computação paralela disponível.

Conclusão: faça considerações assintóticas com um grão de sal

Δt

Os métodos BDF são assintoticamente os melhores, mas na maioria dos casos você provavelmente não está trabalhando nesse regime. Mas se a discretização espacial tiver pontos suficientes, os métodos BDF podem paralelizar-se eficientemente no espaço (paralelizando a resolução linear) e terão o menor número de chamadas de função e, portanto, farão o melhor. Mas se a discretização do PDE não for grande o suficiente, dê uma boa olhada nos métodos implícitos de RK, Rosenbrock, RK exponencial etc. O uso de um conjunto de softwares como o DifferentialEquations.jl, que facilita a troca entre os diferentes métodos, pode ser realmente útil para você entender qual o melhor método para o domínio do seu problema, pois em muitos casos ele não pode ser conhecido antecipadamente.

[Se você tiver algum exemplo de problemas que deseja adicionar ao conjunto de testes, sinta-se à vontade para ajudar a obter algo lá. Eu quero manter um recurso muito abrangente sobre isso. Espero ter "em breve" todos os benchmarks de Hairer em formulários executáveis ​​para notebooks e gostaria de ter outros problemas representativos dos campos científicos. Qualquer ajuda é apreciada!]

Chris Rackauckas
fonte
3
Esta é uma resposta muito detalhada, tenho algumas novas direções para analisar! Eu aprecio muito o seu tempo.
user107904
3
Melhor resposta para qualquer pergunta neste fórum em um bom tempo!
Wolfgang Bangerth