Elección del tamaño del paso usando ODE en matlab

12

Hola y gracias por darme tiempo para mirar mi pregunta. Esta es una versión actualizada de mi pregunta que publiqué anteriormente en physics.stackexchange.com

Actualmente estoy estudiando un condensador Bose-Einstein Condensador de excitón 2D y tengo curiosidad sobre el estado fundamental de este sistema. El método matemático para llegar al estado fundamental se llama método del tiempo imaginario .

El método es muy simple donde el tiempo en la mecánica cuántica se reemplaza por uno imaginario Esta sustitución hace que las partículas de alta energía en mi sistema decaigan más rápido que las de baja energía. Al volver a normalizar el número de partículas en cada paso del cálculo, terminamos con un sistema de partículas de menor energía, también conocido como. El estado fundamental.

t=iτ

La (s) ecuación (es) en cuestión es no lineal, llamada ecuación de Schrödinger no lineal , a veces la ecuación de Gross-Pitaevskii . Para resolver el problema, estoy usando Matlabs ode45 que evoluciona el sistema hacia adelante en el tiempo y finalmente alcanza el estado fundamental.

  • ¡Nota! La ecuación de Schrödinger no lineal incluye el laplaciano y algunos otros términos diferenciales en el espacio. Todos estos se resuelven usando la transformación rápida de Fourier. Al final solo tenemos un tiempo ODE. * *

Mi problema y pregunta: los cálculos van de a . El ode45 se coloca en un bucle for para que no calcule un vector gigante al mismo tiempo. La primera ronda comenzaría con ode45 (odefun, ) y luego continuaría la próxima vez desde . Aquí el paso de tiempo es mi problema. ¡Las diferentes opciones en los pasos de tiempo me dan diferentes soluciones de estado fundamental y no tengo idea de cómo determinar qué paso temporal me da la "mayoría" del estado fundamental correcto.t f [ t 0 , , t f ] [ t 0 , t 0 + Δ / 2 , t 0 + Δ ] , y , t 0 + Δ Δt0tf[t0,,tf][t0,t0+Δ/2,t0+Δ],y,t0+ΔΔ

Mi intento: me doy cuenta de que en este esquema, los pasos de tiempo grandes causarán la descomposición de una gran cantidad de partículas antes de volver a normalizarse a la cantidad original de partículas, mientras que los pasos de tiempo pequeños harán que la cantidad de partículas disminuya antes de volver a normalizarse. Mi pensamiento inicial es que los pasos pequeños deberían dar una solución más precisa, pero parece ser lo contrario.

No soy un experto numérico, por lo que la elección de ode45 fue simplemente arbitraria. ode113 me da lo mismo. :(

¿Alguien tiene alguna idea sobre este asunto? Avíseme si necesita algún detalle adicional.

Gracias.

Actualización 1: He estado investigando el método del tiempo imaginario y las EDO. Parece que si el intervalo de tiempo no es lo suficientemente pequeño, todo se vuelve inestable. Esto me hace preguntarme si mis ecuaciones no lineales son rígidas, lo que hace que las cosas sean mucho más difíciles de lo que entiendo. Te mantendré informado.

Actualización 2: CORREGIDO: El problema era tener una normalización fuera del ODE. Si la normalización se mantiene dentro de odefun, entonces el ODE devuelve el mismo resultado para diferentes opciones de pasos de tiempo "externos". Mi colega me mostró códigos antiguos y simplemente agregué una línea en mi odefun.

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

    ...
    [ Nonlinear equations evaluated ]  
    ...


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

La última línea calcula la diferencia en el número actual de partículas (Ntemp) y el número de partículas que el sistema debe contener (N0). Agrega una parte de las partículas a la salida y, por lo tanto, crea una estabilidad total del número de partículas en el sistema en lugar de hacer que todas se descompongan.

Plantearé también una nueva pregunta con respecto a la dimensionalidad del problema y algunas diferencias en el trabajo con picosegundos o nanosegundos como pasos de tiempo en el ODE.

Gracias a todos. :)


fuente
3
El problema fundamental es que está utilizando por la fuerza un método adaptativo como ode45()dar pasos equiespaciados. ¿Por qué, precisamente, estás evitando la generación del "vector gigante"? Si necesita puntos equiespaciados, ode45()proceda como de costumbre y luego use la interpolación.
JM
Hmm ... este podría ser el problema. El origen de estos pasos fijos fue que en algún lugar necesitaba volver a normalizar el número de partículas antes de que todas se pudrieran. Pero tal vez pueda hacer esto poniendo la normalización en odefun y usando el "vector de tiempo gigante". Además, la entrada en el ode45 es 4 * 129 * 129 números. Temía que si no usaba los pasos de tiempo no tendría suficiente memoria. y
Si la memoria funciona, debe haber una opción ode45()que le permita retener pasos más grandes que un cierto umbral; Puede que quieras averiguar eso.
JM
1
La respuesta es simplemente usar una estimación de error local. Hay uno integrado en ODE45, por lo que lo más fácil es usarlo, pero también puede codificarlo usted mismo.
David Ketcheson
1
En la respuesta a la pregunta de seguimiento , resulta que es una cantidad dimensional con dimensiones . ¿Quizás se obtienen resultados más consistentes con donde es el paso de tiempo? 1 / tiempo α0.11/timeΔtαΔt(NtN0)Δt
Stefano M

Respuestas:

4

Como no publicaste tu código MATLAB, no estoy seguro de cómo llamas a ode45. Supongo que está cambiando el vector tspan (segundo argumento) en cada llamada a ode45. Lo primero que hay que entender es que el vector tspan no tiene (casi) ningún efecto en el paso de tiempo utilizado por ode45. El vector tspan simplemente le permite pasar a ode45 el lapso de tiempo de la integración y a qué horas desea la salida. El paso de tiempo utilizado por el algoritmo Runga-Kutta en ode45 se ajusta internamente para lograr una precisión prescrita. Los dos parámetros que controlan esta precisión son RelTol y AbsTol en la estructura de opciones pasada a ode45. Tienen valores predeterminados razonables y, como no mencionó estos, supongo que no los cambió.

Dije "casi" sin efecto en el paso de tiempo normal ode45. Si está solicitando una salida a intervalos de tiempo muy pequeños en relación con el paso de tiempo que tomaría ode45, entonces tendrá que reducir el paso de tiempo para satisfacer su solicitud de salida. Creo que esto es lo que JM supone que está sucediendo. ¿Por qué necesita la solución en tantos tiempos de salida? Por lo general, es suficiente con solo solicitar la salida en suficientes momentos para generar una trama uniforme.

En cuanto al cambio en la solución que está viendo, quizás los valores predeterminados de RelTol y AbsTol no sean apropiados para su problema. Sugiero reemplazar su bucle en ode45 con una sola llamada, solicitar la salida en un número razonable de veces y experimentar con valores más pequeños de RelTol y AbsTol hasta que obtenga una solución convergente.

Bill Greene
fuente
Gracias por la respuesta. La razón por la que necesitaba una solución en tantos tiempos de salida es porque si la función de onda no se normaliza regularmente, entonces todo se descompone y mi sistema está vacío. Es por eso que puse el ode45 en un bucle con pequeños vectores tspan para poder normalizar después de cada vector tspan.
2

Dado que la ecuación de Schrödinger no lineal es, bueno, no lineal, puede tener una gran cantidad de estados estacionarios, algunos de los cuales pueden ser estables. En la realidad física, comenzando desde un estado particular, el sistema evolucionará determinísticamente hacia un estado final. Si el esquema numérico le da resultados diferentes para diferentes discretizaciones (pasos de tiempo), entonces este es un defecto fundamental de su discretización. Revisa tu código.

Si terminas con un estado , entonces es fácil verificar si realmente es un estado estacionario: si la evolución del tiempo viene dada por luego Si de hecho terminas con diferentes estados estacionarios, puedes comparar sus energías de Gibbs donde es la densidad de energía. Cuando , menudo parece bastante simple, por ejemplo, para las ecuaciones de Ginzburg-Landau, .d ψψ0F(ψ0)=0.G(ψ)=ΩE(ψ)E()F(ψ)=0E(ψ)E(ψ)=-| ψ| 4 4

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4
Nico Schlömer
fuente
Si. Trazo el perfil de densidad de mi solución de salida y cuando no cambia durante mucho tiempo, básicamente dejó de evolucionar, supongo que he alcanzado un estado estacionario. Pero no estoy seguro de que mirar la densidad de energía pueda ayudar, ya que la función de onda es un spinor con (+2, +1, -1, -2) componentes de giro. No creo que la integración de cada componente me diga la energía del condensado, pero cuando llego al estado fundamental, la densidad de energía debe ser estacionaria y, por lo tanto, constante en el tiempo, esta es una pista para una solución correcta.
1

Problema resuelto:

La normalización debe ser parte de la función evaluada en el ODE. Romper el ODE en muchos pasos y normalizar entre ellos causa una inestabilidad aparentemente numérica y produce resultados diferentes dependiendo de los intervalos de tiempo en los que se divide el ODE. (Consulte la edición 2 en cuestión para obtener más detalles).


fuente