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.
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 + Δ Δ
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. :)
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.ode45()
que le permita retener pasos más grandes que un cierto umbral; Puede que quieras averiguar eso.Respuestas:
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.
fuente
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 ψψ0 F(ψ0)=0.G(ψ)=∫ΩE(ψ)E(⋅)F(ψ)=0E(ψ)E(ψ)=-| ψ| 4 4
fuente
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