【问题标题】:Calculation of Laplacian in real pyFFTW在实际 pyFFTW 中计算拉普拉斯算子
【发布时间】:2019-06-28 16:40:51
【问题描述】:

对于前向(多维)FFTW 算法,您可以指定输入numpy.ndarray 是实数,输出应该是复数。这是在创建 fft_object 的参数中的字节对齐数组时完成的:

import numpy as np
import pyfftw

N = 256  # Input array size (preferrably 2^{a}*3^{b}*5^{c}*7^{d}*11^{e}*13^{f}, (e+f = 0,1))
dx = 0.1  # Spacing between mesh points
a = pyfftw.empty_aligned((N, N), dtype='float64')
b = pyfftw.empty_aligned((N, N//2+1), dtype='complex128')
fft_object = pyfftw.FFTW(a, b, axes=(0, 1), direction='FFTW_FORWARD')

输出数组不对称,第二个轴被截断到正频率。对于复数 FFT,您可以使用以下 np.ndarray

计算拉普拉斯算子
kx, ky = np.meshgrid(np.fft.fftfreq(N, dx), np.fft.fftfreq(N, dx))  # Wave vector components
k2 = -4*np.pi**2*(kx*kx+ky*ky)  # np.ndarray for the Laplacian operator in "frequency space"

在截断的情况下如何完成?我考虑过使用:

kx, ky = np.meshgrid(np.fft.fftfreq(N//2+1, dx), np.fft.fftfreq(N, dx))  # The axes conven-
#                                                                        tions are different

但是,这真的有用吗?似乎忽略了“y”方向的负频率。

【问题讨论】:

  • 你可能想要np.fft.rfftfreq 作为最后一个。
  • 你是对的,那个确实在同一点被截断
  • 但是,结果正确吗?即使你不考虑负频率?

标签: python numpy fft numerical-methods pyfftw


【解决方案1】:

我不熟悉pyfftw,但使用numpy.fft 模块可以正常工作(假设您使用cmets 中提到的rfftfreq)。

回顾一下:对于一个实数数组a,傅立叶变换b 具有类似赫姆特的性质:b(-kx,-ky)b(kx,ky) 的复共轭。 前向 fft 的真实版本通过省略否定的kys 来丢弃(大部分)冗余信息。反向 fft 的真实版本假设可以通过对适当元素进行复共轭来找到缺失频率处的值。

如果您使用复数 fft 并保留所有频率,-k2 * b 仍将具有 Hermitian-like 属性。因此,真正的后向 fft 所做的假设仍然成立,并且会给出正确的答案。

我猜pyfftw 可以正常工作,前提是您为direction=FFT_BACKWARD 案例的输出指定正确大小的float64 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多