Tasso di convergenza del solutore FFT Poisson


16

Qual è il tasso di convergenza teorico per un solutore FFT Poison?

Sto risolvendo un'equazione di Poisson: con sul dominio con periodico condizione al contorno. Questa densità di carica è neutra al netto. La soluzione è data da: where . Nello spazio reciproco dove sono i vettori di spazio reciproco. Sono interessato all'energia Hartree: n ( x , y , z ) = 3

2VH(X,y,z)=-4πn(X,y,z)
[0,2]×[0,2]×[0,2]VH(x)=n( y )
n(X,y,z)=3π((X-1)2+(y-1)2+(z-1)2-1)
[0,2]×[0,2]×[0,2]x=(x,y,z)VH(G)=4πn(G)
VH(X)=n(y)|X-y|d3y
X=(X,y,z) GEH=1
VH(sol)=4πn(sol)sol2
sol
EH=12n(X)n(y)|X-y|d3Xd3y=12VH(X)n(X)d3X
Nello spazio reciproco questo diventa (dopo la discretizzazione): Il termine viene omesso, il che rende effettivamente neutra la densità di carica (e poiché è già neutrale, quindi tutto è coerente). G=0
EH=2πΣsol0|n(sol)|2sol2
sol=0

Per il problema di prova sopra, questo può essere valutato analiticamente e si ottiene: Quanto velocemente dovrebbe convergere questa energia?

EH=12835π=1,16,41 mila ...

Ecco un programma che utilizza NumPy che esegue il calcolo.

from numpy import empty, pi, meshgrid, linspace, sum
from numpy.fft import fftn, fftfreq
E_exact = 128/(35*pi)
print "Hartree Energy (exact):      %.15f" % E_exact
f = open("conv.txt", "w")
for N in range(3, 384, 10):
    print "N =", N
    L = 2.
    x1d = linspace(0, L, N)
    x, y, z = meshgrid(x1d, x1d, x1d)

    nr = 3 * ((x-1)**2 + (y-1)**2 + (z-1)**2 - 1) / pi
    ng = fftn(nr) / N**3

    G1d = N * fftfreq(N) * 2*pi/L
    kx, ky, kz = meshgrid(G1d, G1d, G1d)
    G2 = kx**2+ky**2+kz**2
    G2[0, 0, 0] = 1  # omit the G=0 term

    tmp = 2*pi*abs(ng)**2 / G2
    tmp[0, 0, 0] = 0  # omit the G=0 term
    E = sum(tmp) * L**3
    print "Hartree Energy (calculated): %.15f" % E
    f.write("%d %.15f\n" % (N, E))
f.close()

Ed ecco un grafico di convergenza (solo tracciando conv.txtdallo script sopra, ecco un quaderno che lo fa se vuoi giocare con questo da solo):

Grafico di convergenza FFT

Come puoi vedere, la convergenza è lineare, il che è stata una sorpresa per me, ho pensato che FFT converge molto più velocemente di così.

Aggiornamento :

La soluzione ha una cuspide al limite (non me ne ero reso conto prima). Affinché FFT converga rapidamente, la soluzione deve avere tutti i derivati ​​lisci. Quindi ho anche provato il seguente lato destro:

nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4

Che puoi semplicemente inserire nello script sopra ( script aggiornato ). La soluzione esatta è , che dovrebbe essere infinitamente differenziabile. L'integrale esatto in questo caso è . Tuttavia, il risolutore FFT converge ancora solo linearmente verso questa soluzione esatta, come può essere verificato eseguendo lo script sopra e disegnando la convergenza ( notebook aggiornato con grafici).E H = 3 πVH=peccato(πX)peccato(πy)peccato(πz)EH=3π8

Qualcuno conosce qualche benchmark in 3D in modo che io possa vedere una convergenza più veloce di quella lineare?


Ondrej, la trasformata di Fourier della tua densità regolare non è una funzione delta? Ammetto di essere troppo pigro per eseguirlo, ma al primo tentativo dovrebbe ottenere la risposta esatta.
Matt Knepley,

Io penso che sia. Ma non converge in una iterazione, come si può vedere dalle trame del notebook. Non ho idea di cosa stia accadendo.
Ondřej Čertík,

Ondrej, sei sicuro che la tua implementazione sia corretta? Ricordo di aver tentato di implementare risolutori spettrali per un compito a casa nella scuola di specializzazione e di aver flottato totalmente le costanti. Ho notato che stai misurando l'errore osservando la distanza assoluta tra l'energia calcolata e quella esatta. Che aspetto ha la tua convergenza rispetto alla soluzione effettiva del problema? Questo dovrebbe essere facile da calcolare e persino tracciare su una fetta 2-D del problema.
Aron Ahmadia,

Aron --- Ho verificato la mia implementazione con qualche altro codice, ma lo stavo verificando per il mio campionamento iniziale sbagliato, quindi avevo lo stesso bug in entrambi i codici. Matt aveva ragione, ora converge al primo tentativo. Vedi la mia risposta qui sotto.
Ondřej Čertík,

Risposte:


10

Vorrei prima rispondere a tutte le domande:

Qual è il tasso di convergenza teorico per un solutore FFT Poison?

La convergenza teorica è esponenziale purché la soluzione sia sufficientemente regolare.

Quanto velocemente dovrebbe convergere questa energia?

EH

Qualcuno conosce qualche benchmark in 3D in modo che io possa vedere una convergenza più veloce di quella lineare?

Qualsiasi lato destro che produce una soluzione periodica e infinitamente differenziabile (anche oltre il confine periodico) dovrebbe convergere esponenzialmente.


Nel codice qui sopra sembra esserci un bug, che rende la convergenza più lenta dell'esponenziale. Utilizzando il codice di densità uniforme ( https://gist.github.com/certik/5549650/ ), la seguente patch corregge il bug:

@@ -6,7 +6,7 @@ f = open("conv.txt", "w")
 for N in range(3, 180, 10):
     print "N =", N
     L = 2.
-    x1d = linspace(0, L, N)
+    x1d = linspace(0, L, N+1)[:-1]
     x, y, z = meshgrid(x1d, x1d, x1d)

     nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4

Il problema era che il campionamento dello spazio reale non può ripetere il primo e l'ultimo punto (che ha lo stesso valore a causa della condizione al contorno periodica). In altre parole, il problema era nella configurazione del campionamento iniziale.

Dopo questa correzione, la densità converge in una iterazione, come ha detto Matt sopra. Quindi non ho nemmeno tracciato i grafici di convergenza.

Tuttavia, si può provare una densità più difficile, ad esempio:

     nr = 3*pi*exp(sin(pi*x)*sin(pi*y)*sin(pi*z))/4

quindi la convergenza è esponenziale, come previsto. Ecco i grafici di convergenza per questa densità: inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Eccezionale. Mi dispiace non sono stato più di aiuto!
Aron Ahmadia,
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.