实际pyFFTW中的拉普拉斯算术

时间:2019-06-28 16:40:51

标签: python numpy fft numerical-methods pyfftw

对于正向(多​​维)FFTW算法,可以指定输入var selectedItems = [IndexPath]() override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let firstIndexPath = selectedItems.first{ //If the section with the first element selected and the new selection are not equals, display your message if indexPath.section != firstIndexPath.section{ let alert = UIAlertController(title: "Warning", message: "Message", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { a in self.selectIndexPath(indexPath: indexPath, isSelected: false) })) //You can put it here if you prefer not wait for the closure for realize the deselection //self.selectIndexPath(indexPath: indexPath, isSelected: false) self.present(alert, animated: true, completion: nil) return } self.selectIndexPath(indexPath: indexPath, isSelected: true) }else{ self.selectIndexPath(indexPath: indexPath, isSelected: true) } } func selectIndexPath(indexPath: IndexPath, isSelected: Bool){ tableView.cellForRow(at: indexPath)?.accessoryType = isSelected ? .checkmark : .none if isSelected{ selectedItems.append(indexPath) }else{ selectedItems.removeAll(where: {$0 == indexPath}) tableView.deselectRow(at: indexPath, animated: true) } let section = sections[indexPath.section] let item = section.items[indexPath.row] // for all selected rows assuming tableView.allowsMultipleSelection = true } 为实数,并且输出应为复数。这是在创建numpy.ndarray的参数中的字节对齐数组时完成的:

fft_object

输出阵列不对称,第二个轴被截断到正频率。对于复杂的FFT,您可以使用以下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')

计算laplacian
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"

但是,这真的有效吗?似乎正在忽略“ y”方向上的负频率。

1 个答案:

答案 0 :(得分:1)

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

回顾一下:对于实数组a,傅立叶变换b具有类似Hermtian的属性:b(-kx,-ky)b(kx,ky)的复共轭。 正向fft的实际版本通过省略负ky来丢弃(大部分)冗余信息。向后fft的实际版本假定可以通过复杂地结合适当的元素来找到丢失频率处的值。

如果您使用了复杂的fft并保留了所有频率,则-k2 * b仍将具有类似于Hermitian的属性。因此,实际向后fft所做的假设仍然成立,并将给出正确的答案。

我猜想pyfftw可以很好地工作,只要您为float64情况下的输出指定正确大小的direction=FFT_BACKWARD数组即可。