我有一个问题:
我想要对一个二维数组进行积分,基本上是对梯度算子进行反转。
假设我的数组非常简单,如下所示:
然后我将我的向量场构建为一个复数值数组(x-向量=实部,y-向量=虚部):
所以,例如实部看起来像这样
现在我计算梯度:
然后我使用傅里叶变换来反转它,使用以下函数:
很不幸,在
假设我的数组非常简单,如下所示:
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]
所以,例如实部看起来像这样
![enter image description here](https://istack.dev59.com/769Mp.webp)
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
和k_int
的水平线轮廓。
有什么办法可以提高精度吗?是否有一种方法可以使其完全相同?