Замена подпрограмм 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
пакет. Смотрите прикрепленные изображения.
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
к тегам вопроса?