集成2D矢量场阵列(逆转np.gradient)

问题描述 投票:3回答:1

我有以下问题:我想集成一个二维数组,所以基本上反转一个渐变运算符。

假设我有一个非常简单的数组如下:

shape = (60, 60)
sampling = 1
k_mesh = np.meshgrid(np.fft.fftfreq(shape[0], sampling), np.fft.fftfreq(shape[1], sampling))

然后我构造我的矢量场作为复值的arreay(x-vector =实部,y-vector =虚部):

k = k_mesh[0] + 1j * k_mesh[1]

所以真实的部分就像这个enter image description here

现在我采用渐变:

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突然发生变化的位置,结果不是很准确,如下图所示,它显示了kk_int的水平线轮廓。

enter image description here

任何想法如何提高准确性?有没有办法让它完全一样?

python arrays numpy gradient integrate
1个回答
1
投票

我实际上找到了解决方案。集成本身产生非常准确的结果。然而,来自numpy的梯度函数计算二阶精确的中心差异,这意味着梯度本身已经是近似值。

当您使用2D高斯分析公式替换上述问题时,可以分析计算导数。当积分该分析导出的函数时,误差大约为10 ^ -10(取决于高斯的宽度,这可能导致混叠效应)。

长话短说:上面提出的集成功能按预期工作!

© www.soinside.com 2019 - 2024. All rights reserved.