Qual é a taxa de convergência teórica para um solucionador de FFT Poison?
Estou resolvendo uma equação de Poisson: com n ( x , y , z ) = 3
Aqui está um programa usando o NumPy que faz o cálculo.
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()
E aqui está um gráfico de convergência (apenas plotando o conv.txt
script acima, aqui está um caderno que faz isso se você quiser brincar com isso):
Como você pode ver, a convergência é linear, o que foi uma surpresa para mim, pensei que a FFT converge muito mais rápido que isso.
Atualização :
A solução tem uma cúspide na fronteira (eu não percebi isso antes). Para que a FFT converja rapidamente, a solução deve ter todos os derivados suaves. Então, eu também tentei o seguinte lado direito:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Alguém conhece alguma referência em 3D para que eu possa ver uma convergência mais rápida do que linear?
fonte
Respostas:
Deixe-me primeiro responder a todas as perguntas:
A convergência teórica é exponencial desde que a solução seja suficientemente suave.
Qualquer lado direito que produza uma solução periódica e infinitamente diferenciável (inclusive além da fronteira periódica) deve convergir exponencialmente.
No código acima, ocorre um erro, que faz com que a convergência seja mais lenta que a exponencial. Usando o código de densidade suave ( https://gist.github.com/certik/5549650/ ), o seguinte patch corrige o erro:
O problema era que a amostragem no espaço real não pode repetir o primeiro e o último ponto (que tem o mesmo valor devido à condição de contorno periódica). Em outras palavras, o problema estava em configurar a amostragem inicial.
Após essa correção, a densidade converge em uma iteração, como Matt disse acima. Então, eu nem plotei os gráficos de convergência.
No entanto, pode-se tentar uma densidade mais difícil, por exemplo:
então a convergência é exponencial, como esperado. Aqui estão os gráficos de convergência para essa densidade:
fonte