Scelta della dimensione del passo usando ODE in matlab


12

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.

t=iτ

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 + Δ Δt0tf[t0,,tf][t0,t0+Δ/2,t0+Δ],y,t0+ΔΔ

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. :)


3
Il problema fondamentale è che stai usando forzatamente un metodo adattivo come 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.
JM,

Hmm ... questo potrebbe essere il problema. L'origine di questi passaggi fissi era che da qualche parte avevo bisogno di ri-normalizzare il numero di particelle prima che decadessero tutte. Ma forse posso farlo mettendo la normalizzazione in odefun e usare il "vettore del tempo gigante". Inoltre, l'ingresso nell'ode 45 è 4 * 129 * 129 numeri. Avevo paura che se non avessi usato i passi del tempo non avrei avuto abbastanza memoria. y

Se la memoria serve, dovrebbe esserci un'opzione ode45()che ti consenta di mantenere passi maggiori di una certa soglia; potresti volerlo esaminare.
JM,

1
La risposta è solo per utilizzare una stima dell'errore locale. Ce n'è uno integrato in ODE45, quindi la cosa più semplice è usarlo, ma in alternativa puoi codificare il tuo.
David Ketcheson,

1
Nella risposta al follow-up questione si scopre che è una grandezza dimensionale di dimensioni . Forse risultati più coerenti si ottengono con dove è il passo temporale? 1 / tempo α0.11/timeΔtαΔt(NtN0)Δt
Stefano M,

Risposte:


4

Dato che non hai pubblicato il tuo codice MATLAB, non sono sicuro di come chiami ode45. Immagino che stai cambiando il vettore tspan (secondo argomento) su ogni chiamata in ode45. La prima cosa da capire è che il vettore tspan non ha (quasi) alcun effetto sul passo temporale usato da ode45. Il vettore tspan consente semplicemente di passare a ode45 l'intervallo di tempo dell'integrazione e in quali orari si desidera l'output. La fase temporale utilizzata dall'algoritmo Runga-Kutta in ode45 è regolata internamente per ottenere una precisione prescritta. I due parametri che controllano questa precisione sono RelTol e AbsTol nella struttura delle opzioni passata a ode45. Hanno impostazioni predefinite ragionevoli e poiché non le hai menzionate, suppongo che non le abbia modificate.

Ho detto "quasi" nessun effetto sulla normale fase temporale di ode45. Se si richiede un output a intervalli di tempo molto piccoli rispetto al passaggio di tempo che altrimenti impiegherebbe ode45, sarà necessario ridurre il passaggio di tempo per soddisfare la richiesta di output. Credo che questo sia ciò che JM presume stia succedendo. Perché hai bisogno della soluzione in così tanti tempi di uscita? Di solito è sufficiente richiedere l'output in tempi sufficienti per generare un diagramma uniforme.

Per quanto riguarda la modifica della soluzione che stai vedendo, forse i valori predefiniti di RelTol e AbsTol non sono appropriati per il tuo problema. Suggerisco di sostituire il loop su ode45 con una singola chiamata, richiedere l'output in un numero ragionevole di volte e sperimentare valori più piccoli di RelTol e AbsTol fino a ottenere una soluzione convergente.


Grazie per la risposta. Il motivo per cui avevo bisogno di una soluzione in così tanti tempi di uscita è perché se la funzione d'onda non viene normalizzata regolarmente, tutto decade e il mio sistema è vuoto. Ecco perché ho inserito l'ode45 in un ciclo con piccoli vettori tspan in modo da poter ri-normalizzare dopo ogni vettore tspan.

2

Poiché l'equazione di Schrödinger non lineare è, beh, non lineare, può avere un gran numero di stati stazionari, alcuni dei quali possono essere stabili. Nella realtà fisica, a partire da uno stato particolare, il sistema evolverà in modo deterministico in uno stato finale. Se lo schema numerico fornisce risultati diversi per diverse discretizzazioni (fasi temporali), questo è un difetto fondamentale della tua discretizzazione. Controlla il tuo codice.

ψ0

dψdt=F(ψ),
F(ψ0)=0.
G(ψ)=ΩE(ψ)
E()F(ψ)=0E(ψ)E(ψ)=|ψ|4

Sì. Tracciato il profilo di densità della mia soluzione di output e quando non cambia per molto tempo, praticamente smetto di evolversi, presumo di aver raggiunto uno stato stazionario. Ma non sono sicuro che guardare la densità di energia possa aiutare poiché la funzione d'onda è uno spinore con (+2, +1, -1, -2) componenti di spin. Non penso che l'integrazione di ciascun componente mi dirà l'energia del condensato ma quando arrivo allo stato fondamentale, la densità di energia dovrebbe essere stazionaria e quindi una costante nel tempo, questo è un indizio per una soluzione corretta.

1

Problema risolto:

La normalizzazione deve far parte della funzione valutata nell'ODE. La rottura dell'ODE in molti passaggi e la normalizzazione tra loro causa un'instabilità apparentemente numerica e produce risultati diversi a seconda degli intervalli di tempo in cui l'ODE è suddiviso. (Vedi modifica 2 in questione per maggiori dettagli.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.