在我寻求了解如何使用 FFT 来计算积分的过程中(请参阅我的另一个问题click,仍然没有答案),我发现两个函数的卷积可以通过乘以函数的傅里叶变换并取该产品的逆变换。
现在假设我要计算
我可以把它写成卷积和和作为给出适当积分边界的指示函数。
我的向量在 N 个数据点上给出,在 0 和某个 L 之间等距,对于这 N 个点我也知道.
奇怪的是,如果,该方法似乎有效。但是用另一个 L,说这是行不通的。这是什么原因,我该怎么办?
我已经阅读了关于零填充的方法,其中我将 N-1 个零添加到两个函数向量。那会有帮助吗?如果是这样,我想在 ifft 之后有一个原始大小为 N 的向量(这会给我一个 2N-1 的向量),这样我就可以得到每个 N 的卷积值价值观。有没有办法做到这一点?
import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft, fftfreq, ifft
pi2 = 2 * np.pi
N = 2001 ## should be odd!!
R = 0.2
L = 1
x = np.linspace(0, L-L/N, N)
f = np.sin(x)
g = x.copy()
g[g>R]=0 ## indicator function
# f=np.pad(f, (0, N-1), 'constant') ## zero padding??
# g=np.pad(g, (0, N-1), 'constant')
F = fft(f)
G = fft(g)
C = (L/N)*ifft(F*G)
analytic_sol = -np.sin(R-x)+R*np.cos(R-x)-np.sin(x) ## analytic result
plt.plot(x, C, label="test")
plt.plot(x, analytic_sol, label="analytic",linestyle="--")
plt.legend()
plt.show()
请注意解决方案如何仅在 x=0.2=R 时才有效,即当指标函数变为零时。这里会发生什么?
