Berapa tingkat konvergensi teoretis untuk pemecah FFT Poison?
Saya memecahkan persamaan Poisson: dengan n ( x , y , z ) = 3
Berikut adalah program menggunakan NumPy yang melakukan perhitungan.
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()
Dan di sini adalah grafik konvergensi (hanya memplot conv.txt
dari script di atas, di sini adalah notebook yang melakukan itu jika Anda ingin bermain dengan ini sendiri):
Seperti yang Anda lihat, konvergensi linier, yang merupakan kejutan bagi saya, saya pikir FFT bertemu lebih cepat dari itu.
Perbarui :
Solusinya memiliki titik puncak pada batas (saya tidak menyadari ini sebelumnya). Agar FFT dapat konvergen dengan cepat, solusinya harus memiliki semua turunannya lancar. Jadi saya juga mencoba sisi kanan berikut:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Adakah yang tahu benchmark apa pun dalam 3D sehingga saya bisa melihat konvergensi yang lebih cepat daripada linear?
sumber
Jawaban:
Biarkan saya menjawab semua pertanyaan:
Konvergensi teoretis adalah eksponensial selama solusinya cukup lancar.
Energi HartreeEH harus menyatu secara eksponensial untuk solusi yang cukup halus. Jika solusinya kurang mulus, maka konvergensi lebih lambat.
Sisi kanan mana pun yang menghasilkan solusi yang periodik dan dapat dibedakan tanpa batas (termasuk melintasi batas periodik) harus bertemu secara eksponensial.
Dalam kode di atas ada bug, yang menyebabkan konvergensi lebih lambat daripada eksponensial. Menggunakan kode kepadatan halus ( https://gist.github.com/certik/5549650/ ), tambalan berikut memperbaiki bug:
Masalahnya adalah bahwa pengambilan sampel ruang nyata tidak dapat mengulangi titik pertama dan terakhir (yang memiliki nilai yang sama karena kondisi batas periodik). Dengan kata lain, masalahnya adalah menyiapkan sampel awal.
Setelah perbaikan ini, kepadatan berkumpul dalam satu iterasi, seperti yang Matt katakan di atas. Jadi saya bahkan tidak memetakan grafik konvergensi.
Namun, seseorang dapat mencoba kepadatan yang lebih sulit, misalnya:
maka konvergensi bersifat eksponensial, seperti yang diharapkan. Berikut adalah grafik konvergensi untuk kerapatan ini:
sumber