Руководство по Optimization Toolbox™

Это руководство включает несколько примеров, которые показывают, как использовать два нелинейных решателя оптимизации, fminunc и fmincon, и как задать опции. Принципы, изложенные в этом руководстве, применяются к другим нелинейным решателям, таким как fgoalattain, fminimax, lsqnonlin, lsqcurvefit, и fsolve.

Обучающие примеры охватывают следующие задачи:

  • Минимизация целевой функции

  • Минимизация той же функции с дополнительными параметрами

  • Минимизация целевой функции с ограничением

  • Получение более эффективного или точного решения путем предоставления градиентов или гессиана, или путем изменения опций

Пример оптимизации без ограничений

Рассмотрим задачу нахождения минимума функции

xexp(-(x2+y2))+(x2+y2)/20.

Постройте график функции, чтобы увидеть, где она минимизирована.

f = @(x,y) x.*exp(-x.^2-y.^2)+(x.^2+y.^2)/20;
fsurf(f,[-2,2],'ShowContours','on')

Figure contains an axes. The axes contains an object of type functionsurface.

График показывает, что минимум находится вблизи точки (-1/2,0).

Обычно вы задаете целевую функцию как файл MATLAB ®. В этом случае функция достаточно проста, чтобы определять как анонимную функцию.

fun = @(x) f(x(1),x(2));

Установите начальную точку для поиска решения.

x0 = [-.5; 0];

Установите опции оптимизации, чтобы использовать fminunc по умолчанию 'quasi-newton' алгоритм. Этот шаг гарантирует, что руководство работает одинаково в каждой версии MATLAB.

options = optimoptions('fminunc','Algorithm','quasi-newton');

Смотрите итерации, когда решатель выполняет свои вычисления.

options.Display = 'iter';

Функции fminunc, нелинейный минимизатор без ограничений.

[x, fval, exitflag, output] = fminunc(fun,x0,options);
                                                        First-order 
 Iteration  Func-count       f(x)        Step-size       optimality
     0           3          -0.3769                         0.339
     1           6        -0.379694              1          0.286  
     2           9        -0.405023              1         0.0284  
     3          12        -0.405233              1        0.00386  
     4          15        -0.405237              1       3.17e-05  
     5          18        -0.405237              1       3.35e-08  

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

Отобразите решение, найденное решателем.

uncx = x
uncx = 2×1

   -0.6691
    0.0000

Просмотрите значение функции в решении.

uncf = fval
uncf = -0.4052

Примеры используют количество вычислений функции как меру эффективности. Просмотрите общее количество вычислений функции.

output.funcCount
ans = 18

Пример оптимизации без ограничений с дополнительными параметрами

Затем передайте дополнительные параметры в качестве дополнительных аргументов целевой функции сначала при помощи файла MATLAB, а затем при помощи вложенной функции.

Рассмотрим целевую функцию из предыдущего примера.

f(x,y)=xexp(-(x2+y2))+(x2+y2)/20.

Параметризируйте функцию с помощью (a, b, c) следующим образом:

f(x,y,a,b,c)=(x-a)exp(-((x-a)2+(y-b)2))+((x-a)2+(y-b)2)/c.

Эта функция является сдвинутой и масштабированной версией исходной целевой функции.

Функция файла MATLAB

Рассмотрим целевую функцию файла MATLAB с именем bowlpeakfun определяется следующим образом.

type bowlpeakfun
function y = bowlpeakfun(x, a, b, c)
%BOWLPEAKFUN Objective function for parameter passing in TUTDEMO.

%   Copyright 2008 The MathWorks, Inc.

y = (x(1)-a).*exp(-((x(1)-a).^2+(x(2)-b).^2))+((x(1)-a).^2+(x(2)-b).^2)/c;

Определите параметры.

a = 2;
b = 3;
c = 10;

Создайте указатель анонимной функции в файл MATLAB.

f = @(x)bowlpeakfun(x,a,b,c)
f = function_handle with value:
    @(x)bowlpeakfun(x,a,b,c)

Функции fminunc чтобы найти минимум.

x0 = [-.5; 0];
options = optimoptions('fminunc','Algorithm','quasi-newton');
[x, fval] = fminunc(f,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 2×1

    1.3639
    3.0000

fval = -0.3840

Вложенная функция

Рассмотрим nestedbowlpeak функция, которая реализует цель как вложенную функцию.

type nestedbowlpeak
function [x,fval] =  nestedbowlpeak(a,b,c,x0,options)
%NESTEDBOWLPEAK Nested function for parameter passing in TUTDEMO.

%   Copyright 2008 The MathWorks, Inc.

[x,fval] = fminunc(@nestedfun,x0,options);  
    function y = nestedfun(x)
      y = (x(1)-a).*exp(-((x(1)-a).^2+(x(2)-b).^2))+((x(1)-a).^2+(x(2)-b).^2)/c;    
    end
end

Параметры (a, b, c) видны вложенной целевой функции nestedfun. Внешняя функция, nestedbowlpeak, вызовы fminunc и передает целевую функцию, nestedfun.

Задайте параметры, начальное предположение и опции:

a = 2;
b = 3;
c = 10;
x0 = [-.5; 0];
options = optimoptions('fminunc','Algorithm','quasi-newton');

Запустите оптимизацию:

[x,fval] =  nestedbowlpeak(a,b,c,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 2×1

    1.3639
    3.0000

fval = -0.3840

Оба подхода дают одинаковые ответы, поэтому можно использовать тот, который вы находите наиболее удобным.

Пример ограниченной оптимизации: Неравенства

Рассмотрим предыдущую задачу с ограничением:

minimize xexp(-(x2+y2))+(x2+y2)/20,

subject to xy/2+(x+2)2+(y-2)2/22.

Ограничительное множество представляет собой интерьер наклонного эллипса. Просмотрите контуры целевой функции, нанесенные вместе с наклоненным эллипсом.

f = @(x,y) x.*exp(-x.^2-y.^2)+(x.^2+y.^2)/20;
g = @(x,y) x.*y/2+(x+2).^2+(y-2).^2/2-2;
fimplicit(g)
axis([-6 0 -1 7])
hold on
fcontour(f)
plot(-.9727,.4685,'ro');
legend('constraint','f contours','minimum');
hold off

Figure contains an axes. The axes contains 3 objects of type implicitfunctionline, functioncontour, line. These objects represent constraint, f contours, minimum.

График показывает, что самое низкое значение целевой функции в эллипсе происходит около нижней правой части эллипса. Перед вычислением нанесенного минимума сделайте предположение в решении.

x0 = [-2 1];

Установите опции оптимизации, чтобы использовать алгоритм внутренней точки и отобразить результаты при каждой итерации.

options = optimoptions('fmincon','Algorithm','interior-point','Display','iter');

Решатели требуют, чтобы нелинейные функции ограничения давали два выхода, один для нелинейных неравенств и один для нелинейных равенств. Чтобы дать оба выходов, запишите ограничение с помощью deal функция.

gfun = @(x) deal(g(x(1),x(2)),[]);

Вызовите нелинейный решатель с ограничениями. Задача не имеет линейных равенств, неравенств или границ, поэтому проходите [] для этих аргументов.

[x,fval,exitflag,output] = fmincon(fun,x0,[],[],[],[],[],[],gfun,options);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       3    2.365241e-01    0.000e+00    1.972e-01
    1       6    1.748504e-01    0.000e+00    1.734e-01    2.260e-01
    2      10   -1.570560e-01    0.000e+00    2.608e-01    9.347e-01
    3      14   -6.629160e-02    0.000e+00    1.241e-01    3.103e-01
    4      17   -1.584082e-01    0.000e+00    7.934e-02    1.826e-01
    5      20   -2.349124e-01    0.000e+00    1.912e-02    1.571e-01
    6      23   -2.255299e-01    0.000e+00    1.955e-02    1.993e-02
    7      26   -2.444225e-01    0.000e+00    4.293e-03    3.821e-02
    8      29   -2.446931e-01    0.000e+00    8.100e-04    4.035e-03
    9      32   -2.446933e-01    0.000e+00    1.999e-04    8.126e-04
   10      35   -2.448531e-01    0.000e+00    4.004e-05    3.289e-04
   11      38   -2.448927e-01    0.000e+00    4.036e-07    8.156e-05

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.

Отобразите решение, найденное решателем.

x
x = 1×2

   -0.9727    0.4686

Просмотрите значение функции в решении.

fval
fval = -0.2449

Просмотрите общее количество вычислений функции.

Fevals = output.funcCount
Fevals = 38

Ограничение неравенства удовлетворяется в решении.

[c, ceq] = gfun(x)
c = -2.4608e-06
ceq =

     []

Поскольку c (x) близко к 0, ограничение активно, что означает, что оно влияет на решение. Вспомните решение без ограничений.

uncx
uncx = 2×1

   -0.6691
    0.0000

Напомните о без ограничений целевой функции.

uncf
uncf = -0.4052

Посмотрите, насколько ограничение двигало решение и увеличивало цель.

fval-uncf
ans = 0.1603

Пример ограниченной оптимизации: пользовательские градиенты

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

minimize xexp(-(x2+y2))+(x2+y2)/20,

subject to xy/2+(x+2)2+(y-2)2/22.

Чтобы обеспечить градиент f (x), чтобы fmincon, запишите целевую функцию в виде файла MATLAB.

type onehump
function [f,gf] = onehump(x)
% ONEHUMP Helper function for Tutorial for the Optimization Toolbox demo

%   Copyright 2008-2009 The MathWorks, Inc.

r = x(1)^2 + x(2)^2;
s = exp(-r);
f = x(1)*s+r/20;

if nargout > 1
   gf = [(1-2*x(1)^2)*s+x(1)/10;
       -2*x(1)*x(2)*s+x(2)/10];
end

Ограничение и его градиент содержатся в файле MATLAB tiltellipse.

type tiltellipse
function [c,ceq,gc,gceq] = tiltellipse(x)
% TILTELLIPSE Helper function for Tutorial for the Optimization Toolbox demo

%   Copyright 2008-2009 The MathWorks, Inc.

c = x(1)*x(2)/2 + (x(1)+2)^2 + (x(2)-2)^2/2 - 2;
ceq = [];

if nargout > 2
   gc = [x(2)/2+2*(x(1)+2);
       x(1)/2+x(2)-2];
   gceq = [];
end

Установите начальную точку для поиска решения.

x0 = [-2; 1];

Установите опции оптимизации, чтобы использовать тот же алгоритм, что и в предыдущем примере, в целях сравнения.

options = optimoptions('fmincon','Algorithm','interior-point');

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

options = optimoptions(options,...
    'SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);

Потому что fmincon не нужно оценивать градиенты, используя конечные различия, решатель должен иметь меньше отсчётов функций. Установите опции, чтобы отобразить результаты при каждой итерации.

options.Display = 'iter';

Вызовите решатель.

[x,fval,exitflag,output] = fmincon(@onehump,x0,[],[],[],[],[],[], ...
                                   @tiltellipse,options);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       1    2.365241e-01    0.000e+00    1.972e-01
    1       2    1.748504e-01    0.000e+00    1.734e-01    2.260e-01
    2       4   -1.570560e-01    0.000e+00    2.608e-01    9.347e-01
    3       6   -6.629161e-02    0.000e+00    1.241e-01    3.103e-01
    4       7   -1.584082e-01    0.000e+00    7.934e-02    1.826e-01
    5       8   -2.349124e-01    0.000e+00    1.912e-02    1.571e-01
    6       9   -2.255299e-01    0.000e+00    1.955e-02    1.993e-02
    7      10   -2.444225e-01    0.000e+00    4.293e-03    3.821e-02
    8      11   -2.446931e-01    0.000e+00    8.100e-04    4.035e-03
    9      12   -2.446933e-01    0.000e+00    1.999e-04    8.126e-04
   10      13   -2.448531e-01    0.000e+00    4.004e-05    3.289e-04
   11      14   -2.448927e-01    0.000e+00    4.036e-07    8.156e-05

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 хорошо оцененные градиенты в предыдущем примере, поэтому итерации в этом примере аналогичны.

Отобразите решение, найденное решателем.

xold = x
xold = 2×1

   -0.9727
    0.4686

Просмотрите значение функции в решении.

minfval = fval
minfval = -0.2449

Просмотрите общее количество вычислений функции.

Fgradevals = output.funcCount
Fgradevals = 14

Сравните это число с количеством вычислений функции без градиентов.

Fevals
Fevals = 38

Пример оптимизации с ограничениями: изменение допусков на разрыв по умолчанию

Этот пример продолжает использовать градиенты и решает ту же ограниченную задачу

minimize xexp(-(x2+y2))+(x2+y2)/20,

subject to xy/2+(x+2)2+(y-2)2/22.

В этом случае вы достигаете более точного решения путем переопределения критериев завершения по умолчанию (options.StepTolerance и options.OptimalityTolerance). Значения по умолчанию для fmincon алгоритм внутренней точки options.StepTolerance = 1e-10 и options.OptimalityTolerance = 1e-6.

Переопределите эти два критерия завершения по умолчанию.

options = optimoptions(options,...
    'StepTolerance',1e-15,...
    'OptimalityTolerance',1e-8);

Вызовите решатель.

[x,fval,exitflag,output] = fmincon(@onehump,x0,[],[],[],[],[],[], ...
                                   @tiltellipse,options);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       1    2.365241e-01    0.000e+00    1.972e-01
    1       2    1.748504e-01    0.000e+00    1.734e-01    2.260e-01
    2       4   -1.570560e-01    0.000e+00    2.608e-01    9.347e-01
    3       6   -6.629161e-02    0.000e+00    1.241e-01    3.103e-01
    4       7   -1.584082e-01    0.000e+00    7.934e-02    1.826e-01
    5       8   -2.349124e-01    0.000e+00    1.912e-02    1.571e-01
    6       9   -2.255299e-01    0.000e+00    1.955e-02    1.993e-02
    7      10   -2.444225e-01    0.000e+00    4.293e-03    3.821e-02
    8      11   -2.446931e-01    0.000e+00    8.100e-04    4.035e-03
    9      12   -2.446933e-01    0.000e+00    1.999e-04    8.126e-04
   10      13   -2.448531e-01    0.000e+00    4.004e-05    3.289e-04
   11      14   -2.448927e-01    0.000e+00    4.036e-07    8.156e-05
   12      15   -2.448931e-01    0.000e+00    4.000e-09    8.230e-07

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.

Чтобы увидеть различия, сделанные новыми допусками, более точно, отобразите больше десятичные числа в решении.

format long

Отобразите решение, найденное решателем.

x
x = 2×1

  -0.972742227363546
   0.468569289098342

Сравните эти значения со значениями в предыдущем примере.

xold
xold = 2×1

  -0.972742694488360
   0.468569966693330

Определите изменение значений.

x - xold
ans = 2×1
10-6 ×

   0.467124813385844
  -0.677594988729435

Просмотрите значение функции в решении.

fval
fval = 
  -0.244893137879894

Посмотрите, насколько улучшилось решение.

fval - minfval
ans = 
    -3.996450220755676e-07

Ответ отрицателен, потому что новое решение меньше.

Просмотрите общее количество вычислений функции.

output.funcCount
ans = 
    15

Сравните это число с количеством вычислений функции в примере, решенном с предоставленными пользователем градиентами и допусками по умолчанию.

Fgradevals
Fgradevals = 
    14

Пример ограниченной оптимизации: поставляемый пользователем Гессиан

Если вы поставляете Гессиана в дополнение к градиенту, решатели являются еще более точными и эффективными.

The fmincon алгоритм внутренней точки принимает матрицу Гессия как отдельную функцию (не часть целевой функции). Гессианская функция H (x, лямбда) оценивает Гессиана Лагранжа; см. Гессиан для fmincon алгоритма внутренней точки.

Решатели вычисляют значения lambda.ineqnonlin и lambda.eqlin; ваша функция Гессиана сообщает решателям, как использовать эти значения.

Этот пример имеет одно ограничение неравенства, поэтому Гессиан задан как заданный в hessfordemo функция.

type hessfordemo
function H = hessfordemo(x,lambda)
% HESSFORDEMO Helper function for Tutorial for the Optimization Toolbox demo

%   Copyright 2008-2009 The MathWorks, Inc.

s = exp(-(x(1)^2+x(2)^2));
H = [2*x(1)*(2*x(1)^2-3)*s+1/10, 2*x(2)*(2*x(1)^2-1)*s;
        2*x(2)*(2*x(1)^2-1)*s, 2*x(1)*(2*x(2)^2-1)*s+1/10];
hessc = [2,1/2;1/2,1];
H = H + lambda.ineqnonlin(1)*hessc;

В порядок, чтобы использовать Hessian, необходимо задать опции соответствующим образом.

options = optimoptions('fmincon',...
    'Algorithm','interior-point',...
    'SpecifyConstraintGradient',true,...
    'SpecifyObjectiveGradient',true,...
    'HessianFcn',@hessfordemo);

Допуски устанавливаются на свои значения по умолчанию, что должно привести к меньшему количеству отсчётов функций. Установите опции, чтобы отобразить результаты при каждой итерации.

options.Display = 'iter';

Вызовите решатель.

[x,fval,exitflag,output] = fmincon(@onehump,x0,[],[],[],[],[],[], ...
                                   @tiltellipse,options);
                                            First-order      Norm of
 Iter F-count            f(x)  Feasibility   optimality         step
    0       1    2.365241e-01    0.000e+00    1.972e-01
    1       3    5.821325e-02    0.000e+00    1.443e-01    8.728e-01
    2       5   -1.218829e-01    0.000e+00    1.007e-01    4.927e-01
    3       6   -1.421167e-01    0.000e+00    8.486e-02    5.165e-02
    4       7   -2.261916e-01    0.000e+00    1.989e-02    1.667e-01
    5       8   -2.433609e-01    0.000e+00    1.537e-03    3.486e-02
    6       9   -2.446875e-01    0.000e+00    2.057e-04    2.727e-03
    7      10   -2.448911e-01    0.000e+00    2.068e-06    4.191e-04
    8      11   -2.448931e-01    0.000e+00    2.001e-08    4.218e-06

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.

Результаты показывают меньше и различных итераций.

Отобразите решение, найденное решателем.

x
x = 2×1

  -0.972742246093537
   0.468569316215571

Просмотрите значение функции в решении.

fval
fval = 
  -0.244893121872758

Просмотрите общее количество вычислений функции.

output.funcCount
ans = 
    11

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

Fgradevals
Fgradevals = 
    14

Похожие темы