FFT 독 솔버의 이론적 수렴 률은 얼마입니까?
I는 포아송 방정식 오전 : 와 도메인 에서 주기적으로 경계 조건. 이 전하 밀도는 순 중립입니다. 해결책은 다음과 같습니다. 여기서 입니다. 역수 공간에서 여기서 는 역수 공간 벡터입니다. Hartree 에너지에 관심이 있습니다. 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가 그보다 훨씬 빨리 수렴한다고 생각했습니다.
업데이트 :
솔루션에는 경계가 있습니다 (이전에는 이것을 몰랐습니다). FFT가 빠르게 수렴하려면 솔루션에 모든 파생물이 매끄러 워야합니다. 그래서 나는 또한 다음과 같은 오른쪽을 시도했습니다.
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
위의 스크립트 (업데이트 된 스크립트 )에 넣을 수 있습니다 . 정확한 해결책은 입니다. 이 경우 정확한 적분은 입니다. 그러나 FFT 솔버는 여전히 위의 스크립트를 실행하고 수렴 ( 플롯으로 업데이트 된 노트북) 을 플롯 하여 확인할 수있는 것처럼이 정확한 솔루션을 향해 선형으로 만 수렴합니다 .
누구나 선형보다 빠른 수렴을 볼 수 있도록 3D의 벤치 마크를 알고 있습니까?