我正在尝试学习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会给出这两个输入值的错误答案呢?
如果有人能向我解释这一点,我将不胜感激!
答案 0 :(得分:4)
实际上结果是正确的。什么时候
>> x0 = 0
>> f(x0)
-1
这样,渐变确实是3.同样对于x=10
,f(10) = 119
和f(9)=98
,所以渐变确实是= 21.
这些结果与分析结果之间的差异是因为梯度是具有相关边界问题的导数的数值近似。
进一步考虑如果你给出的数据点较少会发生什么,比如说只有两点 - 算法会给你梯度作为点之间的差值除以间隔。这就是边界发生的事情。
答案 1 :(得分:1)
我认为你在看boundary problem。展开x
,您就会得到正确的答案。请记住,您正在执行数值计算
答案 2 :(得分:0)
help gradient
命令没有提供足够的实现细节。
但如果您输入 edit gradient
,它会显示m
- 文件源代码gradient.m
,您可以在其中查看其计算方式:
阵列两端的单侧差异。
所有其他观点的中心差异。
(您可以通过使用更高精度的模板来做得更好。特别是您可能希望对末端的项目使用二阶精确模板,以便与二阶准确的中心差异保持一致。)