我有以下问题: 我想集成一个2D数组,因此基本上可以反转梯度运算符。
假设我有一个非常简单的数组,如下所示:
shape = (60, 60)
sampling = 1
k_mesh = np.meshgrid(np.fft.fftfreq(shape[0], sampling), np.fft.fftfreq(shape[1], sampling))
然后我将我的向量场构造为复数值欠款(x矢量=实部,y矢量=虚部):
k = k_mesh[0] + 1j * k_mesh[1]
现在我进行渐变:
k_grad = np.gradient(k, sampling)
然后使用以下功能,使用傅立叶变换将其反转:
def freq_array(shape, sampling):
f_freq_1d_y = np.fft.fftfreq(shape[0], sampling[0])
f_freq_1d_x = np.fft.fftfreq(shape[1], sampling[1])
f_freq_mesh = np.meshgrid(f_freq_1d_x, f_freq_1d_y)
f_freq = np.hypot(f_freq_mesh[0], f_freq_mesh[1])
return f_freq
def int_2d_fourier(arr, sampling):
freqs = freq_array(arr.shape, sampling)
k_sq = np.where(freqs != 0, freqs**2, 0.0001)
k = np.meshgrid(np.fft.fftfreq(arr.shape[0], sampling), np.fft.fftfreq(arr.shape[1], sampling))
v_int_x = np.real(np.fft.ifft2((np.fft.fft2(arr[1]) * k[0]) / (2*np.pi * 1j * k_sq)))
v_int_y = np.real(np.fft.ifft2((np.fft.fft2(arr[0]) * k[0]) / (2*np.pi * 1j * k_sq)))
v_int_fs = v_int_x + v_int_y
return v_int_fs
k_int = int_2d_fourier(k, sampling)
不幸的是,如下图所示,在k
突然变化的位置,结果不是很准确,该图显示了k
和{{1 }}。
任何想法如何提高准确性?有没有办法使它完全相同?
答案 0 :(得分:1)
我实际上找到了解决方案。积分本身会产生非常准确的结果。 但是,numpy的梯度函数会计算出二阶准确的中心差,这意味着梯度本身已经是一个近似值。
用诸如2D高斯的分析公式替换上面的问题时,您可以解析地计算导数。集成此分析得出的函数时,误差约为10 ^ -10(取决于高斯宽度,这可能导致混叠效应)。
长话短说:上面建议的集成功能按预期工作!