Tỷ lệ hội tụ lý thuyết cho một người giải FFT Poison là gì?
Tôi đang giải phương trình Poisson: với trên miền với định kỳ điều kiện biên. Mật độ điện tích này là trung tính ròng. Giải pháp được đưa ra bởi: trong đó . Trong không gian đối ứng trong đó là các vectơ không gian đối ứng. Tôi quan tâm đến năng lượng của Hartree: n ( x , y ,
Đối với bài toán thử nghiệm ở trên, điều này có thể được đánh giá một cách phân tích và người ta nhận được: Năng lượng này nên hội tụ nhanh như thế nào?
Đây là một chương trình sử dụng NumPy để tính toán.
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()
Và đây là một biểu đồ hội tụ (chỉ cần vẽ sơ đồ conv.txt
từ tập lệnh trên, đây là một cuốn sổ tay thực hiện nếu bạn muốn tự chơi với nó):
Như bạn có thể thấy, sự hội tụ là tuyến tính, điều này gây bất ngờ cho tôi, tôi nghĩ rằng FFT hội tụ nhanh hơn thế nhiều.
Cập nhật :
Giải pháp có một đỉnh ở ranh giới (tôi đã không nhận ra điều này trước đây). Để FFT hội tụ nhanh, giải pháp phải có tất cả các dẫn xuất trơn tru. Vì vậy, tôi cũng đã thử phía bên tay phải sau:
nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4
Mà bạn chỉ có thể đưa vào kịch bản trên ( kịch bản cập nhật ). Giải pháp chính xác là , nên khác biệt vô cùng. Tích phân chính xác trong trường hợp này là . Tuy nhiên, bộ giải FFT vẫn chỉ hội tụ tuyến tính đối với giải pháp chính xác này, như có thể được kiểm tra bằng cách chạy tập lệnh ở trên và vẽ sơ đồ hội tụ ( sổ ghi chép được cập nhật với các ô).
Có ai biết bất kỳ điểm chuẩn nào trong 3D để tôi có thể thấy sự hội tụ nhanh hơn tuyến tính không?