При возникновении некоторых проблем может потребоваться вывод из алгоритма оптимизации в каждой итерации. Например, может потребоваться найти последовательность точек, которую вычисляет алгоритм, и построить график этих точек. Для этого создайте функцию вывода, которую функция оптимизации вызывает в каждой итерации. Дополнительные сведения и синтаксис см. в разделе Синтаксис функции вывода и функции печати.
В этом примере используется подход на основе решателя для функций вывода. Подход, основанный на проблемах, см. в разделе Функция вывода для оптимизации на основе проблем.
Обычно решатели, которые используют выходную функцию, могут принимать нелинейные функции в качестве входных данных. Определить, какие решатели могут использовать функцию вывода, можно в разделе Опции (Options) справочных страниц функций.
В этом примере показано, как использовать функцию вывода для контроля fmincon процесс решения для решения связанной нелинейной задачи оптимизации. В конце каждого fmincon итерация, функция вывода выполняет следующее:
Постройте график текущей точки.
Сохранение текущей точки и соответствующего ей значения целевой функции в переменной с именем historyи сохранить текущее направление поиска в переменной с именем searchdir. Направление поиска - это вектор, который указывает в направлении от текущей точки к следующей.
Кроме того, чтобы сделать историю доступной за пределами fmincon , выполните оптимизацию внутри вложенной функции, которая вызывает fmincon и возвращает переменные выходной функции. Дополнительные сведения об этом методе передачи информации см. в разделе Передача дополнительных параметров. runfmincon вспомогательная функция в конце этого примера содержит вложенный вызов функции.
Проблема заключается в минимизации функции
4x1x2 + 2x2 + 1)
с учетом нелинейных ограничений неравенства
objfun функция вложена в runfmincon реализует целевую функцию. 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]
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).
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
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