Выходные функции для Optimization Toolbox™

Что такое выходная функция?

Для некоторых задач может потребоваться вывод от алгоритма оптимизации при каждой итерации. Например, можно хотеть найти последовательность точек, которую вычисляет алгоритм, и построить график этих точек. Для этого создайте выходную функцию, которую оптимизационная функция вызывает при каждой итерации. Для получения дополнительной информации и синтаксиса см. Выходную функцию и Функцию построения графика синтаксис.

Этот пример использует основанный на решателе подход для выходных функций. Для основанного на проблеме подхода смотрите Выходную функцию для основанной на проблеме оптимизации.

Обычно решатели, которые используют выходную функцию, могут принимать нелинейные функции как входы. Можно определить, какие решатели могут использовать выходную функцию, заглянув в раздел Options страниц с описанием функции.

Использование выходной функции

В этом примере показано, как использовать выходную функцию для мониторинга fmincon процесс решения для решения ограниченной нелинейной задачи оптимизации. В конце каждого fmincon итерация, выходная функция делает следующее:

  • Постройте график текущей точки.

  • Сохраните текущую точку и ее соответствующее значение целевой функции в переменной с именем history, и сохраните текущее направление поиска в переменной с именем searchdir. Направление поиска является вектором, который указывает в направлении от текущей точки к следующей.

Кроме того, чтобы сделать историю доступной за пределами fmincon function, выполните оптимизацию внутри вложенной функции, которая вызывает fmincon и возвращает переменные выходной функции. Для получения дополнительной информации об этом способе передачи информации смотрите Передачу Дополнительных Параметров. The runfmincon вспомогательная функция в конце этого примера содержит вложенный вызов функции.

Функции, определяющие цели и ограничения

Задача состоит в том, чтобы минимизировать функцию

f(x)=exp(x1)(4x12+2x22+4x1x2+2x2+1)

удовлетворяющее нелинейным ограничениям неравенства

x1+x2-x1x23/2x1x2-10.

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

Figure contains an axes. The axes with title Sequence of Points Computed by fmincon contains 18 objects of type line, text.

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

Похожие темы