MatLab-梯度命令

MatLab-梯度命令,matlab,gradient,Matlab,Gradient,我正在努力学习MatLab中的各种函数和命令。我有一个关于gradient命令的问题 假设我定义如下: x = 0:1:10; f = @(x) x.^2 + 2*x -1; h = gradient(f(x)) 这就给出了以下向量: h = 3 4 6 8 10 12 14 16 18 20 21 我发现当x在1和9之间时,这些值是正确的,但对于x=0和x=10,这是不正确的。当x=0时,梯度应为2,当x=10时,梯度

我正在努力学习MatLab中的各种函数和命令。我有一个关于
gradient
命令的问题

假设我定义如下:

x = 0:1:10;

f = @(x) x.^2 + 2*x -1;

h = gradient(f(x))
这就给出了以下向量:

h =  3     4     6     8    10    12    14    16    18    20    21
我发现当x在1和9之间时,这些值是正确的,但对于x=0和x=10,这是不正确的。当x=0时,梯度应为2,当x=10时,梯度应为22。那么为什么MatLab对这两个输入值给出了错误的答案呢


如果有人能向我解释这一点,我将不胜感激

实际上结果是正确的。什么时候

>> x0 = 0
>> f(x0) 
    -1
这样梯度实际上是3。类似地,对于
x=10
,由于
f(10)=119
f(9)=98
,因此梯度实际上是=21

这些结果与分析结果之间的差异是因为梯度是导数与相关边界问题的数值近似


进一步考虑,如果你给出的数据点较少,比如说只有两个点,那么会发生什么情况?算法会给出梯度,即点之间的差值除以间隔。这就是边界正在发生的事情

我想你正在看一本书。展开
x
,您将得到正确答案。请记住,您正在执行数值计算,
help gradient
命令没有提供足够的实现细节

但是如果您键入
编辑渐变
,它将显示
m
-文件源代码
gradient.m
,您可以在其中看到它是如何计算的:

  • 数组末端的单侧差异

  • 所有其他点的中心差异


(使用更高精度的模具可以做得更好。尤其是您可能希望对末端的项目使用二阶精度模具,以与二阶精度中心差保持一致。)

好,但函数的导数是f'(x)=2*x+2。所以f’(0)=2。这是沿x方向的方向变化。但是导数与数值梯度不同!在MathWorks网站上解释梯度命令时说:“FX=gradient(F),其中F是一个向量,返回F的一维数值梯度。FX对应于∂F/∂x、 x(水平)方向的差异。”所以∂F/∂x=2*x+2,我必须承认我仍然不明白3和21的值是从哪里来的。啊,我想我现在明白了。梯度只是根据我指定的间隔近似计算的,对吗?因此,如果我把x值放得更近一些,这些值会更正确?实际上,梯度帮助页面上的第一句话是
gradient-Approximate-gradient
。谢谢。是的,我现在明白了:)。非常感谢你的帮助!