我有一个1维向量:
p = [1 3 6 10 16 18 29];
laplace = del2(p);
px= gradient(p);
pxx=gradient(px);
由于它是一维的,矢量的拉普拉斯必须等于梯度的梯度。然而,他们给出了完全不同的结果。
laplace = 0.2500 0.2500 0.2500 0.5000 -1.0000 2.2500 5.5000
pxx = 0.5000 0.7500 1.2500 0.2500 0.7500 3.5000 4.5000
答案 0 :(得分:1)
更简单的例子:
gradient(gradient((1:10).^2))
1, 1.5, 2, 2, 2, 2, 2, 2, 1.5, 1
和
4*del2((1:10).^2)
2, 2, 2, 2, 2, 2, 2, 2, 2, 2
因此,gradient
会对第一个和最后一个值进行不同的处理(因此gradient(gradient())
具有不同的前两个和后两个条目,del2
线性推断。)
del2
必须乘以4才能与gradient(gradient())
如果您查看代码(edit del2
或edit gradient
),您会看到渐变对内部点采取对称差异(将前一个点和下一个点相等)。 del2
做同样但只做一次。因此gradient(gradient())
会更加平滑。
但是,如果我使用del2
这样的内核来平滑[0.25 0.5 0.25]
的结果,那么我可以得到与gradient(gradient())
完全相同的结果。
p = [1 3 6 10 16 18 29];
conv(4 * del2(p), [0.5,1,0.5] / 2, 'same')
0.75, 1, 1.25, 0.25, 0.75, 9, 13.25
gradient(gradient(p))
0.5, 0.75, 1.25, 0.25, 0.75, 3.5, 4.5
请注意,中央三个值相同,每边的两个边框值不同,因为边框的处理方式不同。