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()
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.ode45()
, mit der Sie Schritte beibehalten können, die einen bestimmten Schwellenwert überschreiten. Vielleicht möchten Sie das untersuchen.Antworten:
Da Sie Ihren MATLAB-Code nicht veröffentlicht haben, bin ich mir nicht sicher, wie Sie ode45 aufrufen. Ich vermute, Sie ändern den tspan-Vektor (zweites Argument) bei jedem Aufruf von ode45. Das erste, was zu verstehen ist, ist, dass der tspan-Vektor (fast) keinen Einfluss auf den von ode45 verwendeten Zeitschritt hat. Mit dem tspan-Vektor können Sie einfach die Zeitspanne der Integration und die gewünschten Ausgabezeiten an ode45 übergeben. Der vom Runga-Kutta-Algorithmus in ode45 verwendete Zeitschritt wird intern angepasst, um eine vorgeschriebene Genauigkeit zu erreichen. Die beiden Parameter, die diese Genauigkeit steuern, sind RelTol und AbsTol in der Optionsstruktur, die an ode45 übergeben wird. Sie haben vernünftige Standardeinstellungen, und da Sie diese nicht erwähnt haben, gehe ich davon aus, dass Sie sie nicht geändert haben.
Ich sagte "fast" keine Auswirkung auf den normalen Zeitschritt von ode45. Wenn Sie die Ausgabe in Zeitintervallen anfordern, die im Verhältnis zum Zeitschritt, den ode45 andernfalls benötigt, sehr klein sind, muss der Zeitschritt verringert werden, um Ihre Ausgabeanforderung zu erfüllen. Ich glaube, das ist es, was JM annimmt. Warum brauchen Sie die Lösung zu so vielen Ausgabezeiten? Normalerweise reicht es aus, die Ausgabe nur zu einer ausreichenden Zeit anzufordern, um ein glattes Diagramm zu erstellen.
In Bezug auf die Änderung der Lösung, die Sie sehen, sind die Standardwerte von RelTol und AbsTol möglicherweise nicht für Ihr Problem geeignet. Ich empfehle, Ihre Schleife auf ode45 durch einen einzelnen Aufruf zu ersetzen, die Ausgabe zu einer angemessenen Anzahl von Malen anzufordern und mit kleineren Werten von RelTol und AbsTol zu experimentieren, bis Sie eine konvergierte Lösung erhalten.
quelle
Da die nichtlineare Schrödinger-Gleichung nichtlinear ist, kann sie eine große Anzahl stationärer Zustände haben, von denen einige stabil sein können. In der physischen Realität wird sich das System ausgehend von einem bestimmten Zustand deterministisch zu einem Endzustand entwickeln. Wenn das numerische Schema für verschiedene Diskretisierungen (Zeitschritte) unterschiedliche Ergebnisse liefert, ist dies ein grundlegender Fehler Ihrer Diskretisierung. Überprüfen Sie Ihren Code.
quelle
Problem gelöst:
Die Normalisierung muss Teil der in der ODE bewerteten Funktion sein. Das Aufbrechen der ODE in vielen Schritten und das Normalisieren zwischen ihnen verursacht scheinbar numerische Instabilität und führt zu unterschiedlichen Ergebnissen, abhängig von den Zeitintervallen, in die die ODE eingebrochen wird. (Weitere Informationen finden Sie unter Bearbeitung 2 in Frage.)
quelle