Escolha do tamanho da etapa usando ODEs no matlab

12

Olá, obrigado por dar tempo para analisar minha pergunta. Esta é uma versão atualizada da minha pergunta, que eu postei anteriormente em physics.stackexchange.com

Atualmente, estou estudando um spinor de exciton 2D Bose-Einstein Condensate e estou curioso sobre o estado fundamental deste sistema. O método matemático de chegar ao estado fundamental é chamado de método do tempo imaginário .

O método é muito simples, onde o tempo na mecânica quântica é substituído pelo imaginário Essa substituição faz com que as partículas de alta energia do meu sistema decaam mais rapidamente do que as de baixa energia. Re-normalizando o número de partículas em cada etapa do cálculo, terminamos com um sistema de partículas de menor energia, também conhecido como. o estado fundamental.

t=iτ

A (s) equação (ões) em questão é não linear, denominada equação de Schrödinger não linear , às vezes a equação de Gross-Pitaevskii . Para resolver o problema, estou usando o Matlabs ode45, que evolui o sistema no tempo e, eventualmente, atinge o estado fundamental.

  • Nota! A equação não-linear de Schrödinger inclui o laplaciano e alguns outros termos diferenciais no espaço. Tudo isso é resolvido usando a transformação rápida de Fourier. No final, temos apenas uma ODE. *

Meu problema e pergunta: os cálculos vão de a . O ode45 é colocado em um loop for para não calcular um vetor gigante ao mesmo tempo. A primeira rodada começaria com ode45 (odefun, ) e depois continuaria na próxima vez a partir de . Aqui, a etapa é o meu problema. Escolhas diferentes em etapas de tempo fornecem soluções diferentes de estado fundamental e não tenho idéia de como determinar qual etapa de tempo fornece o "estado" mais correto!t0tf[t0,,tf][t0,t0+Δ/2,t0+Δ],y,t0+ΔΔ

Minha tentativa: percebo que neste esquema grandes etapas de tempo causam a decomposição de um grande número de partículas antes de serem normalizadas novamente para o número original de partículas, enquanto pequenas etapas de tempo causam uma quantidade menor de partículas em decomposição antes de serem normalizadas novamente. Meu pensamento inicial é que pequenos passos no tempo devem fornecer uma solução mais precisa, mas parece ser o oposto.

Como não sou um especialista numérico, a escolha do ode45 foi simplesmente arbitrária. O ode113 me dá a mesma coisa. :(

Alguém tem alguma opinião sobre este assunto. Deixe-me saber se algum detalhe adicional é necessário.

Obrigado.

Atualização 1: Estive pesquisando o método do tempo imaginário e os ODEs. Parece que, se o tempo não for pequeno o suficiente, tudo ficará instável. Isso me faz pensar se minhas equações não lineares são rígidas, o que torna as coisas muito mais difíceis do que eu entendo. Vou mantê-lo atualizado.

Atualização 2: CORRIGIDO: O problema era realmente ter a normalização fora do ODE. Se a normalização for mantida dentro de odefun, o ODE retornará o mesmo resultado para diferentes opções de etapas de tempo "externas". Meu colega me mostrou códigos mais antigos e simplesmente adicionei uma linha no meu odefun.

function y_out = odefun(t,y_in,...variables...) 

    ...
    [ Nonlinear equations evaluated ]  
    ...


    y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end

A última linha calcula a diferença no número atual de partículas (Ntemp) e no número de partículas que o sistema deve conter (N0). Ele adiciona uma parte das partículas de volta à saída e, assim, cria uma estabilidade total do número de partículas no sistema, em vez de que todas elas se deteriorem.

Farei também uma nova pergunta sobre a dimensionalidade do problema e algumas diferenças no trabalho com picossegundos ou nanossegundos à medida que o tempo passa na ODE.

Obrigado a todos. :)


fonte
3
O problema fundamental é que você está usando à força um método adaptativo, que gosta ode45()de tomar medidas equivocadas. Por que, exatamente, você está evitando a geração do "vetor gigante"? Se você precisar absolutamente de pontos equidistantes, ode45()continue como de costume e use a interpolação.
JM
Hmm ... este poderia ser o problema. A origem dessas etapas fixas era que em algum lugar eu precisava re-normalizar o número de partículas antes que todas se deteriorassem. Mas talvez eu possa fazer isso colocando a normalização em odefun e usando o "vetor de tempo gigante". Além disso, a entrada no ode45 é de 4 * 129 * 129 números. Eu tinha medo de não usar as etapas do tempo e não teria memória suficiente. y
Se a memória servir, deve haver uma opção ode45()que permita reter etapas maiores que um determinado limite; Você pode querer olhar para isso.
JM
1
A resposta é apenas para usar uma estimativa de erro local. Existe um embutido no ODE45, portanto, a coisa mais fácil é usá-lo, mas você pode codificar como seu.
David Ketcheson
1
Na resposta ao follow-up questão verifica-se que0.11/timeαΔt(NtN0)Δt

Respostas:

4

Como você não publicou seu código MATLAB, não sei como você está chamando o ode45. Suponho que você esteja alterando o vetor tspan (segundo argumento) em cada chamada para ode45. A primeira coisa a entender é que o vetor tspan não tem (quase) nenhum efeito no intervalo de tempo usado pelo ode45. O vetor tspan simplesmente permite passar para o ode45 o período de tempo da integração e a que horas você deseja obter a saída. O intervalo de tempo usado pelo algoritmo de Runga-Kutta no ode45 é ajustado internamente para obter uma precisão prescrita. Os dois parâmetros que controlam essa precisão são RelTol e AbsTol na estrutura de opções passada para o ode45. Eles têm padrões razoáveis ​​e, como você não os mencionou, suponho que você não os tenha alterado.

Eu disse "quase" nenhum efeito no intervalo de tempo normal do ode45. Se você estiver solicitando saída em intervalos de tempo muito pequenos em relação ao tempo que o ode45 levaria de outra forma, será necessário reduzir o tempo para satisfazer sua solicitação de saída. Eu acredito que é isso que JM está assumindo que está acontecendo. Por que você precisa da solução em tantos momentos de saída? Normalmente, basta solicitar a saída em momentos suficientes para gerar uma plotagem suave.

Quanto à mudança na solução que você está vendo, talvez os valores padrão de RelTol e AbsTol não sejam apropriados para o seu problema. Sugiro substituir seu loop no ode45 por uma única chamada, solicitar saída em um número razoável de vezes e experimentar valores menores de RelTol e AbsTol até obter uma solução convergente.

Bill Greene
fonte
Obrigado pela resposta. A razão pela qual eu precisava de uma solução em tantos momentos de saída é porque, se a função de onda não é normalizada regularmente, tudo se deteriora e meu sistema está vazio. É por isso que coloquei o ode45 em um loop com pequenos vetores tspan para que eu pudesse normalizar novamente após cada vetor tspan.
2

Como a equação de Schrödinger não linear é, bem, não linear, ela pode ter um grande número de estados estacionários, alguns dos quais podem ser estáveis. Na realidade física, a partir de um estado particular, o sistema evoluirá deterministicamente para um estado final. Se o esquema numérico fornecer resultados diferentes para diferentes discretizações (etapas de tempo), essa é uma falha fundamental da sua discretização. Verifique seu código.

ψ0

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4
Nico Schlömer
fonte
Sim. Eu planto o perfil de densidade da minha solução de saída e, quando ela não muda por muito tempo, basicamente parou de evoluir, presumo que atingi um estado estacionário. Mas não tenho certeza de que olhar para a densidade de energia possa ajudar, pois a função de onda é um spinor com componentes de spin (+2, +1, -1, -2). Não acho que integrar cada componente me diga a energia do condensado, mas quando chego ao estado fundamental, a densidade de energia deve ser estacionária e, portanto, uma constante no tempo, essa é uma pista para uma solução correta.
1

Problema resolvido:

A normalização precisa fazer parte da função avaliada no ODE. Quebrar o ODE em várias etapas e normalizar entre elas causa instabilidade aparentemente numérica e produz resultados diferentes dependendo dos intervalos de tempo em que o ODE é quebrado. (Veja a edição 2 em questão para mais detalhes.)


fonte