python - 整合二维矢量场阵列(反转 np.gradient)

标签 python arrays numpy gradient integrate

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

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

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

然后我将我的矢量场构造为一个复值数组(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

有什么提高准确性的想法吗?有没有办法让它完全一样?

最佳答案

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

当您将上述问题替换为解析公式(例如 2D 高斯)时,可以解析地计算导数。对这个解析导出的函数进行积分时,误差大约为 10^-10(取决于高斯宽度,这会导致混叠效应)。

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

关于python - 整合二维矢量场阵列(反转 np.gradient),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498672/

相关文章:

python - 属性错误 : module 'sys' has no attribute 'maxint'

python - 为什么我的模型在第二个时期过度拟合?

python - 使用 pexpect 获取 'ls' 命令的输出

c - 为数组成员设置计时器

c - 将数组传递给函数的语法

python - 如何使用列上的尾随行对同一列进行计算 | Pandas python

python - django - 1.选择 2.过滤 3.然后剪切

arrays - 从矩阵matlab中选取最有值(value)的元素

python - 将 DataFrame 中的列分为 10 个百分位数

python - 在 numpy 中重复 matlab dyadup