MATLAB中差异化实现的差异

时间:2017-12-08 02:25:53

标签: arrays matlab gradient differentiation

我试图在特定点找到(数值)曲率。我有数据存储在数组中,我基本上想要在每个单独的点找到局部曲率。我已经四处搜索,并在MATLAB中找到了三种不同的实现:diffgradientdel2

如果我的数组名称为arr,我尝试了以下实现:

curvature = diff(diff(arr));
curvature = diff(arr,2); 
curvature = gradient(gradient(arr)); 
curvature = del2(arr); 

前两个似乎输出相同的值。这是有道理的,因为它们基本上是相同的实现。但是,gradientdel2实现会从diff给出彼此不同的值。

我无法从文档中准确地找出实现的工作原理。我的猜测是,其中一些是某种类型的双面导数,其中一些不是双面导数。令我困惑的另一件事是我当前的实现仅使用来自arr的数据。 arr是我的y轴数据,x轴基本上是时间。这些函数默认为1或类似的大小吗?

如果有帮助,我想要一个仅使用之前的数组元素在当前点获取曲率的实现。对于上下文,我的数据是基于当前点的未来数据的曲率计算对我的目的不是有用的。

tl; dr我在点实现中需要一个严格的曲率,它只使用点左边的数据。

编辑:由于下面的答案,我更好地了解基于此的情况。这就是我所指的:

  

gradient计算内部数据点的中心差异。   例如,考虑具有单位间隔数据A的矩阵   水平梯度G =梯度(A)。内部梯度值,   G(:,j),是

     

G(:,j) = 0.5*(A(:,j+1) - A(:,j-1));下标j在2之间变化   和N-1,N =大小(A,2)。

即便如此,我仍然想知道如何做一个"左手"计算

1 个答案:

答案 0 :(得分:1)

diff只是arr中两个相邻元素之间的差异,这正是为什么你丢失一个元素使用diff一次。例如,数组中的10个元素只有9个差异。

渐变和del2是衍生物。当然,您可以使用差异来通过将差异除以步骤来近似导数。通常步长是等距的,但不一定是这样。这回答了为什么在计算中不使用x的问题。我的意思是,你的x不是均匀间隔的。

那么,为什么渐变给我们一个与原始数组长度相同的数组呢?手册中清楚地解释了如何处理边界,

  

沿着矩阵边缘的梯度值是用单边差异计算的,所以

     

G(:,1)= A(:,2) - A(:,1);

     

G(:,N)= A(:,N) - A(:,N-1);

双梯度和del2不一定相同,尽管它们高度相关。这都是因为你如何计算/近似二阶导数。不同的是,前者通过两次导数来逼近二阶导数而后者直接逼近二阶导数。请参阅帮助手册,记录公式。

好吧,你真的想要arr上每个点的曲率或二阶导数吗?他们是非常不同的。 https://en.wikipedia.org/wiki/Curvature#Precise_definition

您可以使用diff从左侧获取二阶导数。因为diff从右到左取得差异,例如x(2)-x(1),你可以先从左向右翻转x,然后使用diff。一些代码,如

x=fliplr(x)
first=x./h
second=diff(first)./h

其中h是x之间的空格。注意我使用./,它表示h可以是一个数组(即非均匀间隔)。