【问题标题】:Differences in Differentiation Implementations in MATLABMATLAB 中微分实现的差异
【发布时间】:2017-12-08 02:25:52
【问题描述】:

我试图找到特定点的(数字)曲率。我将数据存储在一个数组中,我基本上想在每个单独的点找到局部曲率。我四处搜索,在 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 或类似的步长?

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

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

编辑:感谢下面的答案,基于此,我更好地理解了正在发生的事情。这就是我所指的:

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

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

即便如此,我还是想知道如何进行“左手”计算。

【问题讨论】:

标签: arrays matlab gradient differentiation


【解决方案1】:

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

gradient 和 del2 用于导数。当然,您可以使用 diff 通过将差异除以步骤来近似导数。通常,该步骤是等距的,但并非必须如此。这回答了您为什么在计算中不使用 x 的问题。我的意思是,你的 x 不是等间距的也没关系。

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

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

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

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

Double-gradient 和 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 可以是一个数组(即非均匀间隔)。

【讨论】:

  • 感谢您的详细解答!那么渐变是“单面”的区别吗?这是什么意思?我特别想要一个点的双导数或曲率(因为你提到它,我将不得不更深入地研究数学),但只使用当前点左侧的点。当我调用梯度(梯度(arr))时,它是使用您引用的第一个实现还是第二个? IE。如何进行左侧渐变?
  • 请查看答案更新。曲率不是二阶导数。我附加的维基百科链接中提到了曲率的公式。当然,你可以看到二阶导数是用来计算曲率的。
  • MATLAB 中的“梯度”函数使用中心差分,例如 (x(3)-(x1))/2,它还需要均匀间距的 h。在边界上,因为没有 x(-1)!,所以没有足够的中心差点,所以它只能使用一侧的两个相邻点来计算差值。与同时使用左右点的中心差异相比。我想这就是它被称为“单面”的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2019-06-14
相关资源
最近更新 更多