MatLab - 梯度命令

3

我正在尝试学习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会给出这两个输入值的错误答案呢?
如果有人能解释一下,我将非常感激!
3个回答

4
实际上,结果是正确的。当...
>> x0 = 0
>> f(x0) 
    -1

使得梯度确实为3。同样地,对于x=10,由于f(10)=119f(9)=98,因此梯度确实为21。
这些结果与解析结果之间的差异是因为梯度是导数的数值逼近,并带有相关的边界问题。
进一步考虑如果您提供的数据点更少,比如只有两个点-该算法将给出梯度作为点之间差除以间隔。这就是在边界处发生的情况。

好的,但是函数的导数是f'(x) = 2*x +2。所以f'(0) = 2。这是沿着x方向的方向变化。 - Kristian
1
但是导数与数值梯度不同! - jmetz
在MathWorks网站上解释梯度命令时,它说:“当F是一个向量时,FX = gradient(F)返回F的一维数值梯度。FX对应于∂F/∂x,即x(水平)方向上的差异。”因此,由于∂F/∂x = 2*x + 2,我必须承认我仍然不明白值3和21来自哪里。 - Kristian
2
啊,我现在明白了。梯度只是根据我指定的间隔进行近似计算,对吗?所以如果我的x值更接近,那么计算出来的值就更准确? - Kristian
实际上,梯度帮助页面上的第一件事是“GRADIENT近似梯度”。 - jmetz
显示剩余2条评论

1

我认为你正在面临一个边界问题。扩展x,你就会得到正确的答案。记住你正在进行数值计算。


谢谢。是的,我现在明白了:)。非常感谢你的帮助! - Kristian

0

help gradient 命令未提供足够的实现细节。

但是如果您键入 edit gradient,它将显示 m 文件源代码 gradient.m,在那里您可以看到它是如何计算的:

  • 数组末端的单侧差分。

  • 其他所有点的中心差分。

(使用更高精度的模板可以获得更好的效果。特别是您可能希望对两端的项使用二阶精度的模板,以保持与二阶精度的中心差分一致。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接