如何编写以下函数,以便在放置变量值之前可以找到渐变

时间:2018-09-29 13:34:56

标签: matlab derivative

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]的数组?

Sample procedure

如您在图片中看到的,我按此顺序想要它。而且我还希望将d用作变量,以便代码可以通用。希望你理解我的问题。

2 个答案:

答案 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。