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
Per il problema di prova sopra, questo può essere valutato analiticamente e si ottiene: Quanto velocemente dovrebbe convergere questa energia?
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.txt
dallo script sopra, ecco un quaderno che lo fa se vuoi giocare con questo da solo):
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 π
Qualcuno conosce qualche benchmark in 3D in modo che io possa vedere una convergenza più veloce di quella lineare?