Cześć i dzięki za poświęcenie czasu na spojrzenie na moje pytanie. To jest zaktualizowana wersja mojego pytania, które opublikowałem wcześniej w physics.stackexchange.com
Obecnie badam wirnik ekscytonowy 2D Kondensat Bosego-Einsteina i jestem ciekawy stanu podstawowego tego układu. Matematyczna metoda dojścia do stanu podstawowego nazywa się metodą wyobrażoną czasu .
Metoda jest bardzo prosta, w której czas w mechanice kwantowej zastępuje się urojonym jeden Podstawienie to powoduje, że cząsteczki o wysokiej energii w moim układzie rozpadają się szybciej niż cząstki o niskiej energii. Ponownie normalizując liczbę cząstek na każdym etapie obliczeń, otrzymujemy układ cząstek o najniższej energii, aka. stan podstawowy.
Omawiane równanie jest nieliniowe, nazywane nieliniowym równaniem Schrödingera , czasem równaniem Grossa-Pitaevskiego . Aby rozwiązać problem, używam Matlabs ode45, który ewoluuje system do przodu i ostatecznie osiąga stan podstawowy.
- Uwaga! Nieliniowe równanie Schrödingera obejmuje laplacian i niektóre inne wyrażenia różniczkowe w przestrzeni. Wszystko to rozwiązuje się za pomocą szybkiej transformacji Fouriera. W końcu mamy tylko czas ODE. *
Mój problem i pytanie: obliczenia idą od do t f . Ode45 jest umieszczany w pętli for , aby nie obliczał jednocześnie gigantycznego wektora [ t 0 , … , t f ] . Pierwsza runda zaczynałaby się od od45 (odefun, [ t 0 , t 0 + Δ / 2 , t 0 + Δ ] , y , … ), a następnie następna od t 0 + Δ. Tutaj krok czasu jest moim problemem. Różne wybory kroków czasowych dają mi różne rozwiązania stanu podstawowego i nie mam pojęcia, jak ustalić, który krok czasowy daje mi „najbardziej” prawidłowy stan podstawowy!
Moja próba: zdaję sobie sprawę, że w tym schemacie duże kroki czasowe spowodują rozpad dużej liczby cząstek przed ponowną normalizacją do pierwotnej liczby cząstek, podczas gdy małe kroki czasowe spowodują rozpad mniejszej ilości cząstek przed ponowną normalizacją. Początkowo sądzę, że małe kroki czasowe powinny dać dokładniejsze rozwiązanie, ale wydaje się, że jest odwrotnie.
Nie jestem ekspertem numerycznym, więc wybór ode45 był po prostu arbitralny. ode113 daje mi to samo. :(
Czy ktoś ma jakieś przemyślenia na ten temat. Daj mi znać, jeśli potrzebne będą dodatkowe szczegóły.
Dziękuję Ci.
Aktualizacja 1: Badam urojoną metodę czasu i ODE. Wydaje się, że jeśli krok czasowy nie jest wystarczająco mały, wszystko staje się niestabilne. To sprawia, że zastanawiam się, czy moje równania nieliniowe są sztywne, co znacznie utrudnia to, co rozumiem. Będę Cie informować na bieżąco.
Aktualizacja 2: NAPRAWIONO: Problemem była normalizacja poza ODE. Jeśli normalizacja jest utrzymywana w odefun, wówczas ODE zwraca ten sam wynik dla różnych wyborów „zewnętrznych” kroków czasowych. Mój kolega pokazał mi starsze kody i po prostu dodałem jedną linię do mojego odefun.
function y_out = odefun(t,y_in,...variables...)
...
[ Nonlinear equations evaluated ]
...
y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end
Ostatni wiersz oblicza różnicę w bieżącej liczbie cząstek (Ntemp) i liczbie cząstek, które system powinien zatrzymać (N0). Dodaje część cząstek z powrotem do wyjścia, a tym samym tworzy całkowitą stabilność liczby cząstek w układzie zamiast ich wszystkie zanikają.
Zadam również nowe pytanie dotyczące wymiarów problemu i pewnych różnic w pracy z pikosekundami lub nanosekundami jako kroków czasowych w ODE.
Dziękuję wam wszystkim. :)
ode45()
umożliwiająca zachowanie kroków większych niż określony próg; możesz przyjrzeć się temu.
ode45()
robienie równych kroków. Dlaczego właśnie unikasz generowania „gigantycznego wektora”? Jeśli absolutnie potrzebujesz równych punktów,ode45()
postępuj jak zwykle, a następnie użyj interpolacji.