3

numpy.fft パッケージを使用するいくつかの動作する python コードがあります。ここにスニペットがあります。

for i in range(steps):
    print i
    psixvec = Ux * psixvec
    psikvec = Uk * np.fft.fftn(psixvec)
    psixvec = np.fft.ifftn(psikvec)

return psixvec

pyfftwパッケージを利用するために、このコードを書き直そうとしました。私が思いついたのは、次のコードです。これは機能するはずです。

fft = fftw.builders.fftn(psix_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False)

ifft = fftw.builders.ifftn(psik_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False) 


for i in range(steps):
    psix_align[:] = Ux * psix_align
    psik_align[:] = Uk * fft()
    psix_align[:] = ifft()

return psix_align

numpy.fft問題は、このコードではパッケージを使用した場合と同じ結果が得られないことです。添付の画像を参照してください。

numpy fft パッケージ pyfftw パッケージ

4

1 に答える 1

2

解決しました。私が使用していた初期化のために

psix_align = fftw.n_byte_align(psi0, fftw.simd_alignment, dtype='complex64')
psik_align = fftw.n_byte_align(np.zeros_like(psi0), fftw.simd_alignment, dtype='complex64')

と交換complex64する必要がありましたcomplex128。今、私は同じ結果を得ます。これはおそらく、関連する数値が非常に小さいためです ( 1e-11z 軸の を参照)。

編集:誰かがpyfftw質問のタグに追加できますか?

于 2013-09-04T18:16:19.677 に答える