实际pyFFTW中拉普拉斯算子的计算
Calculation of Laplacian in real pyFFTW
对于前向(多维)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" 方向的负频率。
我不熟悉 pyfftw
,但是使用 numpy.fft
模块它会工作得很好(假设您使用评论中提到的 rfftfreq
)。
回顾一下:对于实数组,a
,傅立叶变换 b
,有一个 Hermtian-like 属性:b(-kx,-ky)
是复数b(kx,ky)
的共轭。
前向 fft 的真实版本通过省略负数 ky
来丢弃(大部分)冗余信息。后向 fft 的真实版本假定缺失频率处的值可以通过复共轭适当的元素找到。
如果您使用复数 fft 并保留所有频率,-k2 * b
仍然会有 Hermitian-like 属性。所以真实后向fft所做的假设仍然成立并给出正确答案。
我猜 pyfftw
如果您为 direction=FFT_BACKWARD
案例的输出指定正确大小的 float64
数组,它会工作得很好。
对于前向(多维)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" 方向的负频率。
我不熟悉 pyfftw
,但是使用 numpy.fft
模块它会工作得很好(假设您使用评论中提到的 rfftfreq
)。
回顾一下:对于实数组,a
,傅立叶变换 b
,有一个 Hermtian-like 属性:b(-kx,-ky)
是复数b(kx,ky)
的共轭。
前向 fft 的真实版本通过省略负数 ky
来丢弃(大部分)冗余信息。后向 fft 的真实版本假定缺失频率处的值可以通过复共轭适当的元素找到。
如果您使用复数 fft 并保留所有频率,-k2 * b
仍然会有 Hermitian-like 属性。所以真实后向fft所做的假设仍然成立并给出正确答案。
我猜 pyfftw
如果您为 direction=FFT_BACKWARD
案例的输出指定正确大小的 float64
数组,它会工作得很好。