【问题标题】:numerical integration in Fourier space with numpy.fft用 numpy.fft 在傅里叶空间中进行数值积分
【发布时间】: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的输出网格?

谢谢!

【问题讨论】:

    标签: python numpy fft


    【解决方案1】:

    问题是w 包含 0(应该如此),然后除以 ww 中的 0 是“直流”频率;它对应于傅里叶级数的常数项。

    如果您将一个函数与一个具有系数 A0 的非零 DC 分量积分,则生成的函数包含一个 A0*t 形式的项,它不在此傅里叶技术应用的周期函数空间中。所以你必须假设输入的直流分量为0。在这种情况下,当你除以w时,你会得到(0+0j)/0,即(nan+nanj)。如果输入的直流分量不为零,您将得到(inf+nanj)。无论哪种方式,解决方案都是简单地忽略你得到的任何东西,并将 DC 傅立叶系数设置为 0,然后再使用 ifft 进行反相。

    有几种方法可以实现这一点。一种方法是更改​​这些行:

    w = (np.arange(N) - N /2.) / T + 0.00000001 # slightly shifted
    # integration
    fourier =  ifft(ifftshift(1./ ( 2 * np.pi * 1j * w) * fftshift(fft(ys)) )  ) 
    

    对此(我添加了几个中间变量):

    w = (np.arange(N) - N /2.) / T
    
    # integration
    Fys = fft(ys)
    with np.errstate(divide="ignore", invalid="ignore"):
        modFys = ifftshift(1./ (2 * np.pi * 1j * w) * fftshift(Fys))
    
    # modFys[0] will hold the result of dividing the DC component of y by 0, so it
    # will be nan or inf.  Setting modFys[0] to 0 amounts to choosing a specific
    # constant of integration.
    modFys[0] = 0
    
    fourier = ifft(modFys).real
    

    我还取了ifft 的结果的实数部分。理论上虚部都应该是0;实际上,由于正常的不精确浮点运算,它们会非常小但非零。

    顺便说一句,如果您不想实现自己的这种技术版本,可以使用scipy.fftpack.diff

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多