我有一堆 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
获得均匀间隔网格的算子的一种方法[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.])