Deixe-me começar com correções. Não, odeint
não possui integradores simpléticos. Não, a integração simplética não significa conservação de energia.
O que significa simplético e quando você deve usá-lo?
Primeiro de tudo, o que significa simplético? Simplético significa que a solução existe em um coletor simplético. Um coletor simplético é um conjunto de soluções definido por uma forma 2. Os detalhes das variedades simpléticas provavelmente parecem bobagens matemáticas; portanto, a essência é que existe uma relação direta entre dois conjuntos de variáveis em uma variedade dessas. A razão pela qual isso é importante para a física é porque as equações hamiltonianas têm naturalmente que as soluções residem em uma variedade simplética no espaço de fase, com a divisão natural sendo os componentes de posição e momento. Para a verdadeira solução hamiltoniana, esse caminho do espaço de fase é energia constante.
Um integrador simplético é um integrador cuja solução reside em um coletor simplético. Devido a um erro de discretização, ao resolver um sistema hamiltoniano, ele não obtém exatamente a trajetória correta no coletor. Em vez disso, essa trajetória em si é perturbada para a ordem da trajetória verdadeira. Depois, há um desvio linear devido a erro numérico dessa trajetória ao longo do tempo. Os integradores normais tendem a ter um desvio quadrático (ou mais) e não têm boas garantias globais sobre esse caminho do espaço de fase (apenas local).nO (Δ tn)n
O que isso tende a significar é que os integradores simpléticos tendem a capturar os padrões de longo prazo melhor do que os integradores normais, devido a essa falta de desvio e a quase garantia de periodicidade. Este notebook exibe essas propriedades bem no problema do Kepler . A primeira imagem mostra do que estou falando com a natureza periódica da solução.
Isso foi resolvido usando o integrador simplético de 6ª ordem de Kahan e Li de DifferentialEquations.jl . Você pode ver que a energia não é exatamente conservada, mas sua variação depende de quão distante o coletor da solução perturbada está do coletor verdadeiro. Mas como a própria solução numérica reside em uma variedade simplética, ela tende a ser quase exatamente periódica (com alguma variação numérica linear que você pode ver), tornando-a muito agradável para a integração a longo prazo. Se você fizer o mesmo com o RK4, poderá ocorrer um desastre:
Você pode ver que o problema é que não há periodicidade verdadeira na solução numérica e, portanto, as horas extras tendem a flutuar.
Isso destaca a verdadeira razão para escolher integradores simpléticos: integradores simpléticos são bons em integrações de longa data em problemas que possuem a propriedade simplética (sistemas Hamiltonianos) . Então, vamos analisar algumas coisas. Observe que você nem sempre precisa de integradores simpléticos, mesmo em um problema simplético. Nesse caso, um método Runge-Kutta adaptativo de 5ª ordem pode funcionar bem. Aqui está Tsit5
:
Observe duas coisas. Primeiro, obtém uma precisão boa o suficiente para que você não possa ver o desvio real no gráfico do espaço de fase. No entanto, no lado direito, você pode ver que existe esse desvio de energia; portanto, se você estiver fazendo uma integração longa o suficiente, esse método não funcionará tão bem quanto o método de solução com propriedades periódicas. Mas isso levanta a questão: como ele se sai eficiente em termos de eficiência versus apenas se integra com extrema precisão? Bem, isso é um pouco menos certo. No DiffEqBenchmarks.jl, você pode encontrar alguns parâmetros de referência que investigam esta questão. Por exemplo, este cadernoanalisa o erro de energia versus o tempo de execução em um sistema de equações Hamiltoniano a partir de um modelo bóson quádruplo e mostra que se você deseja uma precisão realmente alta, mesmo em tempos de integração bastante longos, é mais eficiente usar apenas um RK de alta ordem ou Runge-Kutta Nystrom ( RKN). Isso faz sentido porque, para satisfazer a propriedade simplética, os integradores perdem alguma eficiência e praticamente precisam de um tempo fixo (há algumas pesquisas avançando nesse último, mas ainda não é muito longo).
Além disso, observe nos dois notebooks que você também pode usar um método padrão e projetá-lo de volta para o coletor de soluções a cada etapa (ou a cada poucas etapas). É isso que os exemplos que estão usando o retorno de chamada DifferentialEquations.jl ManifoldProjection . Você vê que as leis de conservação das garantias são respeitadas, mas com um custo adicional para resolver um sistema implícito a cada etapa. Você também pode usar um solucionador de ODE totalmente implícito ou matrizes de massa singulares para adicionar equações de conservação, mas o resultado final é que esses métodos são mais onerosos em termos de computação como uma troca.
Então, para resumir, a classe de problemas em que você deseja alcançar um integrador simplético são aqueles que têm uma solução em uma variedade simplética (sistemas hamiltonianos) em que você não deseja investir os recursos computacionais para ter uma precisão muito alta (tolerância <1e-12
) solução e não precisa de energia exata / etc. conservação. Isso destaca que se trata de propriedades de integração de longo prazo; portanto, você não deve se deparar com elas todas, quer ou não, como sugere a literatura. Mas eles ainda são uma ferramenta muito importante em muitos campos, como a Astrofísica, onde você tem integrações de longo tempo que precisam ser resolvidas com rapidez suficiente, sem precisão absurda.
Onde encontro integradores simpléticos? Que tipo de integradores simpléticos existem?
Geralmente existem duas classes de integradores simpléticos. Existem os integradores simpléticos de Runge-Kutta (que são os mostrados nos exemplos acima) e existem métodos implícitos de Runge-Kutta que têm a propriedade simplética. Como o @origimbo menciona, os integradores simpléticos do Runge-Kutta exigem que você forneça uma estrutura particionada para que eles possam lidar com as partes da posição e do momento separadamente. No entanto, ao contrário do comentário, os métodos implícitos de Runge-Kutta são simpléticos sem exigir isso, mas exigem a solução de um sistema não linear. Isso não é muito ruim porque, se o sistema não é rígido, esse sistema não-linear pode ser resolvido com iteração funcional ou aceleração de Anderson, mas os métodos simpléticos de RK provavelmente ainda devem ser os preferidos pela eficiência (
Dito isto, o odeint não possui métodos de nenhuma dessas famílias , portanto, não é uma boa opção se você estiver procurando por integradores simpléticos. No Fortran, o site da Hairer possui um pequeno conjunto que você pode usar . O Mathematica tem alguns integrados . Os solucionadores GSL ODE possuem integradores de pontos RK Gaussianos implícitos, os quais o IIRC são simpléticos, mas esse é o único motivo para usar os métodos GSL.
Mas o conjunto mais abrangente de integradores simpléticos pode ser encontrado em DifferentialEquations.jl em Julia (lembre-se de que isso foi usado para os notebooks acima). A lista de métodos simpléticos Runge-Kutta disponíveis é encontrada nesta página e você notará que o método implícito do ponto médio também é simplético (o método implícito do trapézio Runge-Kutta implícito é considerado "quase simplético" porque é reversível). Ele não apenas possui o maior conjunto de métodos, mas também é de código aberto (você pode ver o código e seus testes em uma linguagem de alto nível) e possui muitos benchmarks . Um bom caderno introdutório para usá-lo na solução de problemas físicos é este caderno tutorial. Mas é claro que é recomendável que você inicie o pacote através do primeiro tutorial do ODE .
Em geral, você pode encontrar uma análise detalhada dos conjuntos de equações diferenciais numéricas nesta postagem do blog . É bastante detalhado, mas como ele tem que abranger muitos tópicos, cada um com menos detalhes do que isso; sinta-se à vontade para solicitar que ele seja expandido de qualquer maneira.