使用 numpy.fft 计算积分

计算科学 麻木的 积分方程 fft
2021-12-04 17:25:49

晚上好,

我想了解为什么我没有得到正确的结果:我假设我知道我在离散数据点上的函数并将其扩展为离散傅里叶变换:sin(x)=k=mmAkei2πkx

我用它来计算积分:

RRsin(x+y)dx=k=mmAkei2πkyRRei2πkxdx=k=mmAki2πk(ei2πkRei2πkR)ei2πky

换句话说,我计算Ak从 FFT(sin(x)) 乘以每个Ak用这个词1i2πk(ei2πkRei2πkR)并通过这些修改后的逆 FFT 回到真实空间Ak.

但是我没有得到正确的结果(分析解决方案是cos(R+y)+cos(R+y))。我究竟做错了什么?

import numpy as np
import matplotlib.pyplot as plt
from numpy.fft import fft, fftfreq, ifft

pi2 = 2*np.pi

L = pi2
N = 1001   ## should be odd!!
R = 0.2

x = np.linspace(0, L-L/N, N)
f = np.sin(x)
FOU_f = np.zeros(N, dtype=complex)
phi = np.zeros(N, dtype=complex)
FOU_phi = np.zeros(N, dtype=complex)

FOU_f = fft(f, N)    ## function to fourier space

for k in range(1, N):
    FOU_phi[k] = ( FOU_f[k]/(1j*pi2*k) ) * ( np.exp(1j*pi2*k*R) - np.exp(-1j*pi2*k*R) )

phi = ifft(FOU_phi, N)  ## back to real space

analytic_sol = -np.cos(x+R) + np.cos(-R+x)

plt.plot(x, phi, label="test")
plt.plot(x, analytic_sol, label="analytic")
plt.legend()
plt.show()

在此处输入图像描述

0个回答
没有发现任何回复~