Выходные функции

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

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

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

Обычно решатели, которые могут использовать выходную функцию, являются теми, которые могут взять нелинейные функции в качестве входных параметров. Можно определить, который решатели могут иметь выходную функцию путем взгляда в разделе 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')

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

Записывание файла функции, взятой в качестве примера,

Создать файл функции для этого примера:

  1. Откройте новый файл в редакторе MATLAB.

  2. Скопируйте и вставьте следующий код в файл:

    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
  3. Сохраните файл как 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

Похожие темы