【发布时间】:2014-04-20 23:08:45
【问题描述】:
我想将一个函数与傅里叶空间中的数值积分进行积分。
以下代码显示了一个工作示例:
import numpy as np
from pylab import *
from numpy.fft import fft, ifft, fftshift, ifftshift
N = 2**16
x = np.linspace(- np.pi , np.pi,N)
y = np.exp(-x**2) # function f(x)
ys = np.exp(-x**2) * (-2*x) # derivative f'(x)
T = x[-1] - x[0] # the whole range
w = (np.arange(N) - N /2.) / T + 0.00000001 # slightly shifted
# integration
fourier = ifft(ifftshift(1./ ( 2 * np.pi * 1j * w) * fftshift(fft(ys)) ) )
# differentiation
fourier2 = ifft(ifftshift(( 2 * np.pi * 1j * w) * fftshift(fft(fourier)) ) )
您可能会注意到频率w 定义中的+ 0.00000001。我需要它,否则我会生成 ZeroDivisionError 或 numpy 警告。这是一种解决方法,对于上面的示例似乎没问题,但是对于我遇到的更复杂的问题它失败了。一位同事告诉我,我可以简单地避免它,如果我得到 fft 的频移值 (np.arange(N) - N /2. + 1./2) / T。如何在 numpy 中做到这一点?有没有办法指定numpy fft的输出网格?
谢谢!
【问题讨论】: