Resolvendo ODE singular não linear com SciPy odeint / ODEPACK

8

Quero resolver a equação isotérmica de Lane-Emden [PDF, eq. 15.2.9]

d2ψdξ2+2ξdψdξ=eψ

com as condições iniciais

ψ(ξ=0)=0dψdξ|ξ=0=0

usando SciPyodeint() , mas, como pode ser visto, a equação é singular na origem. A documentação afirma que usa ODEPACK.

Eu já conheço a série de potências da solução em um bairro de ( ref ):ξ=0

ψ(ξ)ξ26ξ4120+ξ61890

Tentei configurar tcrita np.array([0.0]), mas não funcionou: eu recebo um aviso sobre valores inválidos e, em seguida, a minha solução é tudo NaN. Devo integrar a partir de 0,01, talvez? Ou existe alguma outra solução?

astrojuanlu
fonte
Observe que tudo funciona bem se eu começar a integrar a partir de . Eu só quero ter certeza de que não há outra maneira. t0>0
astrojuanlu
1
Parece haver alguns problemas com sua formulação. Não conheço essa equação, então pesquisei no Google e só vim com a equação "Lane" -Emden, que é um pouco diferente. Além disso, você quis dizer que seus derivados estavam em relação a ou ? tξt
Bill Barth
@ BillBarth, você estava certo, houve erros, eu quis dizer . Também adicionei uma referência à equação, tirada de um curso Stellar Structure and Evolution ( www2.astro.psu.edu/users/rbc/astro534.html ) na Universidade Estadual da Pensilvânia (a lição Polytropes). É a equação 15.2.9. ξ
astrojuanlu

Respostas:

7

Tudo bem, essa resposta é um tiro no escuro, mas aqui vai.

Primeiro, transforme o ODE de segunda ordem em um sistema de dois ODEs. Deixei

φ1=ψ,φ2=ψ˙,

onde os pontos no topo das funções correspondem à diferenciação em relação à variável independente (neste caso, ).ξ

Em seguida, a ODE implícita de segunda ordem

ψ¨(ξ)+2ξ1ψ˙(ξ)=eψ(ξ)ψ(0)=0ψ˙(0)=0

pode ser expresso como o ODE explícito de primeira ordem

φ˙1(ξ)=φ2(ξ)φ˙2(ξ)=2ξ1φ2(ξ)+eφ1(ξ)φ1(0)=0φ2(0)=0.

A princípio, parece que não podemos avaliar o lado direito desse sistema ODE explícito em , como exige um integrador numérico. Se existe uma solução para esse sistema, ele deve ser diferenciável. Supondo que exista uma solução, considere o limite do lado direito como .ξ 0ξ=0ξ0

Primeiro, sabemos que

limξ0φ2(ξ)=0,

porque assumimos que existe uma solução, então é diferenciável, o que significa que deve ser contínuo. O limite de uma função contínua em um ponto é o seu valor nesse ponto, e sabemos o valor de porque é uma condição inicial. φ 2 ( 0 )φ2φ2(0)

Também sabemos que

limξ0eφ1(ξ)=1

por razões semelhantes; assumimos que é diferenciável, por isso é contínuo e porque é uma condição inicial. φ 1 ( 0 ) = 0φ1φ1(0)=0

Finalmente,

limξ02φ2(ξ)ξ=limξ02φ˙2(ξ),

usando a regra de L'Hôpital no formulário indeterminado .0/0

Para prosseguir, precisamos fazer outra suposição: é contínuo em . Então segue-se queξ=0φ˙2ξ=0

limξ02φ˙2(ξ)=2φ2˙(0).

Revisitando a ODE de primeira ordem e avaliando o lado direito em , podemos ver que temos:ξ=0

φ˙1(0)=0φ˙2(0)=2φ˙2(0)+1,

a partir do qual se segue que .φ˙2(0)=1/3

Usando esta análise, você pode conectar uma ifinstrução que retorne esses valores da função do lado direito em , o que deve levar você além da singularidade. Dito isto, essa análise requer algumas suposições sobre a continuidade que podem ou não se sustentar; portanto, tome a solução resultante com um grão de sal.ξ=0

Geoff Oxberry
fonte
Geoff, talvez você quis dizer e ? Acrescentei à minha resposta que já conheço a série de potências da solução na origem (talvez eu devesse ter feito isso antes). De qualquer forma, você mostrou que , que é o caso. Vou tentar a coisa da afirmação. φ 2 = ˙ ψ ¨ ψ ( 0 ) = 1 / 3φ1=ψφ2=ψ˙ψ¨(0)=1/3if
astrojuanlu
@ Juanlu001: Boa ligação; Corrigi o erro.
Geoff Oxberry
Você estava certo! Era tão simples quanto uma ifcláusula simples . Obrigado!
astrojuanlu
3

Se você quiser mais opções para o seu solucionador de ODE, consulte o pacote Assimulo que implementa as ligações ao pacote CVODE (e o RADAU e alguns integradores simples para esse assunto).

GertVdE
fonte
Pacote muito valioso, não sabia! Muito obrigado.
astrojuanlu
@GertVdE: Algum desses integradores seria capaz de lidar com a singularidade sem recorrer ao uso de uma ifinstrução para preencher o limite adequado do lado direito como ? ξ0
Geoff Oxberry
1
@ GeoffOxberry: Eu acredito que o solucionador IDA da suíte Sundials (que Assimulo usa para Python) permite procurar um valor inicial consistente a partir do palpite do usuário. Isso permitiria que Juanlu001 iniciasse na expansão de sua série como palpite inicial e deixasse a IDA resolver o IV correto (numericamente, isto é).
GertVdE