Какова теоретическая скорость сходимости для решения FFT Poison?
Я решаю уравнение Пуассона: с n ( x , y , z ) = 3
Вот программа, использующая NumPy, которая выполняет вычисления.
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()
А вот график сходимости (просто построение приведенного conv.txt
выше сценария, вот блокнот, который делает это, если вы хотите поиграть с этим самостоятельно):
Как видите, конвергенция линейная, что было для меня неожиданностью, я думал, что FFT сходится гораздо быстрее, чем это.
Обновление :
У решения есть острый край на границе (я не осознавал этого раньше). Чтобы БПФ быстро сходилось, решение должно иметь все гладкие производные. Поэтому я также попробовал следующую правую часть:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Кто-нибудь знает какой-нибудь эталон в 3D, чтобы я мог видеть более быструю конвергенцию, чем линейную?
источник
Ответы:
Позвольте мне сначала ответить на все вопросы:
Теоретическая сходимость является экспоненциальной, пока решение является достаточно гладким.
Любая правая часть, которая дает периодическое и бесконечно дифференцируемое решение (в том числе через периодическую границу), должна сходиться экспоненциально.
В приведенном выше коде есть ошибка, которая вызывает сходимость медленнее, чем экспоненциальная. Используя код с гладкой плотностью ( https://gist.github.com/certik/5549650/ ), следующий патч исправляет ошибку:
Проблема заключалась в том, что реальная космическая выборка не может повторить первую и последнюю точку (которая имеет одинаковое значение из-за периодических граничных условий). Другими словами, проблема заключалась в настройке начальной выборки.
После этого исправления плотность сходится за одну итерацию, как сказал Мэтт выше. Поэтому я даже не строил графики сходимости.
Однако можно попробовать более сложную плотность, например:
тогда сходимость является экспоненциальной, как и ожидалось. Вот графики сходимости для этой плотности:
источник