Пример для 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')

График показывает, что минимум около точки (-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

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

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

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

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

fmincon алгоритм внутренней точки берет матрицу Гессиана в качестве отдельной функции (не часть целевой функции). Функция Гессиана H (x, lambda) оценивает Гессиан функции Лагранжа; смотрите Гессиан для 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;

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

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

Похожие темы