FFT Poisson çözücüsünün yakınsama oranı


16

Bir FFT Zehir çözücü için teorik yakınsama oranı nedir?

Bir Poisson denklemini : 2 V H ( x , y , z ) = - 4 π n ( x , y , z ) ve n ( x , y , z ) =

2V'H(x,y,z)=-4πn(x,y,z)
etki alanında[0,2]x[0,2]x[0,2]periyodik sınır koşulu ile. Bu yük yoğunluğu net nötrdür. : Çözelti ile verilir VH(x)=N(
n(x,y,z)=3π((x-1)2+(y-1)2+(z-1)2-1)
[0,2]x[0,2]x[0,2] buradax=(x,y,z). Karşılıklı boşlukta VH(G)=4πn(G)
V'H(x)=n(y)|x-y|d3y
x=(x,y,z) buradaG,karşılıklı boşluk vektörlerdir. Hartree enerjisiyle ilgileniyorum: EH=1
V'H(G,)=4πn(G,)G,2
G, bu (ayrıklaştırma sonra) olur olarak karşılıklı alanı: E, H=2ttΣG0 | n( G ) | 2
E'H=12n(x)n(y)|x-y|d3xd3y=12V'H(x)n(x)d3x
G=0terimi etkili bir hale getirir, yük yoğunluğu, net nötr (ve daha önce nötr olduğu, daha sonra her şey tutarlıdır) ihmal edilir.
E'H=2πΣG,0|n(G,)|2G,2
G,=0

E'H=12835π=1,16410 ...

İşte NumPy kullanan hesaplamayı yapan bir program.

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()

Ve burada bir yakınsama grafiği (sadece komplo conv.txt, yukarıdaki komut burada kendiniz oynamak istiyorsanız bunu yapan bir dizüstü bilgisayar):

FFT yakınsama grafiği

Gördüğünüz gibi, yakınsama doğrusaldır, bu benim için bir sürpriz oldu, FFT'nin bundan daha hızlı birleştiğini düşündüm.

Güncelleme :

Çözümün sınırında bir tepe var (bunu daha önce fark etmedim). FFT'nin hızlı bir şekilde birleşmesi için, çözeltinin tüm türevleri pürüzsüz olması gerekir. Bu yüzden aşağıdaki sağ tarafı da denedim:

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

V'H=günah(πx)günah(πy)günah(πz)sınırsız bir şekilde ayırt edilebilir olmalıdır. Bu durumda tam integralE'H=3π8. Yine de, FFT çözücü yukarıdaki komut dosyasını çalıştırarak ve yakınsama ( grafiklerle güncellenmiş not defteri ) çizilerek kontrol edilebileceği gibi, hala sadece tam olarak bu kesin çözüme doğru yakınsar .

Doğrusaldan daha hızlı yakınsama görebilmek için 3B'de herhangi bir kıyaslama yapan var mı?


Ondrej, pürüzsüz yoğunluğunuzun Fourier dönüşümü bir delta işlevi değil mi? Çalıştırmak için çok tembel olduğumu itiraf ediyorum, ancak ilk denemede kesin cevabı almalıdır.
Matt Knepley

Sanırım öyle. Ancak, dizüstü bilgisayar grafiklerinde görüldüğü gibi tek bir yinelemede birleşmez. Ne olduğu hakkında hiçbir fikrim yok.
Ondřej Čertík

Ondrej, uygulamanızın doğru olduğundan emin misiniz? Ben grad okulunda bir ödev için spektral çözücüler uygulamak çalışıyorum hatırlıyorum ve sabit sabit. Hesaplanan ve kesin enerji arasındaki mutlak mesafeye bakarak hatayı ölçtüğünüzü fark ettim. Yakınsamanız sorunun gerçek çözümüne nasıl benziyor? Sorunun 2 boyutlu bir dilim üzerinde hesaplanması ve hatta çizilmesi kolay olmalıdır.
Aron Ahmadia

Aron --- Uygulamamı başka bir koda karşı kontrol ettim, ancak yanlış ilk örnekleme için kontrol ediyordum, bu yüzden her iki kodda da aynı hatayı aldım. Matt haklıydı, şimdi ilk denemede birleşiyor. Cevabımı aşağıda görebilirsiniz.
Ondřej Čertík

Yanıtlar:


10

Önce tüm soruları cevaplayayım:

Bir FFT Zehir çözücü için teorik yakınsama oranı nedir?

Çözüm yeterince pürüzsüz olduğu sürece teorik yakınsama üsteldir.

Bu enerji ne kadar hızlı birleşmeli?

Hartree Enerjisi E'Hyeterince pürüzsüz bir çözüm için katlanarak birleşmelidir. Çözelti daha az pürüzsüzse, yakınsama daha yavaştır.

Doğrusaldan daha hızlı yakınsama görebilmek için 3B'de herhangi bir kıyaslama yapan var mı?

Periyodik ve sınırsız olarak farklılaşabilen bir çözüm üreten herhangi bir sağ taraf (periyodik sınırlar dahil) katlanarak birleşmelidir.


Yukarıdaki kodda, yakınsamanın üstelden daha yavaş olmasına neden olan bir hata vardır. Düzgün yoğunluk kodunu ( https://gist.github.com/certik/5549650/ ) kullanarak, aşağıdaki yama hatayı düzeltir:

@@ -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

Sorun, gerçek alan örnekleme oldu olamaz (nedeniyle periyodik sınır koşuluna aynı değere sahiptir) ilk ve son nokta tekrar. Başka bir deyişle, sorun ilk örneklemenin ayarlanmasındaydı.

Bu düzeltmeden sonra, yoğunluk Matt'in yukarıda belirttiği gibi tek bir yinelemede birleşir. Bu yüzden yakınsama grafiklerini bile çizmedim.

Bununla birlikte, daha zor bir yoğunluk denenebilir, örneğin:

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

yakınsama beklendiği gibi üsteldir. İşte bu yoğunluk için yakınsama grafikleri: resim açıklamasını buraya girin resim açıklamasını buraya girin


Muhteşem. Üzgünüm daha fazla yardım etmedim!
Aron Ahmadia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.