Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB中微分实现的差异_Arrays_Matlab_Gradient_Differentiation - Fatal编程技术网

Arrays MATLAB中微分实现的差异

Arrays MATLAB中微分实现的差异,arrays,matlab,gradient,differentiation,Arrays,Matlab,Gradient,Differentiation,我试图找到特定点的(数值)曲率。我将数据存储在一个数组中,我基本上希望找到每个独立点的局部曲率。我在MATLAB中搜索了三种不同的实现:diff、gradient和del2 如果我的阵列名称为arr,我尝试了以下实现: curvature = diff(diff(arr)); curvature = diff(arr,2); curvature = gradient(gradient(arr)); curvature = del2(arr); 前两个似乎输出相同的值。这是有道理的,因为它

我试图找到特定点的(数值)曲率。我将数据存储在一个数组中,我基本上希望找到每个独立点的局部曲率。我在MATLAB中搜索了三种不同的实现:
diff
gradient
del2

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

curvature = diff(diff(arr));
curvature = diff(arr,2); 
curvature = gradient(gradient(arr)); 
curvature = del2(arr); 
前两个似乎输出相同的值。这是有道理的,因为它们本质上是相同的实现。但是,
gradient
del2
实现相互之间以及从
diff
中给出不同的值

我无法从文档中准确地了解这些实现是如何工作的。我的猜测是,其中一些是某种类型的双边导数,而其中一些不是双边导数。另一件让我困惑的事情是,我当前的实现只使用来自
arr
的数据
arr
是我的y轴数据,x轴基本上是时间。这些函数是否默认为步长为1或类似的值

如果有帮助的话,我希望实现只使用前面的数组元素获取当前点的曲率。在上下文中,我的数据是这样的,基于当前点未来数据的曲率计算对我的目的没有用处

tl;博士我需要一个严格的曲率点实现,只使用数据的左边的点

编辑:多亏了下面的答案,我可以更好地理解这一点。这就是我所指的:

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

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


即使如此,我仍然想知道如何进行“左手”计算。

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

梯度和del2是导数。当然,您可以使用diff通过将差值除以步长来近似导数。通常,台阶的间距是相等的,但不一定要相等。这就回答了为什么计算中不使用x的问题。我的意思是,你的x不是均匀分布的

那个么,为什么梯度给我们一个和原始数组长度相同的数组呢?手册中明确说明了如何处理边界

沿矩阵边缘的渐变值使用单侧差计算,以便

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

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

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

好的,你真的想要arr上每个点的曲率还是二阶导数?他们非常不同

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

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

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

可能与此相关,谢谢您的详细回答!那么梯度是一种“单边”差异吗?这是什么意思?我特别想要一个点上的二重导数或曲率(既然你提到了,我将不得不更深入地研究数学),但只使用当前点左侧的点。当我调用gradient(gradient(arr))时,它是使用您引用的第一个实现,还是第二个实现?例如,如何进行左侧渐变?请参见答案更新。曲率不是二阶导数。曲率的公式在我所附的维基百科链接中提到。当然,您可以看到,二阶导数用于计算曲率。MATLAB中的“梯度”函数使用中心差,例如(x(3)-(x1))/2,并且它还需要等距h。在边界上,中心差没有足够的点,因为我们没有x(-1)!,因此,它只能使用一侧的两个相邻点计算差值。与使用左右两个点的中心差异相比。我想这就是为什么它被称为“单边”。