¿Cuál es la tasa de convergencia teórica para un solucionador de veneno FFT?
Estoy resolviendo una ecuación de Poisson: con en el dominio con periódico condición de frontera. Esta densidad de carga es neta neutra. La solución viene dada por: donde . En el espacio recíproco donde son los vectores espaciales recíprocos. Estoy interesado en la energía Hartree: n ( x , y , z ) = 3
Para el problema de prueba anterior, esto puede evaluarse analíticamente y uno obtiene:
Aquí hay un programa que usa NumPy que hace el 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()
Y aquí hay un gráfico de convergencia (solo trazando el conv.txt
script anterior, aquí hay un cuaderno que lo hace si quieres jugar con esto tú mismo):
Como puede ver, la convergencia es lineal, lo que fue una sorpresa para mí, pensé que FFT converge mucho más rápido que eso.
Actualización :
La solución tiene una cúspide en el límite (no me di cuenta de esto antes). Para que FFT converja rápidamente, la solución debe tener todas las derivadas suaves. Así que también probé el siguiente lado derecho:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Que puedes poner en el script anterior ( script actualizado ). La solución exacta es , que debería ser infinitamente diferenciable. La integral exacta en este caso es . Sin embargo, el solucionador de FFT todavía converge linealmente hacia esta solución exacta, como se puede verificar ejecutando el script anterior y trazando la convergencia ( cuaderno actualizado con gráficos).
¿Alguien conoce algún punto de referencia en 3D para que pueda ver una convergencia más rápida que lineal?