Найти минимум ограниченной нелинейной многовариантной функции
Решатель нелинейного программирования.
Находит минимум проблемы, указанный в
=0A⋅x≤bAeq⋅x=beqlb≤x≤ub,
b и beq являются векторами, A и Aeq являются матрицами, c (x) и ceq (x) являются функциями, которые возвращают векторы, и f (x) является функцией, которая возвращает скаляр. f (x), c (x) и ceq (x) могут быть нелинейными функциями.
x, lb и ub могут быть переданы в виде векторов или матриц; см. Аргументы матрицы.
начинается в x = fmincon(fun,x0,A,b)x0 и пытается найти минимизатор x функции, описанной в fun с учетом линейных неравенств A*x ≤ b. x0 может быть скаляром, вектором или матрицей.
Примечание
В разделе Передача дополнительных параметров (Passing Extra Parameters) объясняется, как передать дополнительные параметры целевой функции и, при необходимости, нелинейным функциям ограничения.
определяет набор нижних и верхних границ для конструктивных переменных в x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)x, чтобы решение всегда находилось в диапазоне lb ≤ x ≤ ub. Если равенства отсутствуют, установите Aeq = [] и beq = []. Если x(i) не ограничен ниже, набор lb(i) = -Inf, и если x(i) не ограничен выше, набор ub(i) = Inf.
Примечание
Если указанные входные границы для проблемы противоречивы, fmincon выдает ошибку. В этом случае вывод x является x0 и fval является [].
Для значения по умолчанию 'interior-point' алгоритм, fmincon наборы компонентов x0 которые нарушают границы lb ≤ x ≤ ub, или равны границе, внутренней части связанной области. Для 'trust-region-reflective' алгоритм, fmincon устанавливает нарушающие компоненты во внутреннюю часть связанной области. Для других алгоритмов fmincon устанавливает нарушающие компоненты в ближайшую границу. Компоненты, соответствующие границам, не изменяются. См. раздел Итерации могут нарушать ограничения.
Найдите минимальное значение функции Розенброка при наличии линейного ограничения неравенства.
Установка целевой функции fun быть функцией Розенброка. Хорошо известно, что функцию Розенброка трудно минимизировать. Его минимальное целевое значение равно 0 в точке (1,1). Дополнительные сведения см. в разделе Решение ограниченной нелинейной проблемы на основе решателя.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
Найти минимальное значение, начиная с точки [-1,2], ограничено ≤1 x (1) + 2x (2). Выразить это ограничение в формеAx <= b взяв A = [1,2] и b = 1. Обратите внимание, что это ограничение означает, что решение не будет находиться в неограниченном решении (1,1), поскольку в этой точке = 3 > 1.
x0 = [-1,2]; A = [1,2]; b = 1; x = fmincon(fun,x0,A,b)
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 = 1×2
0.5022 0.2489
Найдите минимальное значение функции Розенброка, если есть и линейное ограничение неравенства, и линейное ограничение равенства.
Установка целевой функции fun быть функцией Розенброка.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
Найти минимальное значение, начиная с точки [0.5,0], ограничено наличием 2) ≤1 + x (2) = 1.
Выражение линейного ограничения неравенства в форме A*x <= b взяв A = [1,2] и b = 1.
Выражение ограничения линейного равенства в форме Aeq*x = beq взяв Aeq = [2,1] и beq = 1.
x0 = [0.5,0]; A = [1,2]; b = 1; Aeq = [2,1]; beq = 1; x = fmincon(fun,x0,A,b,Aeq,beq)
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 = 1×2
0.4149 0.1701
Найдите минимум целевой функции при наличии ограничивающих ограничений.
Целевая функция является простой алгебраической функцией двух переменных.
fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
Посмотрите на область, где имеет положительные значения, 1 и 2.
lb = [0,0]; ub = [1,2];
Проблема не имеет линейных ограничений, поэтому установите эти аргументы в [].
A = []; b = []; Aeq = []; beq = [];
Попробуйте начальную точку в середине региона.
x0 = (lb + ub)/2;
Решите проблему.
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2
1.0000 2.0000
Другая начальная точка может привести к другому решению.
x0 = x0/5; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2
10-6 ×
0.4000 0.4000
Чтобы определить, какое решение лучше, см. раздел Получение значения целевой функции.
Найти минимум функции, подверженной нелинейным ограничениям
Найдите точку, в которой функция Розенброка минимизирована в пределах круга, также подверженного ограничениям.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
Загляни в регион
,.
lb = [0,0.2]; ub = [0.5,0.8];
Также посмотрите в окружность с центром [1/3,1/3] с радиусом 1/3. Скопируйте следующий код в файл по пути MATLAB ® circlecon.m.
% Copyright 2015 The MathWorks, Inc. function [c,ceq] = circlecon(x) c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2; ceq = [];
Нет линейных ограничений, поэтому задайте для этих аргументов значение [].
A = []; b = []; Aeq = []; beq = [];
Выберите начальную точку, удовлетворяющую всем ограничениям.
x0 = [1/4,1/4];
Решите проблему.
nonlcon = @circlecon; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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 =
0.5000 0.2500
Задайте опции для просмотра итераций по мере их появления и использования другого алгоритма.
Наблюдение за fmincon процесс решения, установите Display опция для 'iter'. Также попробуйте 'sqp' алгоритм, который иногда быстрее или точнее, чем по умолчанию 'interior-point' алгоритм.
options = optimoptions('fmincon','Display','iter','Algorithm','sqp');
Найдите минимум функции Розенброка на диске устройства,.
Сначала создайте функцию, представляющую нелинейное ограничение. Сохранить как файл с именем unitdisk.m на пути MATLAB ®.
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];
Создайте оставшиеся спецификации проблемы. Затем выполнить fmincon.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; A = []; b = []; Aeq = []; beq = []; lb = []; ub = []; nonlcon = @unitdisk; x0 = [0,0]; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Iter Func-count Fval Feasibility Step Length Norm of First-order
step optimality
0 3 1.000000e+00 0.000e+00 1.000e+00 0.000e+00 2.000e+00
1 12 8.913011e-01 0.000e+00 1.176e-01 2.353e-01 1.107e+01
2 22 8.047847e-01 0.000e+00 8.235e-02 1.900e-01 1.330e+01
3 28 4.197517e-01 0.000e+00 3.430e-01 1.217e-01 6.172e+00
4 31 2.733703e-01 0.000e+00 1.000e+00 5.254e-02 5.705e-01
5 34 2.397111e-01 0.000e+00 1.000e+00 7.498e-02 3.164e+00
6 37 2.036002e-01 0.000e+00 1.000e+00 5.960e-02 3.106e+00
7 40 1.164353e-01 0.000e+00 1.000e+00 1.459e-01 1.059e+00
8 43 1.161753e-01 0.000e+00 1.000e+00 1.754e-01 7.383e+00
9 46 5.901601e-02 0.000e+00 1.000e+00 1.547e-02 7.278e-01
10 49 4.533081e-02 2.898e-03 1.000e+00 5.393e-02 1.252e-01
11 52 4.567454e-02 2.225e-06 1.000e+00 1.492e-03 1.679e-03
12 55 4.567481e-02 4.406e-12 1.000e+00 2.095e-06 1.502e-05
13 58 4.567481e-02 0.000e+00 1.000e+00 2.203e-12 1.406e-05
Local minimum possible. Constraints satisfied.
fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are
satisfied to within the value of the constraint tolerance.
x =
0.7864 0.6177
Включить оценку градиента в целевую функцию для более быстрых или надежных вычислений.
Включите оценку градиента как условный вывод в файл целевой функции. Дополнительные сведения см. в разделе Включение градиентов и гессенов. Целевой функцией является функция Розенброка,

который имеет градиент
![$$\nabla f(x) = \left[ {\begin{array}{*{20}{c}}
{ - 400\left( {{x_2} - x_1^2} \right){x_1} - 2\left( {1 - {x_1}} \right)}\\
{200\left( {{x_2} - x_1^2} \right)}
\end{array}} \right].$$](../../examples/optim/win64/IncludeGradientExample_eq09200576097084404414.png)
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end
Сохранить этот код как файл с именем rosenbrockwithgrad.m на пути MATLAB ®.
Создайте параметры для использования градиента целевой функции.
options = optimoptions('fmincon','SpecifyObjectiveGradient',true);
Создайте другие входные данные для проблемы. Затем позвоните fmincon.
fun = @rosenbrockwithgrad; x0 = [-1,2]; A = []; b = []; Aeq = []; beq = []; lb = [-2,-2]; ub = [2,2]; nonlcon = []; x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
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 =
1.0000 1.0000
Решите ту же задачу, что и в опциях Nondefault, используя структуру задачи вместо отдельных аргументов.
Создайте параметры и структуру проблемы. Имена полей и обязательные поля см. в разделе «Проблема».
options = optimoptions('fmincon','Display','iter','Algorithm','sqp'); problem.options = options; problem.solver = 'fmincon'; problem.objective = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; problem.x0 = [0,0];
Функция нелинейных ограничений unitdisk появляется в конце этого примера. Включить функцию нелинейных ограничений в problem.
problem.nonlcon = @unitdisk;
Решите проблему.
x = fmincon(problem)
Iter Func-count Fval Feasibility Step Length Norm of First-order
step optimality
0 3 1.000000e+00 0.000e+00 1.000e+00 0.000e+00 2.000e+00
1 12 8.913011e-01 0.000e+00 1.176e-01 2.353e-01 1.107e+01
2 22 8.047847e-01 0.000e+00 8.235e-02 1.900e-01 1.330e+01
3 28 4.197517e-01 0.000e+00 3.430e-01 1.217e-01 6.172e+00
4 31 2.733703e-01 0.000e+00 1.000e+00 5.254e-02 5.705e-01
5 34 2.397111e-01 0.000e+00 1.000e+00 7.498e-02 3.164e+00
6 37 2.036002e-01 0.000e+00 1.000e+00 5.960e-02 3.106e+00
7 40 1.164353e-01 0.000e+00 1.000e+00 1.459e-01 1.059e+00
8 43 1.161753e-01 0.000e+00 1.000e+00 1.754e-01 7.383e+00
9 46 5.901601e-02 0.000e+00 1.000e+00 1.547e-02 7.278e-01
10 49 4.533081e-02 2.898e-03 1.000e+00 5.393e-02 1.252e-01
11 52 4.567454e-02 2.225e-06 1.000e+00 1.492e-03 1.679e-03
12 55 4.567481e-02 4.406e-12 1.000e+00 2.095e-06 1.501e-05
13 58 4.567481e-02 0.000e+00 1.000e+00 2.159e-09 1.511e-05
Local minimum possible. Constraints satisfied.
fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are
satisfied to within the value of the constraint tolerance.
x = 1×2
0.7864 0.6177
Итеративный дисплей и решение такие же, как в опциях Nondefault.
Следующий код создает unitdisk функция.
function [c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1; ceq = []; end
Звонить fmincon с fval вывод для получения значения целевой функции в решении.
В примере Свернуть с ограничивающими ограничениями (Minimize with Bound Constraints) показаны два решения. Что лучше? Выполните пример, запрашивающий fval выход, а также решение.
fun = @(x)1+x(1)./(1+x(2)) - 3*x(1).*x(2) + x(2).*(1+x(1)); lb = [0,0]; ub = [1,2]; A = []; b = []; Aeq = []; beq = []; x0 = (lb + ub)/2; [x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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 = 1×2
1.0000 2.0000
fval = -0.6667
Запустить проблему с другой начальной точкой x0.
x0 = x0/5; [x2,fval2] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
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.
x2 = 1×2
10-6 ×
0.4000 0.4000
fval2 = 1.0000
Это решение имеет значение целевой функции fval2 = 1, что выше первого значения fval = –0.6667. Первое решение x имеет меньшее значение локальной минимальной целевой функции.
Чтобы легко проверить качество решения, запросите exitflag и output выходы.
Настройте задачу минимизации функции Розенброка на диске устройства,.
Сначала создайте функцию, представляющую нелинейное ограничение. Сохранить как файл с именем unitdisk.m на пути MATLAB ®.
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];
Создайте оставшиеся спецификации проблемы.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; nonlcon = @unitdisk; A = []; b = []; Aeq = []; beq = []; lb = []; ub = []; x0 = [0,0];
Звонить fmincon с использованием fval, exitflag, и output выходы.
[x,fval,exitflag,output] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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 =
0.7864 0.6177
fval =
0.0457
exitflag =
1
output =
struct with fields:
iterations: 24
funcCount: 84
constrviolation: 0
stepsize: 6.9162e-06
algorithm: 'interior-point'
firstorderopt: 2.4373e-08
cgiterations: 4
message: '...'
bestfeasible: [1x1 struct]
exitflag стоимость 1 указывает, что решение является локальным минимумом.
output структура выводит несколько статистических данных о процессе решения. В частности, он даёт количество итераций в output.iterations, количество оценок функций в output.funcCountи осуществимость в output.constrviolation.
fmincon дополнительно возвращает несколько выходных данных, которые можно использовать для анализа сообщаемого решения.
Настройте задачу минимизации функции Rosenbrock на диске устройства. Сначала создайте функцию, представляющую нелинейное ограничение. Сохранить как файл с именем unitdisk.m на пути MATLAB ®.
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];
Создайте оставшиеся спецификации проблемы.
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2; nonlcon = @unitdisk; A = []; b = []; Aeq = []; beq = []; lb = []; ub = []; x0 = [0,0];
Запросить все fmincon выходы.
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
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 =
0.7864 0.6177
fval =
0.0457
exitflag =
1
output =
struct with fields:
iterations: 24
funcCount: 84
constrviolation: 0
stepsize: 6.9162e-06
algorithm: 'interior-point'
firstorderopt: 2.4373e-08
cgiterations: 4
message: '...'
bestfeasible: [1x1 struct]
lambda =
struct with fields:
eqlin: [0x1 double]
eqnonlin: [0x1 double]
ineqlin: [0x1 double]
lower: [2x1 double]
upper: [2x1 double]
ineqnonlin: 0.1215
grad =
-0.1911
-0.1501
hessian =
497.2903 -314.5589
-314.5589 200.2392
lambda.ineqnonlin результат показывает, что нелинейное ограничение активно в решении, и дает значение связанного множителя Лагранжа.
grad выходные данные дают значение градиента целевой функции в решении x.
hessian выход описан в fmincon Hessian.
fun - Функция минимизацииФункция для минимизации, заданная как дескриптор функции или имя функции. fun - функция, принимающая вектор или массив; x и возвращает действительный скаляр f, целевая функция, оцененная на x.
Определить fun как дескриптор функции для файла:
x = fmincon(@myfun,x0,A,b)
где myfun является функцией MATLAB ®, такой как
function f = myfun(x) f = ... % Compute function value at x
Можно также указать fun как дескриптор функции для анонимной функции:
x = fmincon(@(x)norm(x)^2,x0,A,b);
Если можно вычислить градиент fun и SpecifyObjectiveGradient параметр имеет значение true, как установлено
options = optimoptions('fmincon','SpecifyObjectiveGradient',true)fun должен возвращать вектор градиента g(x) во втором выходном аргументе.
Если вы также можете вычислить матрицу Гессена и HessianFcn параметр имеет значение 'objective' через optimoptions и Algorithm опция - 'trust-region-reflective', fun должен возвращать гессенское значение H(x)симметричная матрица в третьем выходном аргументе. fun может дать разреженный гессен. Дополнительные сведения см. в описании алгоритмов fminunc trust-region или fmincon trust-region-reflective.
Если вы также можете вычислить матрицу Гессена и Algorithm параметр имеет значение 'interior-point', есть другой способ передать гессен fmincon. Дополнительные сведения см. в разделе Hessian для алгоритма внутренней точки fmincon. Пример использования символьных математических Toolbox™ для вычисления градиента и гессена см. в разделе Расчет градиентов и гессенов с помощью символьных математических Toolbox™.
interior-point и trust-region-reflective алгоритмы позволяют подавать гессенскую функцию умножения. Эта функция даёт результат гессеновского векторного произведения без непосредственного вычисления гессенского. Это может сэкономить память. См. раздел Функция умножения Гессена.
Пример: fun = @(x)sin(x(1))*cos(x(2))
Типы данных: char | function_handle | string
x0 - Начальная точкаНачальная точка, заданная как вещественный вектор или вещественный массив. Решатели используют количество элементов в и размер, x0 для определения количества и размера переменных, которые fun принимает.
'interior-point' алгоритм - если HonorBounds опция - true (по умолчанию), fmincon сброс x0 компоненты, находящиеся на границах или за их пределами lb или ub к значениям строго между границами.
'trust-region-reflective' алгоритм - fmincon сбрасывает неосуществимые x0 компоненты должны быть выполнимыми по отношению к границам или линейным равенствам.
'sqp', 'sqp-legacy', или 'active-set' алгоритм - fmincon сброс x0 компоненты, которые находятся вне границ значений соответствующих границ.
Пример: x0 = [1,2,3,4]
Типы данных: double
A - Линейные ограничения неравенстваЛинейные ограничения неравенства, заданные как вещественная матрица. A является Mоколо-N матрица, где M - количество неравенств, и N - количество переменных (количество элементов в x0). По большим проблемам проходите A в виде разреженной матрицы.
A кодирует M линейные неравенства
A*x <= b,
где x - вектор столбца N переменные x(:), и b - вектор столбца с M элементы.
Например, для указания
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,
введите следующие ограничения:
A = [1,2;3,4;5,6]; b = [10;20;30];
Пример: Чтобы указать, что компоненты x суммируются до 1 или менее, используйте A = ones(1,N) и b = 1.
Типы данных: double
b - Линейные ограничения неравенстваЛинейные ограничения неравенства, заданные как действительный вектор. b является M-элементный вектор, связанный с A матрица. Если вы проходите b как вектор строки, решатели внутренне преобразуют b к вектору столбца b(:). По большим проблемам проходите b как разреженный вектор.
b кодирует M линейные неравенства
A*x <= b,
где x - вектор столбца N переменные x(:), и A является матрицей размера Mоколо-N.
Например, рассмотрим эти неравенства:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30.
Задайте неравенства, введя следующие ограничения.
A = [1,2;3,4;5,6]; b = [10;20;30];
Пример: Чтобы указать, что компоненты x суммируются до 1 или менее, используйте A = ones(1,N) и b = 1.
Типы данных: double
Aeq - Линейные ограничения равенстваЛинейные ограничения равенства, заданные как вещественная матрица. Aeq является Meоколо-N матрица, где Me - количество уравнений, и N - количество переменных (количество элементов в x0). По большим проблемам проходите Aeq в виде разреженной матрицы.
Aeq кодирует Me линейные равенства
Aeq*x = beq,
где x - вектор столбца N переменные x(:), и beq - вектор столбца с Me элементы.
Например, для указания
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,
введите следующие ограничения:
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Пример: Чтобы указать, что компоненты x суммируются до 1, используйте Aeq = ones(1,N) и beq = 1.
Типы данных: double
beq - Линейные ограничения равенстваЛинейные ограничения равенства, заданные как действительный вектор. beq является Me-элементный вектор, связанный с Aeq матрица. Если вы проходите beq как вектор строки, решатели внутренне преобразуют beq к вектору столбца beq(:). По большим проблемам проходите beq как разреженный вектор.
beq кодирует Me линейные равенства
Aeq*x = beq,
где x - вектор столбца N переменные x(:), и Aeq является матрицей размера Meоколо-N.
Например, рассмотрим следующие равенства:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20.
Задайте равенства, введя следующие ограничения.
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Пример: Чтобы указать, что компоненты x суммируются до 1, используйте Aeq = ones(1,N) и beq = 1.
Типы данных: double
lb - Нижние границыНижние границы, определяемые как вещественный вектор или вещественный массив. Если количество элементов в x0 равно количеству элементов в lb, то lb указывает, что
x(i) >= lb(i) для всех i.
Если numel(lb) < numel(x0), то lb указывает, что
x(i) >= lb(i) для 1 <= i <= numel(lb).
Если элементов в меньше lb чем в x0решатели выдают предупреждение.
Пример: Чтобы указать, что все компоненты x являются положительными, используйте lb = zeros(size(x0)).
Типы данных: double
ub - Верхние границыВерхние границы, заданные как вещественный вектор или вещественный массив. Если количество элементов в x0 равно количеству элементов в ub, то ub указывает, что
x(i) <= ub(i) для всех i.
Если numel(ub) < numel(x0), то ub указывает, что
x(i) <= ub(i) для 1 <= i <= numel(ub).
Если элементов в меньше ub чем в x0решатели выдают предупреждение.
Пример: Чтобы указать, что все компоненты x меньше 1, используйте ub = ones(size(x0)).
Типы данных: double
nonlcon - Нелинейные ограниченияНелинейные ограничения, указанные как дескриптор функции или имя функции. nonlcon - функция, принимающая вектор или массив; x и возвращает два массива, c(x) и ceq(x).
c(x) - массив нелинейных ограничений неравенства в x. fmincon попытки удовлетворить
c(x) <= 0 для всех записей c.
ceq(x) - массив нелинейных ограничений равенства в x. fmincon попытки удовлетворить
ceq(x) = 0 для всех записей ceq.
Например,
x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)
где mycon является функцией MATLAB, такой как
function [c,ceq] = mycon(x) c = ... % Compute nonlinear inequalities at x. ceq = ... % Compute nonlinear equalities at x.
SpecifyConstraintGradient опция - true, как установленоoptions = optimoptions('fmincon','SpecifyConstraintGradient',true)nonlcon должен также возвращать в третьем и четвертом выходных аргументах, GC, градиент c(x), и GCeq, градиент ceq(x). GC и GCeq может быть разреженным или плотным. Если GC или GCeq является большим, с относительно небольшим количеством ненулевых записей, экономит время работы и память в interior-point путем представления их в виде разреженных матриц. Дополнительные сведения см. в разделе Нелинейные ограничения.
Типы данных: char | function_handle | string
options - Варианты оптимизацииoptimoptions | структура, такая как optimset прибыльОпции оптимизации, указанные как выходные данные optimoptions или структура, такая как optimset возвращает.
Некоторые опции применимы ко всем алгоритмам, а другие актуальны для конкретных алгоритмов. Дополнительные сведения см. в разделе Справочник по опциям оптимизации.
Некоторые опции отсутствуют в optimoptions дисплей. Эти параметры выделены курсивом в следующей таблице. Дополнительные сведения см. в разделе Параметры просмотра.
| Все алгоритмы | |
Algorithm | Выберите алгоритм оптимизации:
Сведения о выборе алгоритма см. в разделе Выбор алгоритма.
При выборе |
CheckGradients | Сравнение предоставленных пользователем производных (градиентов цели или ограничений) с производными с конечной разницей. Варианты: Для |
ConstraintTolerance | Допуск для нарушения ограничения, положительный скаляр. Значение по умолчанию: Для |
| Диагностика | Отображение диагностической информации о функции, которая должна быть свернута или решена. Варианты: |
| DiffMaxChange | Максимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: |
| DiffMinChange | Минимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: |
Display | Уровень отображения (см. Итерационный просмотр):
|
FiniteDifferenceStepSize | Коэффициент размера шага скаляра или вектора для конечных разностей. При установке
sign′(x) = sign(x) кроме sign′(0) = 1. Центральными конечными различиями являются
FiniteDifferenceStepSize расширяется до вектора. Значение по умолчанию: sqrt(eps) для прямых конечных разностей, и eps^(1/3) для центральных конечных разностей.
Для |
FiniteDifferenceType | Конечные различия, используемые для оценки градиентов:
Для |
| FunValCheck | Проверьте допустимость значений целевой функции. Настройка по умолчанию, |
MaxFunctionEvaluations | Максимально допустимое число оценок функций, положительное целое число. Значение по умолчанию для всех алгоритмов, кроме Для |
MaxIterations | Максимально допустимое число итераций, положительное целое число. Значение по умолчанию для всех алгоритмов, кроме Для |
OptimalityTolerance | Допуск окончания для оптимальности первого порядка (положительный скаляр). Значение по умолчанию: Для |
OutputFcn | Укажите одну или несколько пользовательских функций, вызываемых функцией оптимизации в каждой итерации. Передача дескриптора функции или массива ячеек дескрипторов функции. Значение по умолчанию - нет ( |
PlotFcn | Отображает различные показатели прогресса во время выполнения алгоритма; выбрать из предопределенных графиков или написать свой собственный. Передача имени встроенной функции графика, дескриптора функции или массива ячеек имен встроенных функций графика или дескрипторов функций. Для пользовательских функций печати передайте дескрипторы функций. Значение по умолчанию - нет (
Пользовательские функции печати используют тот же синтаксис, что и функции вывода. См. раздел Функции вывода для оптимизации Toolbox™ и Функция вывода и синтаксис функции печати. Для |
SpecifyConstraintGradient | Градиент для функций нелинейных ограничений, определенных пользователем. Если установлено значение по умолчанию, Для |
SpecifyObjectiveGradient | Градиент для целевой функции, определенной пользователем. См. описание Для |
StepTolerance | Допуск окончания на Для |
TypicalX | Типичный |
UseParallel | Когда |
| Алгоритм, отражающий область доверия | |
FunctionTolerance | Допуск окончания для значения функции, положительный скаляр. Значение по умолчанию: Для |
HessianFcn | Если Для |
HessianMultiplyFcn | Функция умножения Гессена, заданная как дескриптор функции. Для крупномасштабных структурированных задач эта функция вычисляет матричное изделие Гессена W = hmfun(Hinfo,Y) где Первый аргумент совпадает с третьим аргументом, возвращаемым целевой функцией [f,g,Hinfo] = fun(x)
Примечание Для использования См. раздел Функция умножения Гессена. Пример см. в разделе Минимизация с помощью плотных структурированных гессенских линейных уравнений. Для |
| HessPattern | Узор разреженности гессена для конечных разностей. Набор Использовать Если структура неизвестна, не устанавливайте |
| MaxPCGIter | Максимальное количество предварительно обработанных итераций сопряженного градиента (PCG), положительный скаляр. Значение по умолчанию: |
| PrecondBandWidth | Верхняя полоса пропускания устройства предварительного кондиционирования для PCG, неотрицательное целое число. По умолчанию используется диагональное предварительное кондиционирование (верхняя полоса пропускания 0). При некоторых проблемах увеличение полосы пропускания уменьшает количество итераций PCG. Настройка |
SubproblemAlgorithm | Определяет способ вычисления шага итерации. Значение по умолчанию, |
| TolPCG | Допуск окончания для итерации PCG, положительный скаляр. Значение по умолчанию: |
| Алгоритм активного набора | |
FunctionTolerance | Допуск окончания для значения функции, положительный скаляр. Значение по умолчанию: Для |
| MaxSQPIter | Максимальное допустимое число итераций SQP, положительное целое число. Значение по умолчанию: |
| RelLineSrchBnd | Относительная граница (действительное неотрицательное скалярное значение) на длине шага поиска строки. Полное смещение в x удовлетворяет | Δx (i ) | ≤ relLineSrchBnd· max (| x (i) |, | typicalx (i) |). Эта опция обеспечивает управление величиной смещений в x для случаев, когда решатель выполняет шаги, которые считаются слишком большими. По умолчанию границы отсутствуют ( |
| RelLineSrchBndDuration | Число итераций, для которых граница указана в |
| TolConSQP | Допуск окончания для нарушения ограничения SQP внутренней итерации, положительный скаляр. Значение по умолчанию: |
| Алгоритм внутренней точки | |
BarrierParamUpdate | Выбирает способ
Этот выбор может повлиять на скорость и сходимость решателя, но эффект предсказать нелегко. |
HessianApproximation | Выбирает способ
Примечание Использовать Для |
HessianFcn | Если Для |
HessianMultiplyFcn | Пользовательская функция, которая дает гессеново-кратно-векторное произведение (см. Гессенская функция умножения). Передайте дескриптор функции. Примечание Для использования Для |
HonorBounds | Дефолт Для |
| InitBarrierParam | Начальное значение барьера, положительный скаляр. Иногда это может помочь попробовать значение выше значения по умолчанию |
| InitTrustRegionRadius | Начальный радиус области доверия, положительный скаляр. При плохо масштабированных проблемах это может помочь выбрать значение, меньшее, чем значение по умолчанию , где n - количество переменных. |
| MaxProjCGIter | Допуск (критерий остановки) для числа проецируемых сопряженных итераций градиента; это внутренняя итерация, а не количество итераций алгоритма. Это положительное целое число имеет значение по умолчанию |
ObjectiveLimit | Допуск (критерий остановки), являющийся скаляром. Если значение целевой функции ниже |
ScaleProblem |
Для |
SubproblemAlgorithm | Определяет способ вычисления шага итерации. Значение по умолчанию, |
| TolProjCG | Относительный допуск (критерий остановки) для алгоритма проецированного сопряженного градиента; это для внутренней итерации, а не для итерации алгоритма. Этот положительный скаляр имеет значение по умолчанию |
| TolProjCGAbs | Абсолютный допуск (критерий остановки) для алгоритма проекции сопряженного градиента; это для внутренней итерации, а не для итерации алгоритма. Этот положительный скаляр имеет значение по умолчанию |
| Устаревшие алгоритмы SQP и SQP | |
ObjectiveLimit | Допуск (критерий остановки), являющийся скаляром. Если значение целевой функции ниже |
ScaleProblem |
Для |
Пример: options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true)
problem - Структура проблемыСтруктура проблемы, заданная как структура со следующими полями:
| Имя поля | Вход |
|---|---|
| Целевая функция |
| Начальная точка для x |
| Матрица для линейных ограничений неравенства |
| Вектор для линейных ограничений неравенства |
| Матрица для линейных ограничений равенства |
| Вектор для линейных ограничений равенства |
lb | Вектор нижних границ |
ub | Вектор верхних границ |
| Функция нелинейных ограничений |
| 'fmincon' |
| Параметры, созданные с помощью optimoptions |
Вы должны предоставить, по крайней мере, objective, x0, solver, и options поля в problem структура.
Типы данных: struct
x - РешениеРешение, возвращаемое в виде вещественного вектора или вещественного массива. Размер x совпадает с размером x0. Как правило, x является локальным решением проблемы, когда exitflag является положительным. Сведения о качестве решения см. в разделе Когда решатель добьется успеха.
fval - Значение целевой функции при решенииЗначение целевой функции в решении, возвращаемое как вещественное число. Как правило, fval = fun(x).
exitflag - Причина fmincon остановленныйПричина fmincon остановлено, возвращено как целое число.
Все алгоритмы: | |
| Показатель оптимальности первого порядка был меньше |
| Превышено число итераций |
| Останавливается функцией вывода или функцией графика. |
| Выполнимая точка не найдена. |
Все алгоритмы, кроме | |
| Изменение в |
| |
| Изменение значения целевой функции было меньше |
| |
| Величина направления поиска была меньше 2 * |
| Величина направленной производной в направлении поиска была меньше 2 * |
| |
| Целевая функция при текущей итерации была ниже |
output - Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенная в виде структуры с полями:
iterations | Количество выполненных итераций |
funcCount | Количество оценок функций |
lssteplength | Размер шага поиска строки относительно направления поиска ( |
constrviolation | Максимум функций ограничения |
stepsize | Длина последнего смещения в |
algorithm | Используемый алгоритм оптимизации |
cgiterations | Общее количество итераций PCG ( |
firstorderopt | Мера оптимальности первого порядка |
bestfeasible | Наилучшая (наименьшая целевая функция) возможная точка. Структура со следующими полями:
Если выполнимая точка не найдена, |
message | Выйти из сообщения |
lambda - Множители лагранжа в решенииМножители лагранжа в решении, возвращаемые как структура с полями:
grad - Градиент в раствореГрадиент в решении, возвращенный как действительный вектор. grad дает градиент fun в точке x(:).
hessian - Приблизительный гессенскийПриблизительный Гессен, возвращенный в виде вещественной матрицы. Для значения hessian, см. Гессенский вывод.
fmincon - метод на основе градиента, предназначенный для работы над проблемами, в которых функции цели и ограничения являются непрерывными и имеют непрерывные первые производные.
Для 'trust-region-reflective' алгоритм, необходимо указать градиент в fun и установите 'SpecifyObjectiveGradient' опция для true.
'trust-region-reflective' алгоритм не допускает равных верхних и нижних границ. Например, если lb(2)==ub(2), fmincon дает следующую ошибку:
Equal upper and lower bounds not permitted in trust-region-reflective algorithm. Use either interior-point or SQP algorithms instead.
Есть два различных синтаксиса для прохождения гессена, и есть два разных синтаксиса для прохождения HessianMultiplyFcn функция; один для trust-region-reflective, и еще один для interior-point. Смотрите «Включая гессенов.»
Для trust-region-reflective, гессен лагранжиана такой же, как гессен объективной функции. Вы передаете этот гессен как третий вывод целевой функции.
Для interior-point, гессен лагранжиана включает в себя множители Лагранжа и гессенов нелинейных функций ограничения. Вы передаете гессен как отдельную функцию, которая учитывает обе текущие точки x и структуру множителя Лагранжа lambda.
Когда проблема неосуществима, fmincon пытается минимизировать максимальное значение ограничения.
fmincon использует гессен в качестве необязательного ввода. Этот гессен является матрицей вторых производных лагранжиана (см. Уравнение 1), а именно:
| +∑λi∇2ceqi (x). | (1) |
Для получения подробной информации о том, как поставить гессен trust-region-reflective или interior-point алгоритмы, смотри «Включая гессенов.»
active-set и sqp алгоритмы не принимают входной гессен. Они вычисляют квазиньютоновское приближение к гессенскому лагранжиану.
interior-point алгоритм имеет несколько вариантов для 'HessianApproximation' вариант; см. раздел Выбор входного гессенского приближения для внутренней точки fmincon:
'bfgs' — fmincon вычисляет гессен по плотному квази-ньютоновскому приближению. Это гессенское приближение по умолчанию.
'lbfgs' — fmincon вычисляет гессен по ограниченно-запоминающему масштабному квази-ньютоновскому приближению. Используется память по умолчанию - 10 итераций.
{'lbfgs',positive integer} — fmincon вычисляет гессен по ограниченно-запоминающему масштабному квази-ньютоновскому приближению. Положительное целое число указывает, сколько прошлых итераций следует запомнить.
'finite-difference' — fmincon вычисляет гессеново-кратное векторное произведение по конечным разностям градиента (градиентов). Необходимо указать градиент целевой функции, а также градиенты нелинейных ограничений (если они существуют). Установите 'SpecifyObjectiveGradient' опция для true и, если применимо, 'SpecifyConstraintGradient' опция для true. Необходимо установить 'SubproblemAlgorithm' кому 'cg'.
interior-point и trust-region-reflective алгоритмы позволяют подавать гессенскую функцию умножения. Эта функция даёт результат гессеновского-временно-векторного произведения, не вычисляя гессенского напрямую. Это может сэкономить память. Дополнительные сведения см. в разделе Функция умножения гессена.
Для получения справки по выбору алгоритма см. fmincon Алгоритмы. Чтобы задать алгоритм, используйте optimoptions создать optionsи используйте 'Algorithm' пара имя-значение.
В остальной части этого раздела приведены краткие сводки или указатели на информацию о каждом алгоритме.
Этот алгоритм описан в fmincon Interior Point Algorithm. Более подробное описание приведено в [1], [41] и [9].
fmincon 'sqp' и 'sqp-legacy' алгоритмы аналогичны 'active-set' алгоритм, описанный в разделе Оптимизация активного набора. Алгоритм SQP fmincon описывает основные отличия. Таким образом, эти различия заключаются в следующем:
fmincon использует метод последовательного квадратичного программирования (SQP). В этом методе функция решает подпроблему квадратичного программирования (QP) на каждой итерации. fmincon обновляет оценку гессена лагранжиана при каждой итерации с использованием формулы BFGS (см. fminunc и ссылки [7] и [8]).
fmincon выполняет поиск строки, используя функцию качества, аналогичную функции, предложенной [6], [7] и [8]. Подпроблема QP решается с использованием стратегии активного набора, аналогичной описанной в [5]. Алгоритм активного набора fmincon подробно описывает этот алгоритм.
Дополнительные сведения об используемом алгоритме см. также в разделе Реализация SQP.
'trust-region-reflective' алгоритм является методом области доверия подпространства и основан на способе Ньютона с внутренним отражением, описанном в [3] и [4]. Каждая итерация включает в себя приблизительное решение большой линейной системы методом предварительно кондиционированных сопряженных градиентов (PCG). См. описания методов сопряженного градиента «область доверия» и «предварительно кондиционированный» в fmincon «Алгоритм отражения области доверия».
Задача «Оптимизировать интерактивный редактор» обеспечивает визуальный интерфейс для fmincon.
[1] Бэрд, R. H., Дж. К. Гильберт и Дж. Носедэл. «Метод доверительной области, основанный на методах внутренних точек для нелинейного программирования». Математическое программирование, том 89, № 1, 2000, стр. 149-185.
[2] Берд, Р. Х., Мэри Э. Хрибар и Хорхе Нокедаль. «Алгоритм внутренней точки для крупномасштабного нелинейного программирования». Журнал СИАМ по оптимизации, том 9, № 4, 1999, стр. 877-900.
[3] Коулман, Т. Ф. и Я. Ли. «Подход» Внутренняя область, область доверия «для нелинейной минимизации с учетом ограничений». Журнал СИАМ по оптимизации, том 6, 1996, стр. 418-445.
[4] Коулман, Т. Ф. и Я. Ли. «О сходимости отражающих методов Ньютона для масштабной нелинейной минимизации, зависящей от границ». Математическое программирование, том 67, номер 2, 1994, стр. 189-224.
[5] Жабры, P. E., В. Мюррей и М. Х. Райт. Практическая оптимизация, Лондон, Академическая пресса, 1981 год.
[6] Хан, С. П. «Глобально конвергентный метод нелинейного программирования». Журнал теории и приложений оптимизации, том 22, 1977, стр. 297.
[7] Пауэлл, М. Дж. Д. «Быстрый алгоритм для нелинейно ограниченных вычислений оптимизации». Численный анализ, ред. Г. А. Уотсон, лекционные записки по математике, Спрингер-Верлаг, т. 630, 1978.
[8] Пауэлл, М. Дж. Д. «Сходимость методов переменной метрики для нелинейно ограниченных вычислений оптимизации». Нелинейное программирование 3 (О. Л. Мангасариан, Р. Р. Мейер, и С. М. Робинсон, ред.), Академическая пресса, 1978.
[9] Вальс, Р. А., Дж. Л. Моралес, Дж. Нокедаль и Д. Орбан. «Внутренний алгоритм нелинейной оптимизации, объединяющий этапы поиска строк и области доверия». Математическое программирование, том 107, № 3, 2006, стр. 391-408.
Примечания и ограничения по использованию:
fmincon поддерживает генерацию кода с помощью codegen (Кодер MATLAB), функционируют или приложение MATLAB Coder™. Вы должны сделать, чтобы Кодер MATLAB лицензировал, чтобы сгенерировать код.
Целевое оборудование должно поддерживать стандартные вычисления с плавающей запятой с двойной точностью. Невозможно создать код для вычислений с одной точностью или фиксированной точкой.
Цели создания кода не используют те же библиотеки математических ядер, что и решатели MATLAB. Поэтому решения для генерации кода могут отличаться от решений для решающих устройств, особенно для плохо оговоренных задач.
Весь код для генерации должен быть кодом MATLAB. В частности, нельзя использовать пользовательскую функцию черного ящика в качестве целевой функции для fmincon. Вы можете использовать coder.ceval для вычисления пользовательской функции, кодированной в C или C++. Однако пользовательская функция должна вызываться в функции MATLAB.
fmincon не поддерживает problem аргумент для создания кода.
[x,fval] = fmincon(problem) % Not supportedНеобходимо указать целевую функцию и любую нелинейную функцию ограничения с помощью дескрипторов функций, а не строк или имен символов.
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported % Not supported: fmincon('fun',...) or fmincon("fun",...)
Все fmincon входные матрицы, такие как A, Aeq, lb, и ub должно быть полным, а не разреженным. Можно преобразовать разреженные матрицы в полные с помощью full функция.
lb и ub аргументы должны иметь то же количество записей, что и x0 аргумент или должен быть пустым [].
Для оптимизации кода с использованием встраиваемых процессоров также требуется лицензия Embedded Coder ®.
Необходимо включить параметры для fmincon и укажите их с помощью optimoptions. Опции должны включать Algorithm опция, значение 'sqp' или 'sqp-legacy'.
options = optimoptions('fmincon','Algorithm','sqp'); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
Создание кода поддерживает следующие опции:
Algorithm - Должно быть 'sqp' или 'sqp-legacy'
ConstraintTolerance
FiniteDifferenceStepSize
FiniteDifferenceType
MaxFunctionEvaluations
MaxIterations
ObjectiveLimit
OptimalityTolerance
ScaleProblem
SpecifyConstraintGradient
SpecifyObjectiveGradient
StepTolerance
TypicalX
В созданном коде ограничена проверка параметров на наличие ошибок. Рекомендуемый способ обновления опции - использовать optimoptions, не точечная нотация.
opts = optimoptions('fmincon','Algorithm','sqp'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
Не загружать параметры из файла. Это может привести к сбою при создании кода. Вместо этого создайте параметры в коде.
Обычно при указании неподдерживаемого параметра этот параметр игнорируется при создании кода. Однако если функция графика или функция вывода задаются с помощью точечной нотации, создание кода может привести к ошибке. Для обеспечения надежности укажите только поддерживаемые параметры.
Поскольку функции вывода и функции печати не поддерживаются, fmincon не возвращает флаг выхода -1.
Код, сгенерированный из fmincon не содержит bestfeasible поле в возвращенном output структура.
Пример см. в разделе Создание кода для основ оптимизации.
Для параллельного выполнения установите 'UseParallel' опция для true.
options = optimoptions('solvername','UseParallel',true)
Дополнительные сведения см. в разделе Использование параллельных вычислений на панели инструментов оптимизации.
fminbnd | fminsearch | fminunc | Оптимизировать | optimoptions
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.