Для некоторых задач может потребоваться вывод от алгоритма оптимизации при каждой итерации. Например, можно хотеть найти последовательность точек, которую вычисляет алгоритм, и построить график этих точек. Для этого создайте выходную функцию, которую оптимизационная функция вызывает при каждой итерации. Для получения дополнительной информации и синтаксиса см. Выходную функцию и Функцию построения графика синтаксис.
Этот пример использует основанный на решателе подход для выходных функций. Для основанного на проблеме подхода смотрите Выходную функцию для основанной на проблеме оптимизации.
Обычно решатели, которые используют выходную функцию, могут принимать нелинейные функции как входы. Можно определить, какие решатели могут использовать выходную функцию, заглянув в раздел Options страниц с описанием функции.
В этом примере показано, как использовать выходную функцию для мониторинга fmincon
процесс решения для решения ограниченной нелинейной задачи оптимизации. В конце каждого fmincon
итерация, выходная функция делает следующее:
Постройте график текущей точки.
Сохраните текущую точку и ее соответствующее значение целевой функции в переменной с именем history
, и сохраните текущее направление поиска в переменной с именем searchdir
. Направление поиска является вектором, который указывает в направлении от текущей точки к следующей.
Кроме того, чтобы сделать историю доступной за пределами fmincon
function, выполните оптимизацию внутри вложенной функции, которая вызывает fmincon
и возвращает переменные выходной функции. Для получения дополнительной информации об этом способе передачи информации смотрите Передачу Дополнительных Параметров. The runfmincon
вспомогательная функция в конце этого примера содержит вложенный вызов функции.
Задача состоит в том, чтобы минимизировать функцию
удовлетворяющее нелинейным ограничениям неравенства
The objfun
функция, вложенная в runfmincon
реализует целевую функцию. The confun
функция, вложенная в runfmincon
реализует функцию ограничения.
Чтобы получить решение задачи и увидеть историю fmincon
итерации, вызовите runfmincon
функция.
[xsol,fval,history,searchdir] = runfmincon;
Max Line search Directional First-order Iter F-count f(x) constraint steplength derivative optimality Procedure 0 3 1.8394 0.5 Infeasible start point 1 6 1.85127 -0.09197 1 0.109 0.778 2 9 0.300167 9.33 1 -0.117 0.313 Hessian modified twice 3 12 0.529835 0.9209 1 0.12 0.232 4 16 0.186965 -1.517 0.5 -0.224 0.13 5 19 0.0729085 0.3313 1 -0.121 0.054 6 22 0.0353323 -0.03303 1 -0.0542 0.0271 7 25 0.0235566 0.003184 1 -0.0271 0.00587 8 28 0.0235504 9.035e-08 1 -0.0146 8.51e-07 Active inequalities (to within options.ConstraintTolerance = 1e-06): lower upper ineqlin ineqnonlin 1 2
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.
Выходная функция создает график точек, вычисленных fmincon
. Каждая точка помечается своим номером итерации. Оптимальная точка происходит в восьмой итерации. Последние две точки последовательности настолько близки, что перекрываются.
Область выхода history
- структура, содержащая два поля.
disp(history)
x: [9x2 double] fval: [9x1 double]
The fval
поле в history
содержит значения целевой функции, соответствующие последовательности точек fmincon
вычисляет.
disp(history.fval)
1.8394 1.8513 0.3002 0.5298 0.1870 0.0729 0.0353 0.0236 0.0236
Эти же значения отображаются в итерационном выходе в столбце с заголовком f(x)
.
The x
область history
содержит последовательность точек, которые fmincon
вычисляет.
disp(history.x)
-1.0000 1.0000 -1.3679 1.2500 -5.5708 3.4699 -4.8000 2.2752 -6.7054 1.2618 -8.0679 1.0186 -9.0230 1.0532 -9.5471 1.0471 -9.5474 1.0474
The searchdir
выходы содержат направления поиска для fmincon
при каждой итерации. Направление поиска является вектором, указывающим от точки, вычисленной при текущей итерации, до точки, вычисленной при следующей итерации.
disp(searchdir)
-0.3679 0.2500 -4.2029 2.2199 0.7708 -1.1947 -3.8108 -2.0268 -1.3625 -0.2432 -0.9552 0.0346 -0.5241 -0.0061 -0.0003 0.0003
Следующий код создает runfmincon
функция, которая содержит outfun
выходная функция, objfun
целевой функции и confun
нелинейная функция ограничения как вложенные функции.
function [xsol,fval,history,searchdir] = runfmincon % Set up shared variables with outfun history.x = []; history.fval = []; searchdir = []; % Call optimization x0 = [-1 1]; options = optimoptions(@fmincon,'OutputFcn',@outfun,... 'Display','iter','Algorithm','active-set'); [xsol,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options); function stop = outfun(x,optimValues,state) stop = false; switch state case 'init' hold on case 'iter' % Concatenate current point and objective function % value with history. x must be a row vector. history.fval = [history.fval; optimValues.fval]; history.x = [history.x; x]; % Concatenate current search direction with % searchdir. searchdir = [searchdir;... optimValues.searchdirection']; plot(x(1),x(2),'o'); % Label points with iteration number and add title. % Add .15 to x(1) to separate label from plotted 'o'. text(x(1)+.15,x(2),... num2str(optimValues.iteration)); title('Sequence of Points Computed by fmincon'); case 'done' hold off otherwise end end 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); end function [c, ceq] = confun(x) % Nonlinear inequality constraints c = [1.5 + x(1)*x(2) - x(1) - x(2); -x(1)*x(2) - 10]; % Nonlinear equality constraints ceq = []; end end