Resolviendo ODE singular no lineal con SciPy odeint / ODEPACK

8

Quiero resolver la ecuación isotérmica de Lane-Emden [PDF, eq. 15.2.9]

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

con las condiciones iniciales

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

usando SciPyodeint() pero, como se puede ver, la ecuación es singular en el origen. La documentación indica que usa ODEPACK.

Ya conozco la serie de potencia de la solución en un entorno de ( ref ):ξ=0

ψ(ξ)ξ26ξ4120+ξ61890

Intenté fijar tcrita np.array([0.0]), pero no funcionó: recibo una advertencia acerca de los valores válidos y luego mi solución es todo NaN. ¿Debo integrar a partir de 0.01 quizás? ¿O hay alguna otra solución?

astrojuanlu
fuente
Tenga en cuenta que todo funciona bien si empiezo a integrar desde . Solo quiero asegurarme de que no haya otra forma. t0>0
astrojuanlu
1
Parece que hay algunos problemas con su formulación. No conozco esta ecuación, así que busqué en Google y solo se me ocurrió la ecuación "Lane" -Emden, que es algo diferente. Además, ¿quisiste decir que tus derivados son con respecto a o ? tξt
Bill Barth
@BillBarth, tenías razón, había errores, quise decir . También agregué una referencia a la ecuación, tomada de un curso de Estructura y Evolución Estelar ( www2.astro.psu.edu/users/rbc/astro534.html ) en la Universidad Estatal de Pensilvania (la lección de Polytropes). Es la ecuación 15.2.9. ξ
astrojuanlu

Respuestas:

7

Muy bien, esta respuesta es un tiro en la oscuridad, pero aquí va.

Primero, transforme el ODE de segundo orden en un sistema de dos ODE. Dejar

φ1=ψ,φ2=ψ˙,

donde los puntos sobre las funciones corresponden a la diferenciación con respecto a la variable independiente (en este caso, ).ξ

Entonces el ODE implícito de segundo orden

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

puede expresarse como el ODE explícito de primer orden

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

Al principio, parecería que no podemos evaluar el lado derecho de este sistema ODE explícito en , como requiere un integrador numérico. Si existe una solución para este sistema, entonces debe ser diferenciable. Suponiendo que existe una solución, tome el límite del lado derecho como .ξ 0ξ=0ξ0

Primero, sabemos que

limξ0φ2(ξ)=0,

porque asumimos que existe una solución, entonces es diferenciable, lo que significa que debe ser continua. El límite de una función continua en un punto es su valor en ese punto, y sabemos el valor de porque es una condición inicial.φ2φ2(0)

También sabemos que

limξ0eφ1(ξ)=1

por razones similares; hemos asumido que es diferenciable, por lo que es continuo, y porque es una condición inicial.φ1φ1(0)=0

Finalmente,

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

usando la regla de L'Hôpital en la forma indeterminada .0/0

Para continuar, tenemos que hacer otra suposición: es continua en . Entonces se sigue queφ˙2ξ=0

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

Revisando el ODE de primer orden y evaluando el lado derecho en , podemos ver que tenemos:ξ=0

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

de donde se deduce que .φ˙2(0)=1/3

Usando este análisis, podría conectar una ifdeclaración que devuelva estos valores de la función del lado derecho en , lo que debería superar la singularidad. Dicho esto, este análisis requiere un par de suposiciones sobre la continuidad que pueden o no mantenerse, así que tome la solución resultante con un grano de sal.ξ=0

Geoff Oxberry
fuente
Geoff, ¿tal vez quisiste decir y ? Agregué a mi respuesta que ya conozco la serie de potencia de la solución en el origen (tal vez debería haberlo hecho antes). De todos modos, mostró que , que es el caso. Probaré lo de la declaración. φ1=ψφ2=ψ˙ψ¨(0)=1/3if
astrojuanlu
@ Juanlu001: Buena llamada; Corrija el error.
Geoff Oxberry
¡Usted tenía razón! Era tan simple como una simple ifcláusula. ¡Gracias!
astrojuanlu
3

Si desea más opciones para su solucionador de ODE, eche un vistazo al paquete Assimulo que implementa enlaces al paquete CVODE (y RADAU y algunos integradores simples para el caso).

GertVdE
fuente
Paquete muy valioso, no lo sabía! Muchas gracias.
astrojuanlu
@GertVdE: ¿Alguno de estos integradores podría manejar la singularidad sin recurrir al uso de una ifdeclaración para completar el límite apropiado del lado derecho como ? ξ0
Geoff Oxberry
1
@ GeoffOxberry: Creo que el solucionador de IDA de la suite Sundials (que Assimulo envuelve para Python) permite buscar un valor inicial consistente a partir de la suposición del usuario. Esto permitiría a Juanlu001 comenzar desde la expansión de su serie como suposición inicial y dejar que IDA resuelva el IV correcto (numéricamente).
GertVdE