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对这两个输入值给出了错误的答案呢?

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

4

3 回答 3

4

其实结果是对的。什么时候

>> x0 = 0
>> f(x0) 
    -1

这样梯度确实是 3。类似地,对于x=10, asf(10) = 119f(9)=98,所以梯度确实 = 21。

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

进一步考虑如果您提供较少的数据点会发生什么,比如只有两个点 - 该算法将为您提供梯度,即点之间的差异除以间隔。这就是边界上正在发生的事情。

于 2012-08-01T20:58:45.320 回答
1

我认为您正在研究边界问题。展开x,你会得到正确的答案。请记住,您正在执行数值计算

于 2012-08-01T21:02:33.830 回答
0

help gradient命令没有提供足够的实施细节。

但如果你输入edit gradient,它会显示m-file source code gradient.m,你可以在其中看到它是如何计算的:

  • 阵列末端的单边差异。

  • 所有其他点的中心差。

(您可以通过使用更高精度的模板做得更好。特别是您可能希望对末端的项目使用二阶准确模板,以与二阶准确的居中差异保持一致。)

于 2014-08-13T01:54:55.943 回答