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()
que le permita retener pasos más grandes que un cierto umbral; Puede que quieras averiguar eso.
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.