Рассмотрите проблему нахождения множества значений [x 1, x 2], который решает
(1) |
Чтобы решить эту двумерную проблему, запишите файл, который возвращает значение функции. Затем вызовите стандартную программу безусловной минимизации fminunc
.
Этот код поставляется с тулбоксом. Чтобы просмотреть, введите type objfun
:
function f = objfun(x) f = exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);
Установите опции использовать алгоритм 'quasi-newton'
. Установите опции, потому что алгоритм 'trust-region'
требует, чтобы целевая функция включала градиент. Если вы не устанавливаете опции, то, в зависимости от вашей версии MATLAB®, fminunc
может выдать предупреждение.
options = optimoptions(@fminunc,'Algorithm','quasi-newton');
x0 = [-1,1]; % Starting guess [x,fval,exitflag,output] = fminunc(@objfun,x0,options);
Это производит следующий вывод:
Local minimum found. Optimization completed because the size of the gradient is less than the default value of the optimality tolerance.
Просмотрите результаты, включая меру по оптимальности первого порядка в структуре output
.
x,fval,exitflag,output.firstorderopt x = 0.5000 -1.0000 fval = 3.6609e-16 exitflag = 1 ans = 7.3704e-08
exitflag
говорит, сходился ли алгоритм. exitflag = 1
означает, что локальный минимум был найден. Значения exitflags даны на страницах ссылки на функцию.
Структура output
предоставляет больше подробную информацию об оптимизации. Для fminunc
это включает количество итераций в iterations
, количество функциональных оценок в funcCount
, размера последнего шага в stepsize
, мере оптимальности первого порядка (который в этом неограниченном случае является нормой бесконечности градиента в решении) в firstorderopt
, типе алгоритма, используемого в algorithm
и выходном сообщении (причина остановленный алгоритм).