Замена подпрограмм numpy.fft на pyfftw, работает не так, как ожидалось

У меня есть некоторый рабочий код Python, использующий пакет numpy.fft, вот фрагмент:

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

1 ответ

Решение

Решаемые. Для инициализации я использовал

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-11 на оси Z).

Редактировать: Может быть, кто-то может добавить pyfftw к тегам вопроса?

Другие вопросы по тегам