2016-05-09 3 views
1

В MATLAB, я должен вычислить символический градиент функции f(x) с x вектор размерности 5.Matlab градиент

x=sym('x',[1,2,3,4,5]); 
c=[1 2 4 3 5 3 4 5 4 3 4 34 5 6]; 
d=[1 0 1 0 0 1 1 1 0 0 0 1 0 1]; 
f [email protected](x) sum(-0.5*log(x(1))+x(1)*0.5*(x(2+d)/x(1)-c).^2-log(exp(x(2+d).*c+x(4+d))./(exp(x(2)*c+x(4))+exp(x(3)*c+x(5))))) 
grad_f=gradient(f) 

Сообщение об ошибке:

Не определено оператором «» 'для входных аргументов типа' function_handle '.

Ошибка в градиенте> parse_inputs (строка 146) f = f. ';

Ошибка в градиенте (строка 48) [f, ndim, loc, rflag] = parse_inputs (f, varargin);

Вы знаете, где ошибка?

+0

Документы подразумевают, что функция «градиент» принимает числовой вектор, а не дескриптор функции: http://www.mathworks.com/help/matlab/ref/gradient.html – Dan

+1

@ Dan существует символический градиент ' – Yvon

+3

Символьный' градиент' принимает символическую функцию 'f' в качестве входного. ваше определение является дескриптором функции. попробуйте удалить '@ (x)' http://www.mathworks.com/help/symbolic/gradient.html – Yvon

ответ

0

Я думаю, вы должны указать переменную symbolc вы хотите градиент рассчитываться для, и указать е по-разному (посмотрите на пример): https://de.mathworks.com/help/symbolic/gradient.html

Они определяют F без использования функции ручки , потому что символическая панель инструментов позаботится об этом сама по себе.

также взглянуть на этот вопрос: Matlab gradient and hessian computation for symbolic vector function


EDIT: Черт, слишком поздно, после того, как комментарий Ивон в :-)

0

Я только смотрел на само сообщение об ошибке здесь. gradient не любит функции ручки как вход.

Если я определяю функцию f как чисто символический без @(x) в передней

f =sum(-0.5*log(x(1))+x(1)*0.5*(x(2+d)/x(1)-c).^2-log(exp(x(2+d).*c+x(4+d))./(exp(x(2)*c+x(4))+exp(x(3)*c+x(5)))))  

затем печатая градиент дает мне 5x1 массив символических выражений.

Смежные вопросы