我有一堆 x 和 y 值形式的不均匀采样(一维)数据,我想对其进行拉普拉斯算子。在 numpy/scipy 中是否有一种简单的方法可以做到这一点?
我正在考虑采用梯度的梯度,但这不会引入伪影,即使在均匀采样的数据中也是如此?例如,给定数据 0,0,0,4,8,8,8
和 1d 拉普拉斯运算符 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.])
我是一名优秀的程序员,十分优秀!