1

我有一堆 x 和 y 值形式的不均匀采样 (1-D) 数据,我想采用拉普拉斯算子。有没有一种简单的方法可以在 numpy/scipy 中做到这一点?

我正在考虑采用梯度的梯度,但这不会引入伪影,即使在均匀采样的数据中也是如此?例如,给定数据0,0,0,4,8,8,8和一维拉普拉斯算子1,-2,1,拉普拉斯算子是0,0,4,0,-4,0,0,但是使用梯度的梯度会产生0,1,2,0,-2,-1,0

4

1 回答 1

1

获得均匀间隔网格的算子的一种方法[1, -2, 1]是使用前向差分方案计算一阶导数,使用后向差分方案计算第二个导数,反之亦然,因为两者产生相同的结果。因此,对于不均匀的网格,一个不错的选择是双向进行,然后平均结果。

假设我们正在查看一个网格点,该hb网格点在前一个网格点之前,hf在下一个网格点之后:

--+----+----+---
 x-hb  x   x+hb 

如果我没有弄乱我的代数,x那么按照上述平均值计算的拉普拉斯算子将是:

(f(x+hf)*(1+hb/hf) + f(x)(2+hb/hf+hf/hb) + f(x-hb)(1+hf/hb)) / (2*hf*hb)

您可以在一维数组上计算它:

def laplacian(x, y):
    x = np.asarray(x)
    y = np.asarray(y)
    hb = x[1:-1] - x[:-2]
    hf = x[2:] - x[1:-1]
    y_hb = y[:-2]
    y_hf = y[2:]
    hb_hf = hb / hf
    hf_hb = hf / hb
    return (y_hf*(1+hb_hf) - y[1:-1]*(2+hb_hf+hf_hb) +
            y_hb*(1+hf_hb)) / 2 / hb / hf

>>> laplacian(range(7), [0,0,0,4,8,8,8])
array([ 0.,  4.,  0., -4.,  0.])
于 2013-08-12T23:38:00.337 回答