FFTポアソンソルバーの収束率


16

FFTポイズンソルバーの理論上の収束率は?

Iは、ポアソン方程式を解く午前: N X Y Z = 3

2VHバツyz=4πnバツyz
ドメインに[02]×[02]×[02]、周期的境界条件を有します。この電荷密度は正味中立です。溶液は、で与えられる: VHX=N
nバツyz=3πバツ12+y12+z121
[02]×[02]×[02] ここでx=xyz。逆空間における VHG=4πNG
VHバツ=ny|バツy|d3y
バツ=バツyz ここで、Gは逆空間ベクトルです。ハートリーエネルギーに興味があります: EH=1
VHG=4πnGG2
G で逆空間これは(離散化した後)になる: EH=2πΣG0 | n G | 2
EH=12nバツny|バツy|d3バツd3y=12VHバツnバツd3バツ
ザ・G=0という用語は、有効正味中性の電荷密度を行う(それは既に中性であるので、次に、すべてが一致している)は、省略されています。
EH=2πG0|nG|2G2
G=0

上記のテスト問題の場合、これは分析的に評価でき、が得られます。

EH=12835π=1.16410 ...

以下は、計算を行う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はそれよりはるかに速く収束すると思いました。

更新

ソリューションの境界には尖点があります(これは以前はわかりませんでした)。FFTが高速に収束するためには、解はすべての微分が滑らかでなければなりません。そこで、次の右側も試しました。

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

VH=πバツπyπzEH=3π8

線形よりも速い収束を見ることができるように、誰かが3Dのベンチマークを知っていますか?


オンドレイ、滑らかな密度のフーリエ変換はデルタ関数ではありませんか?私はそれを実行するには遅すぎることを認めますが、最初の試行で正確な答えを得るはずです。
マットネプリー

私はそう思う。しかし、ノートプロットからわかるように、1回の反復で収束しません。何が起こっているのか分かりません。
オンドレジ・セティク

Ondrej、あなたの実装は正しいですか?大学院の宿題にスペクトルソルバーを実装しようとして、定数を完全に削除しようとしたことを覚えています。計算されたエネルギーと正確なエネルギーの間の絶対距離を見ることで、誤差を測定していることに気付きます。問題の実際の解決策に対する収束はどのように見えますか?これは簡単に計算でき、問題の2次元スライス上にプロットすることもできます。
アロンアフマディア

Aron ---他のコードに対して実装をチェックしましたが、間違った初期サンプリングをチェックしていたため、両方のコードに同じバグがありました。マットは正しかったのですが、今では最初の試行で収束しました。以下の私の答えをご覧ください。
オンドジェチェルティク

回答:


10

最初にすべての質問に答えさせてください:

FFTポイズンソルバーの理論上の収束率は?

解が十分に滑らかである限り、理論上の収束は指数関数的です。

このエネルギーはどのくらい速く収束するのでしょうか?

ハートリーエネルギー EH十分に滑らかな解を得るには、指数関数的に収束する必要があります。解が滑らかでない場合、収束は遅くなります。

線形よりも速い収束を見ることができるように、誰かが3Dのベンチマークを知っていますか?

周期的で無限に微分可能な解を生成する右側(周期的な境界を含む)は、指数関数的に収束する必要があります。


上記のコードにはバグがあり、指数関数的より収束が遅くなります。スムーズな密度コード(https://gist.github.com/certik/5549650/)を使用して、次のパッチでバグを修正します。

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

問題は、実空間サンプリング最初と最後のポイント(周期的な境界条件のために同じ値を持つ)を繰り返すことができないことでした。つまり、問題は初期サンプリングの設定にありました。

この修正後、密度は1回の反復で収束します(マットが上で述べたように)。そのため、収束グラフもプロットしませんでした。

ただし、次のように、より難しい密度を試すことができます。

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

予想どおり、収束は指数関数的です。この密度の収束グラフは次のとおりです。 ここに画像の説明を入力してください ここに画像の説明を入力してください


驚くばかり。申し訳ありませんが、私はこれ以上助けにはなりませんでした!
アロンアフマディア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.