Tốc độ hội tụ của bộ giải FFT Poisson


16

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 ,

2VH(x,y,z)= =-4πn(x,y,z)
[0,2]×[0,2]×[0,2]VH(x)=n( y )
n(x,y,z)= =3π((x-1)2+(y-1)2+(z-1)2-1)
[0,2]×[0,2]×[0,2]x=(x,y,z)VH(G)=4πn
VH(x)= =n(y)|x-y|d3y
x= =(x,y,z) GE
VH(G)= =4πn(G)G2
G
EH= =12n(x)n(y)|x-y|d3xd3y= =12VH(x)n(x)d3x
Trong không gian đối ứng, điều này trở thành (sau khi rời rạc): Thuật ngữ bị bỏ qua, điều này làm cho mật độ điện tích trung tính trở nên trung tính (và vì nó là đã trung lập, sau đó mọi thứ đều nhất quán).
EH= =2πΣG0|n(G)|2G2
G= =0

Đố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?

EH= =12835π= =1.16410 ...

Đâ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.txttừ 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ó):

Biểu đồ hội tụ FFT

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 ô).VH= =tội(πx)tội(πy)tội(πz)EH= =3πsố 8

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?


Ondrej, không phải biến đổi Fourier của mật độ mịn của bạn là hàm delta? Tôi thừa nhận là quá lười để chạy nó, nhưng nó sẽ nhận được câu trả lời chính xác trong lần thử đầu tiên.
Matt Knepley

Tôi nghĩ rằng nó là. Nhưng nó không hội tụ trong một lần lặp, như có thể thấy từ các ô máy tính xách tay. Tôi không biết chuyện gì đang xảy ra.
Ondřej Čertík

Ondrej, bạn có chắc rằng việc thực hiện của bạn là chính xác? Tôi nhớ đã cố gắng thực hiện các bộ giải phổ cho một bài tập về nhà ở trường học và hoàn toàn làm hỏng các hằng số. Tôi nhận thấy rằng bạn đang đo lỗi bằng cách nhìn vào khoảng cách tuyệt đối giữa năng lượng được tính toán và chính xác. Sự hội tụ của bạn trông như thế nào đối với giải pháp thực tế của vấn đề? Điều này sẽ dễ dàng tính toán và thậm chí âm mưu trên một lát cắt 2 chiều của vấn đề.
Aron Ahmadia

Aron --- Tôi đã kiểm tra việc triển khai của mình đối với một số mã khác, nhưng tôi đã kiểm tra nó để lấy mẫu ban đầu sai, vì vậy tôi có cùng một lỗi trong cả hai mã. Matt đã đúng, bây giờ nó hội tụ ở lần thử đầu tiên. Xem câu trả lời của tôi dưới đây.
Ondřej Čertík

Câu trả lời:


10

Trước tiên hãy để tôi trả lời tất cả các câu hỏi:

Tỷ lệ hội tụ lý thuyết cho một người giải FFT Poison là gì?

Sự hội tụ lý thuyết là theo cấp số nhân miễn là giải pháp đủ trơn tru.

Năng lượng này nên hội tụ nhanh như thế nào?

EH

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?

Bất kỳ phía bên tay phải nào tạo ra một giải pháp có tính định kỳ và vô cùng khác biệt (bao gồm cả trên ranh giới định kỳ) sẽ hội tụ theo cấp số nhân.


Trong đoạn mã trên có một lỗi xảy ra, khiến cho sự hội tụ chậm hơn theo cấp số nhân. Sử dụng mã mật độ mịn ( https://gist.github.com/certik/5549650/ ), bản vá sau đây sửa lỗi:

@@ -6,7 +6,7 @@ f = open("conv.txt", "w")
 for N in range(3, 180, 10):
     print "N =", N
     L = 2.
-    x1d = linspace(0, L, N)
+    x1d = linspace(0, L, N+1)[:-1]
     x, y, z = meshgrid(x1d, x1d, x1d)

     nr = 3*pi*sin(pi*x)*sin(pi*y)*sin(pi*z)/4

Vấn đề là việc lấy mẫu không gian thực không thể lặp lại điểm đầu tiên và điểm cuối (có cùng giá trị do điều kiện biên định kỳ). Nói cách khác, vấn đề là trong việc thiết lập lấy mẫu ban đầu.

Sau khi sửa lỗi này, mật độ hội tụ trong một lần lặp, như Matt đã nói ở trên. Vì vậy, tôi thậm chí không vẽ đồ thị hội tụ.

Tuy nhiên, người ta có thể thử mật độ khó hơn, ví dụ:

     nr = 3*pi*exp(sin(pi*x)*sin(pi*y)*sin(pi*z))/4

sau đó sự hội tụ là theo cấp số nhân, như mong đợi. Dưới đây là các biểu đồ hội tụ cho mật độ này: nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Tuyệt vời. Xin lỗi tôi đã không giúp đỡ nhiều hơn!
Aron Ahmadia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.