O que significa "simplético" em referência a integradores numéricos, e o odeint de SciPy os utiliza?

25

Neste comentário eu escrevi:

... integrador SciPy padrão, que suponho usar apenas métodos simpléticos.

no qual estou me referindo ao SciPy's odeint, que usa um "método não rígido (Adams)" ou um "método rígido (BDF)". Segundo a fonte :

def odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0,
           ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0,
           hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12,
           mxords=5, printmessg=0):
    """
    Integrate a system of ordinary differential equations.

    Solve a system of ordinary differential equations using lsoda from the
    FORTRAN library odepack.

    Solves the initial value problem for stiff or non-stiff systems
    of first order ode-s::
        dy/dt = func(y, t0, ...)
    where y can be a vector.
    """

Aqui está um exemplo em que propago a órbita de um satélite ao redor da Terra por três meses, apenas para mostrar que ele se precessa conforme o esperado.

Acredito que integradores não simpléticos têm a propriedade indesejável de que eles tendem a não economizar energia (ou outras quantidades) e, portanto, são indesejáveis ​​na mecânica orbital, por exemplo. Mas não sei exatamente o que torna um integrador simplético simplético.

É possível explicar qual é a propriedade (que simplifica um integrador simplético) de maneira direta e (razoavelmente) fácil de entender, mas não imprecisa? Estou perguntando do ponto de vista de como o integrador funciona internamente , e não como ele é executado nos testes.

E é correta minha suspeita de que odeintuse apenas integradores simpléticos?

uhoh
fonte
4
Como regra geral, você só deve esperar que um integrador de caixa preta seja simplético se exigir que você separe as equações de posição e momento.
origimbo
@origimbo Obrigado. Parece que odeinté um invólucro em Python para códigos-fonte bastante antigos, estabelecidos e bem referenciados (pergunta editada, referências ODEPACK e LSODA), embora eu certamente admita usá-lo no modo de caixa preta. Meu exemplo vinculado mostra que o vetor de estado 6D consiste em três posições e três velocidades.
uhoh
11
Os integradores ODE no ODEPACK e LSODA não são integradores simpléticos.
22418 Brian Borchers
2
Aqui está um exemplo elaborado comparando dois solucionadores muito simples: Euler e Symplectic Euler: idontgetoutmuch.wordpress.com/2013/08/06/… .
idontgetoutmuch
2
O livro de Hairer, Nørsett e Wanner fornece uma boa explicação dos métodos simpléticos. Veja a Figura 16.1 em particular e as figuras aqui .
JM

Respostas:

47

Deixe-me começar com correções. Não, odeintnã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.

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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.

Chris Rackauckas
fonte
10
Com esta resposta, pareço ter atingido o Jackpot do Stack Exchange! Esta é a resposta perfeita para mim, pois compreendo algumas delas imediatamente e as partes que não me deixam ansiosa para ler mais. Eu realmente aprecio o tempo que você gastou para obter uma fonte completa dessa resposta, além de incluir outros links úteis e instrutivos.
uhoh
Antes de entrar em detalhes matemáticos, poderíamos dizer mais ou menos que simplético significa conservação de volume , não é?
Miguel
2
FTR, a razão pela qual o Runge-Kutta de 5ª ordem adaptável é muito melhor que o RK4 aqui não é que ele tenha uma ordem mais alta, mas que escolha tamanhos de etapa mais adequados. A razão pela qual o RK4 é tão ruim é principalmente porque o tamanho da etapa é inapropriadamente alto no perigeu; o mesmo solucionador com metade do tamanho da etapa daria uma solução muito melhor. (Just, ele iria perder muito tempo resolvendo a órbita finamente ao redor do apogeu, onde isso não é necessário em tudo.)
leftaroundabout
1
excelente exposição. Como uma questão paralela: o OP começa com uma referência ao Python - existem tutoriais / pacotes Python recomendados ao longo das linhas dos exemplos de Julia vinculados?
Quetzalcoatl
1
O único pacote Python que conheço para esses tipos de integradores é diffeqpy , onde não está documentado no README, mas você pode acessar todos esses mesmos métodos e reescrevê-lo no Python usando esse pacote.
Chris Rackauckas
14

pqH(p,q)

dqdt=+Hp
dpdt=Hq.
H
p(t),q(t)=ϕt(p(t0),q(t0))
dpdqpqsão unidimensionais, você pode pensar nisso como dizendo que a área dentro de curvas fechadas no espaço de fase é conservada. Isso garante todos os tipos de boas propriedades de estabilidade, uma vez que "bolas" de trajetórias precisam ficar "próximas" umas das outras.

Em termos numéricos, um integrador simplético atua da mesma maneira, conservando também essa área / duas formas. Por sua vez, isso significa que existe um "hamiltoniano numérico" conservado (que pode não ser [lido 'não é'] o mesmo que o exato). Observe que a estabilidade não é a mesma que precisão, de modo que a maioria das vantagens dos métodos simpléticos ocorre na integração por períodos muito longos (por exemplo, seu método pode colocar rapidamente um satélite no lado errado da Terra, sem nunca permitir que ele decaia. isto).

origimbo
fonte
Obrigado por isso! Agora vou usar palavras acima da minha nota de pagamento. N-bolas de trajetórias correm mais risco quando estão próximas às bifurcações, como as simulações em três corpos. cf. Doedel et al. 2007, Int. J. Bifurcação e Caos, v 17, n. 8 (2007) 2625–2677 Como eu fui? Também ieec.cat/hosted/web-libpoint/papers/…
uhoh
2
A menos que o leitor esteja ciente dos detalhes matemáticos, a menção à estabilidade é enganosa, pois a conservação do volume não significa que as trajetórias individuais permaneçam próximas.
Miguel
1
@ Miguel Acho que essa é uma daquelas situações em que o leitor que não segue os detalhes matemáticos é prejudicado de qualquer maneira, mas em termos da troika usual de precisão, estabilidade e eficiência computacional do numericista, eu argumentaria que enfatizando a estabilidade benefícios é útil. Fico feliz em aceitar sugestões de reescrita, se você puder pensar em algo melhor que não seja intencionalmente impreciso.
origimbo
22
1
@ Miguel: Mas a bolha de partículas pode se dividir em duas ou mais partes. Seu volume total apenas precisa permanecer constante.
Wolfgang Bangerth 27/03/19