Как написать следующую функцию, чтобы можно было найти градиент перед тем, как поместить значения переменных - PullRequest
0 голосов
/ 29 сентября 2018
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 голосов
/ 29 сентября 2018

Для вашей конкретной функции вы можете рассчитать градиент аналитически следующим образом:

g = 2 * (1: длина (xx)). * Xx;

Вы также можете заменить вызовдля длины (xx) на d, если оно задано.

0 голосов
/ 29 сентября 2018

Ваша функция делает именно это:

y = sum(xx.^2 .* (1:numel(xx)));

Производные тогда:

y = 2*xx .* (1:numel(xx)); 

(согласно рукописным уравнениям).


Вам следует избегать использования sum в качестве имени переменной, вы можете видеть выше, что это важная функция, если вы присваиваете значение sum, вы скрываете функцию и больше не можете ее использовать.

...