Choix de la taille des pas à l'aide des ODE dans matlab

12

Salut et merci d'avoir donné le temps de regarder ma question. Ceci est une version mise à jour de ma question que j'ai publiée plus tôt dans physics.stackexchange.com

J'étudie actuellement un condensateur à excitons 2D Bose-Einstein Condensate et je suis curieux de connaître l'état fondamental de ce système. La méthode mathématique pour atteindre l'état fondamental est appelée la méthode du temps imaginaire .

La méthode est très simple où le temps en mécanique quantique est remplacé par un temps imaginaire Cette substitution fait que les particules de haute énergie de mon système se désintègrent plus rapidement que celles de basse énergie. En re-normalisant le nombre de particules à chaque étape du calcul, nous nous retrouvons avec un système de particules de plus faible énergie, alias. l'état fondamental.

t=iτ

La ou les équations en question sont non linéaires, appelées équations de Schrödinger non linéaires , parfois équation de Gross-Pitaevskii . Pour résoudre le problème, j'utilise Matlabs ode45 qui fait évoluer le système vers l'avant dans le temps et atteint finalement l'état fondamental.

  • Remarque! L'équation de Schrödinger non linéaire inclut le laplacien et quelques autres termes différentiels dans l'espace. Tout cela est résolu en utilisant une transformée de Fourier rapide. Au final nous n'avons qu'un temps ODE. *

Mon problème et ma question: les calculs vont de à . L'ode45 est placé dans une boucle for afin qu'il ne calcule pas un vecteur géant en même temps. Le premier tour commencerait par ode45 (odefun, ) et continuerait la prochaine fois à partir de . Ici, le pas de temps est mon problème. Différents choix dans les pas de temps me donnent différentes solutions d'état fondamental et je n'ai aucune idée comment déterminer quel pas de temps me donne l'état fondamental "le plus" correct!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+ΔΔ

Ma tentative: je me rends compte que dans ce schéma, de grands pas de temps entraîneront la décomposition d'un grand nombre de particules avant d'être re-normalisé au nombre de particules d'origine tandis que de petits pas de temps entraîneront une plus petite quantité de particules à se désintégrer avant de se normaliser. Ma pensée initiale est que de petits pas de temps devraient donner une solution plus précise, mais il semble que ce soit le contraire.

Je ne suis pas un expert en numérique, le choix de l'ode45 était donc tout simplement arbitraire. ode113 me donne la même chose. :(

Quelqu'un a-t-il des réflexions à ce sujet? Faites-moi savoir si des détails supplémentaires sont nécessaires.

Je vous remercie.

Mise à jour 1: j'ai fait des recherches sur la méthode du temps imaginaire et les ODE. Il semblerait que si le pas de temps n'est pas assez petit, le tout devient instable. Cela me fait me demander si mes équations non linéaires sont rigides, ce qui rend les choses beaucoup plus difficiles d'après ce que je comprends. Je vous tiens au courant.

Mise à jour 2: FIXE: Le problème était en effet d'avoir la normalisation en dehors de l'ODE. Si la normalisation est conservée à l'intérieur d'odefun, l'ODE retourne le même résultat pour différents choix de pas de temps "extérieurs". Mon collègue m'a montré des codes plus anciens et j'ai simplement ajouté une ligne dans mon odefun.

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

    ...
    [ Nonlinear equations evaluated ]  
    ...


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

La dernière ligne calcule la différence entre le nombre actuel de particules (Ntemp) et le nombre de particules que le système doit contenir (N0). Il ajoute une partie des particules à la sortie et crée ainsi une stabilité totale du nombre de particules dans le système au lieu de les éliminer toutes.

Je vais également poser une nouvelle question concernant la dimensionnalité du problème et certaines différences dans le travail avec des picosecondes ou des nanosecondes comme pas de temps dans l'ODE.

Merci à tous. :)


la source
3
Le problème fondamental est que vous utilisez de force une méthode adaptative comme ode45()pour prendre des étapes équidistantes. Pourquoi, précisément, évitez-vous la génération du "vecteur géant"? Si vous avez absolument besoin de points espacés, ode45()procédez comme d'habitude, puis utilisez l'interpolation.
JM
y
Si la mémoire est bonne, il devrait y avoir une option ode45()qui vous permettrait de conserver des étapes supérieures à un certain seuil; vous voudrez peut-être examiner cela.
JM
1
La réponse est simplement d'utiliser une estimation d'erreur locale. Il y en a un intégré à ODE45, donc le plus simple est de l'utiliser, mais vous pouvez également coder le vôtre.
David Ketcheson
1
0.11/timeαΔt(NtN0)Δt

Réponses:

4

Puisque vous n'avez pas posté votre code MATLAB, je ne sais pas comment vous appelez ode45. Je suppose que vous changez le vecteur tspan (deuxième argument) à chaque appel à ode45. La première chose à comprendre est que le vecteur tspan n'a (presque) aucun effet sur le pas de temps utilisé par ode45. Le vecteur tspan vous permet simplement de passer à ode45 le laps de temps de l'intégration et à quels moments vous voulez la sortie. Le pas de temps utilisé par l'algorithme Runga-Kutta dans l'ode45 est ajusté en interne pour atteindre une précision prescrite. Les deux paramètres qui contrôlent cette précision sont RelTol et AbsTol dans la structure d'options passée à ode45. Ils ont des valeurs par défaut raisonnables et comme vous ne les avez pas mentionnés, je suppose que vous ne les avez pas modifiés.

J'ai dit "presque" aucun effet sur le pas de temps normal de l'ode45. Si vous demandez une sortie à des intervalles de temps très petits par rapport au pas de temps que prendrait ode45, alors il devra réduire le pas de temps pour satisfaire votre demande de sortie. Je crois que c'est ce que JM suppose en cours. Pourquoi avez-vous besoin de la solution à autant de temps de sortie? Habituellement, il suffit de demander une sortie suffisamment de fois pour générer un tracé fluide.

En ce qui concerne le changement de solution que vous voyez, peut-être que les valeurs par défaut de RelTol et AbsTol ne conviennent pas à votre problème. Je suggère de remplacer votre boucle sur ode45 par un seul appel, de demander une sortie à un nombre raisonnable de fois et d'expérimenter avec des valeurs plus petites de RelTol et AbsTol jusqu'à ce que vous obteniez une solution convergente.

Bill Greene
la source
Merci d'avoir répondu. La raison pour laquelle j'avais besoin d'une solution à tant de fois en sortie est parce que si la fonction d'onde n'est pas normalisée régulièrement, tout se désintègre et mon système est vide. C'est pourquoi j'ai mis l'ode45 dans une boucle avec de petits vecteurs tspan afin que je puisse re-normaliser après chaque vecteur tspan.
2

Puisque l'équation de Schrödinger non linéaire est, eh bien, non linéaire, elle peut avoir un grand nombre d'états stationnaires, dont certains peuvent être stables. Dans la réalité physique, à partir d'un état particulier, le système évoluera de manière déterministe vers un état final. Si le schéma numérique vous donne des résultats différents pour différentes discrétisations (pas de temps), alors c'est un défaut fondamental de votre discrétisation. Vérifiez votre code.

ψ0

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4
Nico Schlömer
la source
Oui. Je trace le profil de densité de ma solution de sortie et quand elle ne change pas pendant une longue période, essentiellement cessé d'évoluer, je suppose que j'ai atteint un état stationnaire. Mais je ne suis pas sûr que regarder la densité d'énergie puisse aider car la fonction d'onde est un spineur avec (+2, +1, -1, -2) des composantes de spin. Je ne pense pas que l'intégration de chaque composant me dira l'énergie du condensat mais quand j'arrive à l'état fondamental, la densité d'énergie doit être stationnaire et donc constante dans le temps, c'est un indice pour une solution correcte.
1

Problème résolu:

La normalisation doit faire partie de la fonction évaluée dans l'ODE. La décomposition de l'ODE en plusieurs étapes et la normalisation entre elles provoque une instabilité apparemment numérique et produit des résultats différents en fonction des intervalles de temps dans lesquels l'ODE est divisé. (Voir l'édition 2 en question pour plus de détails.)


la source