Hey, und danke, dass du dir Zeit genommen hast, meine Frage anzuschauen. Dies ist eine aktualisierte Version meiner Frage, die ich zuvor unter physics.stackexchange.com gepostet habe
Ich studiere derzeit ein 2D-Excitonen-Spinor-Bose-Einstein-Kondensat und bin gespannt auf den Grundzustand dieses Systems. Die mathematische Methode zum Erreichen des Grundzustands wird als imaginäre Zeitmethode bezeichnet .
Das Verfahren ist sehr einfach in der die Zeit in der Quantenmechanik durch imaginäre ersetzt wird
Die fraglichen Gleichungen sind nichtlinear und werden als nichtlineare Schrödinger-Gleichungen bezeichnet , manchmal auch als Gross-Pitaevskii-Gleichungen . Um das Problem zu lösen, verwende ich Matlabs ode45, das das System mit der Zeit weiterentwickelt und schließlich den Grundzustand erreicht.
- Hinweis! Die nichtlineare Schrödinger-Gleichung enthält den Laplace-Ausdruck und einige andere Differentialterme im Raum. Diese werden alle mit einer schnellen Fourier-Transformation gelöst. Am Ende haben wir nur eine Zeit ODE. *
Mein Problem und meine Frage: Die Berechnungen gehen von bis t f . Die ode45 wird in eine for- Schleife gestellt, damit sie nicht gleichzeitig einen riesigen Vektor [ t 0 , … , t f ] berechnet . Die erste Runde würde mit ode45 beginnen (odefun, ) und beim nächsten Mal mit . Hier ist der Zeitschritt mein Problem. Unterschiedliche Auswahlmöglichkeiten in Zeitschritten geben mir unterschiedliche Grundzustandslösungen und ich habe keine Ahnung, wie ich feststellen kann, welcher Zeitschritt den "richtigsten" Grundzustand liefert!
Mein Versuch: Mir ist klar, dass in diesem Schema große Zeitschritte bewirken, dass eine große Anzahl von Partikeln zerfällt, bevor sie wieder auf die ursprüngliche Anzahl von Partikeln normalisiert werden, während kleine Zeitschritte bewirken, dass eine kleinere Menge von Partikeln zerfällt, bevor sie wieder normalisiert werden. Mein erster Gedanke ist, dass kleine Zeitschritte eine genauere Lösung ergeben sollten, aber es scheint das Gegenteil zu sein.
Ich bin kein Zahlenexperte, daher war die Wahl von ode45 einfach willkürlich. ode113 gibt mir das gleiche. :(
Hat jemand irgendwelche Gedanken zu diesem Thema. Lassen Sie mich wissen, wenn zusätzliche Details benötigt werden.
Vielen Dank.
Update 1: Ich habe die Methode der imaginären Zeit und die ODEs untersucht. Es scheint, dass wenn der Zeitschritt nicht klein genug ist, das Ganze instabil wird. Ich frage mich daher, ob meine nichtlinearen Gleichungen steif sind, was die Dinge nach meinem Verständnis sehr viel schwieriger macht. Ich halte dich auf dem Laufenden.
Update 2: BEHOBEN: Das Problem bestand tatsächlich in der Normalisierung außerhalb der ODE. Wenn die Normalisierung innerhalb von odefun gehalten wird, gibt die ODE das gleiche Ergebnis für verschiedene Auswahlen von "äußeren" Zeitschritten zurück. Mein Kollege zeigte mir ältere Codes und ich fügte einfach eine Zeile in meinem odefun hinzu.
function y_out = odefun(t,y_in,...variables...)
...
[ Nonlinear equations evaluated ]
...
y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end
Die letzte Zeile berechnet die Differenz der aktuellen Partikelanzahl (Ntemp) und der Partikelanzahl, die das System aufnehmen soll (N0). Es addiert einen Teil der Partikel zurück in die Ausgabe und erzeugt so eine Gesamtstabilität der Partikelanzahl im System, anstatt dass alle Partikel zerfallen.
Ich werde auch eine neue Frage bezüglich der Dimensionalität des Problems und einiger Unterschiede bei der Arbeit mit Pikosekunden oder Nanosekunden als Zeitschritten in der ODE stellen.
Danke euch allen. :)
ode45()
, mit der Sie Schritte beibehalten können, die einen bestimmten Schwellenwert überschreiten. Vielleicht möchten Sie das untersuchen.
ode45()
anwenden, um gleichmäßige Schritte zu unternehmen. Warum gerade meiden Sie die Erzeugung des "Riesenvektors"? Wenn Sie unbedingt gleichwertige Punkte benötigen,ode45()
gehen Sie wie gewohnt vor und verwenden Sie dann die Interpolation.