function [y] = sumsqu(xx)
d = length(xx);
sum = 0;
for ii = 1:d
xi = xx(ii);
sum = sum + ii*xi^2;
end
y = sum;
end
上面是d
变量的代码。每当我调用该函数时,都会得到预期的总和。现在,我想找到函数的数值梯度。但是由于函数正在返回标量值,因此gradient
显然返回0。我该怎么做,gradient
首先以其变量形式求值,然后返回对应于[x1 x2 x3....xd]
的数组?
如您在图片中看到的,我按此顺序想要它。而且我还希望将d
用作变量,以便代码可以通用。希望你理解我的问题。
答案 0 :(得分:1)
您的函数正是这样做的:
y = sum(xx.^2 .* (1:numel(xx)));
则派生为:
y = 2*xx .* (1:numel(xx));
(根据手写的方程式。)
您应该避免使用sum
作为变量名,从上方可以看到它是一个重要的函数,如果您为sum
分配一个值,则会隐藏该函数并且无法再使用它
答案 1 :(得分:1)
对于您的特定功能,您可以像下面这样分析地计算梯度:
g = 2 *(1:length(xx))。* xx;
如果给出了对length(xx)的调用,也可以将其替换为d。