Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实pyFFTW中拉普拉斯算子的计算_Python_Numpy_Fft_Numerical Methods_Pyfftw - Fatal编程技术网

Python 实pyFFTW中拉普拉斯算子的计算

Python 实pyFFTW中拉普拉斯算子的计算,python,numpy,fft,numerical-methods,pyfftw,Python,Numpy,Fft,Numerical Methods,Pyfftw,对于正向(多维)FFTW算法,您可以指定输入numpy.ndarray为实数,而输出应为复数。这是在创建位于fft\u对象的参数中的字节对齐数组时完成的: 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 = p

对于正向(多维)FFTW算法,您可以指定输入
numpy.ndarray
为实数,而输出应为复数。这是在创建位于
fft\u对象的参数中的字节对齐数组时完成的:

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
,有一个类似于厄姆田的性质:
b(-kx,-ky)
b(kx,ky)
的复共轭。 前向fft的实际版本通过省略负的
ky
s丢弃(大部分)冗余信息。后向fft的实际版本假设缺失频率处的值可以通过复共轭适当的元素找到

如果使用复数fft并保留所有频率,
-k2*b
仍将具有类似厄米特的属性。因此,由实后向fft所作的假设仍然成立,并将给出正确的答案


我想,如果为
direction=FFT\u BACKWARD
案例的输出指定一个大小正确的
float64
数组,那么使用
pyfftw
就可以很好地工作。

您可能希望对最后一个例子使用
np.FFT.rfftfreq
。您是对的,这个例子在同一点被截断,但是,结果正确吗?即使你不考虑负频率吗?