Это руководство включает несколько примеров, которые показывают, как использовать два нелинейных решателя оптимизации, fminunc
и fmincon
, и как задать опции. Принципы, изложенные в этом руководстве, применяются к другим нелинейным решателям, таким как fgoalattain
, fminimax
, lsqnonlin
, lsqcurvefit
, и fsolve
.
Обучающие примеры охватывают следующие задачи:
Минимизация целевой функции
Минимизация той же функции с дополнительными параметрами
Минимизация целевой функции с ограничением
Получение более эффективного или точного решения путем предоставления градиентов или гессиана, или путем изменения опций
Рассмотрим задачу нахождения минимума функции
Постройте график функции, чтобы увидеть, где она минимизирована.
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, а затем при помощи вложенной функции.
Рассмотрим целевую функцию из предыдущего примера.
Параметризируйте функцию с помощью (a, b, c) следующим образом:
Эта функция является сдвинутой и масштабированной версией исходной целевой функции.
Рассмотрим целевую функцию файла 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
Оба подхода дают одинаковые ответы, поэтому можно использовать тот, который вы находите наиболее удобным.
Рассмотрим предыдущую задачу с ограничением:
Ограничительное множество представляет собой интерьер наклонного эллипса. Просмотрите контуры целевой функции, нанесенные вместе с наклоненным эллипсом.
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
Вы можете решить задачи оптимизации более эффективно и точно, поставляя градиенты. Этот пример, как и предыдущий, решает задачу с ограничениями в неравенстве
Чтобы обеспечить градиент 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
Этот пример продолжает использовать градиенты и решает ту же ограниченную задачу
.
В этом случае вы достигаете более точного решения путем переопределения критериев завершения по умолчанию (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