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

我需要替换complex64complex128. 现在我得到了同样的结果。这可能是因为所涉及的数字非常小(参见1e-11z 轴上的 )。

编辑:也许有人可以添加pyfftw到问题的标签?

于 2013-09-04T18:16:19.677 回答