Для некоторых проблем вы можете хотеть выход от алгоритма оптимизации в каждой итерации. Например, вы можете хотеть найти последовательность точек, что алгоритм вычисляет, и постройте те точки. Для этого создайте выходную функцию что вызовы функции оптимизации в каждой итерации. Смотрите Синтаксис Выходной функции для деталей и синтаксис.
Этот раздел показывает основанный на решателе подход к выходным функциям. Для подхода, основанного на проблеме смотрите Выходную функцию для Основанной на проблеме Оптимизации.
Обычно решатели, которые могут использовать выходную функцию, являются теми, которые могут взять нелинейные функции в качестве входных параметров. Можно определить, который решатели могут иметь выходную функцию путем взгляда в разделе Options страниц ссылки на функцию, или путем проверки, доступна ли опция Output function в приложении Оптимизации для решателя.
Следующий пример продолжает тот в Нелинейных Ограничениях неравенства, который вызывает функциональный fmincon в командной строке, чтобы решить нелинейную, ограниченную задачу оптимизации. Пример в этом разделе использует файл функции, чтобы вызвать fmincon. Файл также содержит все функции, необходимые для примера, включая:
Целевая функция
Ограничительная функция
Выходная функция, которая записывает историю точек, вычисленных алгоритмом для fmincon. В каждой итерации алгоритма для fmincon, выходная функция:
Строит текущую точку, вычисленную алгоритмом.
Хранит точку и ее соответствующее значение целевой функции в переменной под названием history, и хранит текущее поисковое направление в переменной под названием searchdir. Поисковое направление является вектором, который указывает в направлении от текущей точки до следующей.
Код для файла здесь: Записывание Файла Функции, взятой в качестве примера.
Вы задаете выходную функцию в options, такой как
options = optimoptions(@fmincon,'OutputFcn',@outfun)
где outfun имя выходной функции. Когда вы вызываете функцию оптимизации с options как вход, вызовы функции оптимизации outfun в каждой итерации его алгоритма.
В общем случае outfun может быть любая функция MATLAB®, но в этом примере, это - вложенная функция файла функции, описанного в письменной форме Файл Функции, взятой в качестве примера. Следующий код задает выходную функцию:
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.
% Add .15 to x(1) to separate label from plotted 'o'
text(x(1)+.15,x(2),num2str(optimValues.iteration));
case 'done'
hold off
otherwise
end
endСмотрите Используя Указатели, чтобы Сохранить Параметры функции (MATLAB) для получения дополнительной информации о вложенных функциях.
Аргументы, которые функция оптимизации передает outfun :
x — Точка вычисляется алгоритмом в текущей итерации
optimValues — Структура, содержащая данные из текущей итерации
Пример использует следующие поля optimValues:
optimValues.iteration — Количество текущей итерации
optimValues.fval — Текущее значение целевой функции
optimValues.searchdirection — Текущее поисковое направление
state — Текущее состояние алгоритма ('init', 'interrupt', 'iter', или 'done')
Для получения дополнительной информации об этих аргументах, смотрите Синтаксис Выходной функции.
Создать файл функции для этого примера:
Откройте новый файл в редакторе MATLAB.
Скопируйте и вставьте следующий код в файл:
function [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 = 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Сохраните файл как runfmincon.m в папке на пути MATLAB.
Запускать пример, введите:
[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.031e-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.Выход history структура, которая содержит два поля:
history =
struct with fields:
x: [9×2 double]
fval: [9×1 double]fval поле содержит значения целевой функции, соответствующие последовательности точек, вычисленных fmincon:
history.fval
ans =
1.8394
1.8513
0.3002
0.5298
0.1870
0.0729
0.0353
0.0236
0.0236Это те же значения, отображенные в итеративном выходе в столбце с заголовком f(x).
x поле history содержит последовательность точек, вычисленных алгоритмом:
history.x ans = -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
Этот пример отображает график этой последовательности точек, в которых каждая точка помечена ее номером итерации.

Оптимальная точка происходит в восьмой итерации. Обратите внимание на то, что последние две точки в последовательности так близки, что они накладываются.
Второй выходной аргумент, searchdir, содержит поисковые направления для fmincon в каждой итерации. Поисковое направление является вектором, указывающим от точки, вычисленной в текущей итерации к точке, вычисленной в следующей итерации:
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