Функция и ее градиент в Matlab

Я работаю над проектом Matlab и хочу сделать градиент следующей функции в Matlab:

f(x) = c^T * x - sum (log(bi - (ai ^ T) * x)).

Где ai^T — строки случайной матрицы A nxm, где n=2 и m=20 c — случайная матрица nx1, а x — тоже случайная nx1. b — случайная матрица mx1. Я сделал следующее, но результаты, которые я получаю, кажутся неправильными.

function gc0 = gc(x, c, b, A)

 for k = 1 : length(A(:,1))
     f1(k) = sum(log(b - A(k,:)'*x(k)));
 end

 gradient(-f1)
 gc0 = c - gradient(f1)';

Есть идеи? Я был бы признателен за вашу помощь, я новичок в Matlab..


person Community    schedule 12.04.2018    source источник
comment
Я предполагаю, что вам нужно b(k). Также A(k,:).' на всякий случай. log не log10 на случай, если он вам понадобится. Вы не транспонируете c и не умножаете на x   -  person Ander Biguri    schedule 12.04.2018
comment
Я не транспонирую c и не умножаю его на x, потому что gc0 — это градиент f, который я хочу сделать, а градиент c^T *x равен c..   -  person    schedule 12.04.2018
comment
Но градиент sum (log(bi - (ai ^ T) * x)) не sum (log(bi - (ai ^ T) * x))   -  person Ander Biguri    schedule 12.04.2018


Ответы (1)


Кажется, ваш цикл содержит ошибку. Глядя на формулу выше, я думаю, что оценка функции должна быть

f1 = c'*x;
for k = 1 : length(A(1,:))
    f1 = f1 - log(b(k) - A(:,k)'*x)
end

Более короткая и быстрая запись для этого в Matlab:

f = c'*x - sum(log(b - A' * x)) ;

Функция «градиент» не вычисляет градиент, который, я думаю, вам нужен: она возвращает разность элементов матрицы, а ваша функция f является скаляром.

Вместо этого я предлагаю вычислять производные символически:

Gradf = c'   + sum( A'./(b - A' * x) );
person Nathan    schedule 18.04.2018