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

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

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

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

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

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

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

  • Постройте текущую точку.

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

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

Цель и ограничительные функции

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

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

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

x1+x2-x1x23/2x1x2-10.

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

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]

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

Похожие темы