Was ist die theoretische Konvergenzrate für einen FFT-Giftlöser?
Ich löse eine Poisson-Gleichung:
Hier ist ein Programm mit NumPy, das die Berechnung durchführt.
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()
Und hier ist ein Konvergenzdiagramm (nur conv.txt
das obige Skript, hier ist ein Notizbuch, das es macht, wenn Sie selbst damit spielen möchten):
Wie Sie sehen, ist die Konvergenz linear, was für mich eine Überraschung war. Ich dachte, dass FFT viel schneller konvergiert.
Update :
Die Lösung hat eine Spitze an der Grenze (das habe ich vorher nicht bemerkt). Damit FFT schnell konvergiert, müssen alle Ableitungen der Lösung glatt sein. Also habe ich auch die folgende rechte Seite ausprobiert:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Kennt jemand einen Benchmark in 3D, so dass ich eine schnellere Konvergenz als linear sehen kann?
quelle
Antworten:
Lassen Sie mich zunächst alle Fragen beantworten:
Die theoretische Konvergenz ist exponentiell, solange die Lösung ausreichend glatt ist.
Jede rechte Seite, die eine Lösung erzeugt, die periodisch und unendlich differenzierbar ist (auch über die periodische Grenze hinweg), sollte exponentiell konvergieren.
Im obigen Code ist zufällig ein Fehler aufgetreten, der dazu führt, dass die Konvergenz langsamer als exponentiell ist. Mit dem Code für die glatte Dichte ( https://gist.github.com/certik/5549650/ ) behebt der folgende Patch den Fehler:
Das Problem bestand darin, dass die Realraumabtastung den ersten und den letzten Punkt nicht wiederholen kann (die aufgrund der periodischen Randbedingung denselben Wert haben). Das Problem bestand also darin, die Erstbemusterung einzurichten.
Nach dieser Korrektur konvergiert die Dichte in einer Iteration, wie Matt oben sagte. Also habe ich nicht einmal die Konvergenzgraphen gezeichnet.
Man kann jedoch eine schwierigere Dichte ausprobieren, zum Beispiel:
dann ist die Konvergenz erwartungsgemäß exponentiell. Hier sind die Konvergenzdiagramme für diese Dichte:
quelle