Ciao e grazie per aver dato il tempo di guardare la mia domanda. Questa è una versione aggiornata della mia domanda che ho pubblicato in precedenza in physics.stackexchange.com
Attualmente sto studiando uno spinatore di eccitoni 2D Bose-Einstein Condensate e sono curioso di sapere lo stato fondamentale di questo sistema. Il metodo matematico per arrivare allo stato fondamentale è chiamato metodo del tempo immaginario .
Il metodo è molto semplice in cui il tempo nella meccanica quantistica è sostituito da uno immaginario Questa sostituzione fa decadere le particelle ad alta energia nel mio sistema più velocemente di quelle a bassa energia. Ri-normalizzando il numero di particelle in ogni fase del calcolo finiamo con un sistema di particelle a energia più bassa, ovvero. lo stato fondamentale.
Le equazioni in questione sono non lineari, chiamate equazioni di Schrödinger non lineari , talvolta equazioni di Gross-Pitaevskii . Per risolvere il problema sto usando Matlabs ode45 che evolve il sistema in avanti nel tempo e alla fine raggiunge lo stato fondamentale.
- Nota! L'equazione di Schrödinger non lineare include il laplaciano e alcuni altri termini differenziali nello spazio. Questi sono tutti risolti usando la trasformata di Fourier veloce. Alla fine abbiamo solo un tempo ODE. *
Il mio problema e la mia domanda: i calcoli vanno da a . L'ode 45 è messo in un ciclo for quindi non calcola un vettore gigante allo stesso tempo. Il primo giro inizierà con ode45 (odefun, ) e proseguirà la prossima volta da . Qui il passaggio temporale è il mio problema. Diverse scelte nelle fasi temporali mi offrono diverse soluzioni di stato fondamentale e non ho idea di come determinare quale fase temporale mi fornisce lo stato fondamentale "più" corretto!t f [ t 0 , … , t f ] [ t 0 , t 0 + Δ / 2 , t 0 + Δ ] , y , … t 0 + Δ Δ
Il mio tentativo: mi rendo conto che in questo schema grandi intervalli di tempo causano il decadimento di un gran numero di particelle prima di essere nuovamente normalizzato rispetto al numero originale di particelle, mentre piccoli passaggi di tempo causano il decadimento di una quantità minore di particelle prima di ottenere una nuova normalizzazione. Il mio pensiero iniziale è che piccoli passi temporali dovrebbero fornire una soluzione più accurata, ma sembra essere il contrario.
Non sono un esperto numerico, quindi la scelta di ode45 è stata semplicemente arbitraria. ode113 mi dà la stessa cosa. :(
Qualcuno ha qualche idea su questo argomento. Fammi sapere se sono necessari ulteriori dettagli.
Grazie.
Aggiornamento 1: ho studiato il metodo del tempo immaginario e gli ODE. Sembrerebbe che se il passo temporale non è abbastanza piccolo, l'intera cosa diventa instabile. Questo mi fa chiedere se le mie equazioni non lineari sono rigide, il che rende le cose molto più difficili da quello che capisco. Ti terrò aggiornato.
Aggiornamento 2: RISOLTO: il problema stava effettivamente avendo la normalizzazione al di fuori dell'ODE. Se la normalizzazione viene mantenuta all'interno di odefun, l'ODE restituisce lo stesso risultato per diverse scelte di fasce orarie "esterne". Il mio collega mi ha mostrato codici più vecchi e ho semplicemente aggiunto una riga nel mio odefun.
function y_out = odefun(t,y_in,...variables...)
...
[ Nonlinear equations evaluated ]
...
y_out = y_out + 0.1*y_in*(N0-Ntemp) ;
end
L'ultima riga calcola la differenza nel numero corrente di particelle (Ntemp) e il numero di particelle che il sistema dovrebbe contenere (N0). Aggiunge una parte delle particelle all'uscita e quindi crea una stabilità totale del numero di particelle nel sistema invece di farle decadere tutte.
Porrò anche una nuova domanda riguardo alla dimensionalità del problema e alcune differenze nel lavorare con picosecondi o nanosecondi come passi temporali nell'ODE.
Grazie a tutti. :)
ode45()
che ti consenta di mantenere passi maggiori di una certa soglia; potresti volerlo esaminare.
ode45()
fare passi equi. Perché, precisamente, stai evitando la generazione del "vettore gigante"? Se hai assolutamente bisogno di punti equispaziati,ode45()
procedi come al solito, quindi usa l'interpolazione.