Решатель второго порядка конического программирования
coneprog
функция является решателем программирования конуса второго порядка, который находит минимум задачи, заданной
удовлетворяющее ограничениям
f, x, b, beq, lb, и ub являются векторами и A, и Aeq матрицы. Для каждого i матрица A sc (i), векторы d sc (i) и b sc (i) и скалярные γ (i) находятся в ограничении конуса второго порядка, которое вы создаете используяsecondordercone
.
Дополнительные сведения об ограничениях конуса см. в разделе Ограничение конуса второго порядка.
решает задачу программирования конуса второго порядка с ограничениями в x
= coneprog(f
,socConstraints
)socConstraints
закодирован как
A sc (i) = socConstraints.A(i)
b sc (i) = socConstraints.b(i)
d sc (i) = socConstraints.d(i)
γ (<reservedrangesplaceholder1>) = socConstraints.gamma(i)
Чтобы настроить задачу с ограничением конуса второго порядка, создайте объект ограничения конуса второго порядка.
A = diag([1,1/2,0]); b = zeros(3,1); d = [0;0;1]; gamma = 0; socConstraints = secondordercone(A,b,d,gamma);
Создайте вектор целевой функции.
f = [-1,-2,0];
Задача не имеет линейных ограничений. Создайте пустые матрицы для этих ограничений.
Aineq = []; bineq = []; Aeq = []; beq = [];
Установите верхнюю и нижнюю границы на x(3)
.
lb = [-Inf,-Inf,0]; ub = [Inf,Inf,2];
Решите задачу при помощи coneprog
функция.
[x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub)
Optimal solution found.
x = 3×1
0.4851
3.8806
2.0000
fval = -8.2462
Компонент решения x(3)
находится в верхней границе графика. Ограничение конуса активно в решении:
norm(A*x-b) - d'*x % Near 0 when the constraint is active
ans = -2.5677e-08
Чтобы настроить задачу с несколькими ограничениями конуса второго порядка, создайте массив объектов ограничений. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma);
Создайте вектор линейной целевой функции.
f = [-1;-2;-4];
Решите задачу при помощи coneprog
функция.
[x,fval] = coneprog(f,socConstraints)
Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
Задайте вектор целевой функции и одно ограничение конуса второго порядка.
f = [-4;-9;-2]; Asc = diag([1,4,0]); b = [0;0;0]; d = [0;0;1]; gamma = 0; socConstraints = secondordercone(Asc,b,d,gamma);
Задайте линейное ограничение неравенства.
A = [1/4,1/9,1]; b = 5;
Решите проблему.
[x,fval] = coneprog(f,socConstraints,A,b)
Optimal solution found.
x = 3×1
3.2304
0.6398
4.1213
fval = -26.9225
Наблюдать итерации coneprog
решатель, установите Display
опция для 'iter'
.
options = optimoptions('coneprog','Display','iter');
Создайте задачу программирования конуса второго порядка и решите ее с помощью options
.
Asc = diag([1,1/2,0]); b = zeros(3,1); d = [0;0;1]; gamma = 0; socConstraints = secondordercone(Asc,b,d,gamma); f = [-1,-2,0]; Aineq = []; bineq = []; Aeq = []; beq = []; lb = [-Inf,-Inf,0]; ub = [Inf,Inf,2]; [x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub,options)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.714286e-01 1.250000e-01 0.02 2 -7.558066e+00 0.000000e+00 7.151114e-02 1.564306e-02 0.02 3 -7.366973e+00 0.000000e+00 1.075440e-02 2.352525e-03 0.02 4 -8.243432e+00 0.000000e+00 5.191882e-05 1.135724e-05 0.02 5 -8.246067e+00 1.387779e-17 2.430813e-06 5.317403e-07 0.02 6 -8.246211e+00 0.000000e+00 6.154504e-09 1.346298e-09 0.03 Optimal solution found.
x = 3×1
0.4851
3.8806
2.0000
fval = -8.2462
Создайте элементы массива задачи программирования конуса второго порядка. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4]; options = optimoptions('coneprog','Display','iter');
Создайте структуру задачи с необходимыми полями, как описано в задаче.
problem = struct('f',f,... 'socConstraints',socConstraints,... 'Aineq',[],'bineq',[],... 'Aeq',[],'beq',[],... 'lb',[],'ub',[],... 'solver','coneprog',... 'options',options);
Решите проблему, позвонив coneprog
.
[x,fval] = coneprog(problem)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.13 2 -9.696012e+00 1.850372e-17 7.631901e-02 7.949897e-03 0.14 3 -1.178942e+01 9.251859e-18 1.261803e-02 1.314378e-03 0.14 4 -1.294426e+01 1.850372e-17 1.683078e-03 1.753206e-04 0.14 5 -1.295217e+01 1.850372e-17 8.994595e-04 9.369370e-05 0.14 6 -1.295331e+01 1.850372e-17 4.748841e-04 4.946709e-05 0.15 7 -1.300753e+01 9.251859e-18 2.799942e-05 2.916606e-06 0.15 8 -1.300671e+01 9.251859e-18 2.366136e-05 2.464725e-06 0.15 9 -1.300850e+01 1.850372e-17 8.187205e-06 8.528338e-07 0.15 10 -1.300843e+01 4.625929e-18 7.326330e-06 7.631594e-07 0.15 11 -1.300862e+01 9.251859e-18 2.707005e-06 2.819797e-07 0.15 12 -1.300892e+01 0.000000e+00 9.204457e-08 9.587976e-09 0.15 Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
coneprog
Процесс решенияСоздайте задачу программирования конуса второго порядка. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4]; options = optimoptions('coneprog','Display','iter'); A = []; b = []; Aeq = []; beq = []; lb = []; ub = [];
Решите проблему, запросив информацию о процессе решения.
[x,fval,exitflag,output] = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options)
Iter Fval Primal Infeas Dual Infeas Duality Gap Time 1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.04 2 -9.696012e+00 1.850372e-17 7.631901e-02 7.949897e-03 0.06 3 -1.178942e+01 9.251859e-18 1.261803e-02 1.314378e-03 0.06 4 -1.294426e+01 1.850372e-17 1.683078e-03 1.753206e-04 0.06 5 -1.295217e+01 1.850372e-17 8.994595e-04 9.369370e-05 0.06 6 -1.295331e+01 1.850372e-17 4.748841e-04 4.946709e-05 0.06 7 -1.300753e+01 9.251859e-18 2.799942e-05 2.916606e-06 0.06 8 -1.300671e+01 9.251859e-18 2.366136e-05 2.464725e-06 0.06 9 -1.300850e+01 1.850372e-17 8.187205e-06 8.528338e-07 0.06 10 -1.300843e+01 4.625929e-18 7.326330e-06 7.631594e-07 0.06 11 -1.300862e+01 9.251859e-18 2.707005e-06 2.819797e-07 0.06 12 -1.300892e+01 0.000000e+00 9.204457e-08 9.587976e-09 0.06 Optimal solution found.
x = 3×1
0.4238
1.6477
2.3225
fval = -13.0089
exitflag = 1
output = struct with fields:
iterations: 12
primalfeasibility: 0
dualfeasibility: 9.2045e-08
dualitygap: 9.5880e-09
algorithm: 'interior-point'
linearsolver: 'augmented'
message: 'Optimal solution found.'
Итеративное отображение и структура output показывают, что coneprog
использовали 12 итераций, чтобы прийти к решению.
Значение выходного флага 1
и output.message
значение 'Optimal solution found.'
указать, что решение надежно.
The output
структура показывает, что несоответствия, как правило, уменьшаются в процессе решения, как и разрыв двойственности.
Можно воспроизвести fval
вывод путем умножения f'*x
.
f'*x
ans = -13.0089
coneprog
Двойные переменныеСоздайте задачу программирования конуса второго порядка. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.
A = diag([1,2,0]); b = zeros(3,1); d = [0;0;1]; gamma = -1; socConstraints(3) = secondordercone(A,b,d,gamma); A = diag([3,0,1]); d = [0;1;0]; socConstraints(2) = secondordercone(A,b,d,gamma); A = diag([0;1/2;1/2]); d = [1;0;0]; socConstraints(1) = secondordercone(A,b,d,gamma); f = [-1;-2;-4];
Решите задачу, запросив двойные переменные в решении наряду со всеми другими coneprog
выход..
[x,fval,exitflag,output,lambda] = coneprog(f,socConstraints);
Optimal solution found.
Осмотрите возвращенные lambda
структура. Поскольку единственными ограничениями задачи являются ограничения конуса, исследуйте только soc
поле в lambda
структура.
disp(lambda.soc)
1.0e-05 * 0.0570 0.1946 0.0618
Ограничения имеют ненулевые двойственные значения, что указывает на то, что ограничения активны в решении.
f
- Вектор коэффициентовВектор коэффициентов, заданный как вектор действительных чисел или вещественный массив. Вектор коэффициентов представляет целевую функцию f'*x
. Это обозначение принимает, что f
является вектор-столбец, но можно использовать вектор-строку или массив. Внутренне, coneprog
преобразует f
в вектор-столбец f(:)
.
Пример: f = [1,3,5,-6]
Типы данных: double
socConstraints
- Ограничения конуса второго порядкаSecondOrderConeConstraint
объектыОграничения конуса второго порядка, заданные как вектор SecondOrderConeConstraint
объекты. Создайте эти объекты с помощью secondordercone
функция.
socConstraints
кодирует ограничения
где отображение между массивом и уравнением выглядит следующим образом:
A sc (i) = socConstraints.A(i)
b sc (i) = socConstraints.b(i)
d sc (i) = socConstraints.d(i)
γ (<reservedrangesplaceholder1>) = socConstraints.gamma(i)
Пример: Asc = diag([1 1/2 0]); bsc = zeros(3,1); dsc = [0;0;1]; gamma = -1; socConstraints = secondordercone(Asc,bsc,dsc,gamma);
Типы данных: struct
A
- Линейные ограничения неравенстваЛинейные ограничения неравенства, заданные как действительная матрица. A
является M
-by- N
матрица, где M
количество неравенств и N
- количество переменных (длина f
). Для больших задач передайте A
как разреженная матрица.
A
кодирует M
линейное неравенство
A*x <= b
,
где x
является вектор-столбец N
переменные x(:)
, и b
- вектор-столбец с M
элементы.
Для примера рассмотрим эти неравенства:
<reservedrangesplaceholder1> 1 + 2 <reservedrangesplaceholder0> 2 10
3 <reservedrangesplaceholder1> 1 + 4 <reservedrangesplaceholder0> 2 20
5 <reservedrangesplaceholder1> 1 + 6 <reservedrangesplaceholder0> 2 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
-by- N
.
Для примера рассмотрим эти неравенства:
<reservedrangesplaceholder1> 1 + 2 <reservedrangesplaceholder0> 2 10
3 <reservedrangesplaceholder1> 1 + 4 <reservedrangesplaceholder0> 2 20
5 <reservedrangesplaceholder1> 1 + 6 <reservedrangesplaceholder0> 2 30.
Задайте неравенства, введя следующие ограничения.
A = [1,2;3,4;5,6]; b = [10;20;30];
Пример: Чтобы указать, что компоненты x равны 1 или менее, используйте A = ones(1,N)
и b = 1
.
Типы данных: double
Aeq
- Линейные ограничения равенстваЛинейные ограничения равенства, заданные как действительная матрица. Aeq
является Me
-by- N
матрица, где Me
количество равенств и N
- количество переменных (длина f
). Для больших задач передайте Aeq
как разреженная матрица.
Aeq
кодирует Me
линейные равенства
Aeq*x = beq
,
где x
является вектор-столбец N
переменные x(:)
, и beq
- вектор-столбец с Me
элементы.
Для примера рассмотрим эти равенства:
<reservedrangesplaceholder2> 1 + 2 <reservedrangesplaceholder1> 2 + 3 <reservedrangesplaceholder0> 3 = 10
2 <reservedrangesplaceholder2> 1 + 4 <reservedrangesplaceholder1> 2 + <reservedrangesplaceholder0> 3 = 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
-by- N
.
Для примера рассмотрим эти равенства:
<reservedrangesplaceholder2> 1 + 2 <reservedrangesplaceholder1> 2 + 3 <reservedrangesplaceholder0> 3 = 10
2 <reservedrangesplaceholder2> 1 + 4 <reservedrangesplaceholder1> 2 + <reservedrangesplaceholder0> 3 = 20.
Задайте равенства путем ввода следующих ограничений.
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Пример: Чтобы указать, что компоненты x равны 1, используйте Aeq = ones(1,N)
и beq = 1
.
Типы данных: double
lb
- Нижние границыНижние границы, заданные как вектор действительных чисел или вещественный массив. Если длина f
равно длине lb
, затем lb
определяет, что
x(i) >= lb(i)
для всех i
.
Если numel(lb) < numel(f)
, затем lb
определяет, что
x(i) >= lb(i)
для 1 <= i <= numel(lb)
.
В этом случае решатели выдают предупреждение.
Пример: Чтобы указать, что все x-компоненты положительны, используйте lb = zeros(size(f))
.
Типы данных: double
ub
- Верхние границыВерхние границы, заданные как вектор действительных чисел или действительный массив. Если длина f
равно длине ub
, затем ub
определяет, что
x(i) <= ub(i)
для всех i
.
Если numel(ub) < numel(f)
, затем ub
определяет, что
x(i) <= ub(i)
для 1 <= i <= numel(ub)
.
В этом случае решатели выдают предупреждение.
Пример: Чтобы указать, что все x-компоненты меньше 1
, использовать ub = ones(size(f))
.
Типы данных: double
options
- Опции оптимизацииoptimoptions
Опции оптимизации, заданные как выход optimoptions
.
Опция | Описание |
---|---|
ConstraintTolerance | Допустимый допуск для ограничений, скаляр от |
| Level of display (см. Итеративное отображение):
|
LinearSolver | Алгоритм решения одного шага итерации:
Если
Разреженный пример см. в Сравнении скоростей алгоритмов coneprog. |
| Максимально допустимое количество итераций, положительное целое число. Значение по умолчанию является См. Допуски и критерий остановки и итерации и счетчики функций. |
MaxTime | Максимальное количество времени в секундах, которое запускает алгоритм, положительное число или |
| Допуск на расторжение при двойной выполнимости, положительной скалярной величине. Значение по умолчанию является |
Пример: optimoptions('coneprog','Display','iter','MaxIterations',100)
problem
- Структура задачиСтруктура задачи, заданная как структура со следующими полями.
Имя поля | Вход |
---|---|
| Вектор линейной целевой функции f |
| Массив структур из ограничений конуса второго порядка |
| Матрица линейных ограничений неравенства |
| Вектор линейных ограничений неравенства |
| Матрица линейных ограничений равенства |
| Вектор линейных ограничений равенства |
lb | Вектор нижних границ |
ub | Вектор верхних границ |
| 'coneprog' |
| Опции, созданные с optimoptions |
Типы данных: struct
fval
- Значение целевой функции в решенииЗначение целевой функции в решении, возвращаемое как действительное число. Обычно fval
= f'*x
. The fval
выход пуст, когда exitflag
значение равно - 2
, – 3
, или - 10
.
exitflag
- Причины coneprog
остановленныйПричина coneprog
stop, возвращается как целое число.
Значение | Описание |
---|---|
| Функция сходилась к решению |
| Превышено количество итераций |
| Допустимая точка не найдена. |
| Проблема неограниченная. |
| Поисковое направление стало слишком маленьким. Дальнейшего прогресса достичь не удалось. |
| Проблема численно нестабильна. |
Совет
Если вы получите выходной флаг 0
, -7
, или -10
, попробуйте использовать другое значение LinearSolver
опция.
output
- Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенная как структура с этими полями.
Область | Описание |
---|---|
algorithm | Используемый алгоритм оптимизации |
dualfeasibility | Максимум двойных нарушений ограничений |
dualitygap | Разрыв двойственности |
iterations | Количество итераций |
message | Выходное сообщение |
primalfeasibility | Максимальное количество нарушений ограничений |
linearsolver | Используется алгоритм внутреннего шагового решателя |
The output
поля dualfeasibility
, dualitygap
, и primalfeasibility
пусты, когда exitflag
значение -2, -3 или -10.
lambda
- Двойные переменные в решенииДвойные переменные в решении, возвращенные как структура с этими полями.
Область | Описание |
---|---|
lower | Нижние границы, соответствующие |
upper | Верхние границы, соответствующие |
ineqlin | |
eqlin | |
soc | Ограничения конуса второго порядка, соответствующие socConstraints |
lambda
пуст ([]
) когда exitflag
значение равно - 2
, – 3
, или - 10
.
Множители Лагранжа (двойственные переменные) являются частью следующего Лагранжа, который является стационарным (нулевой градиент) в решении:
Условия неравенства, которые умножают lambda
поля неотрицательны.
Почему это ограничение
называется ограничением конуса второго порядка? Рассмотрим конус в трехмерном пространстве с эллиптическими сечениями в плоскости x - y и диаметром, пропорциональным z координате. Координата y имеет шкалу ½, а координата x - шкала 1. Неравенство, определяющее внутренность этого конуса с его точкой в [0,0,0], является
В coneprog
синтаксис, этот конус имеет следующие аргументы.
A = diag([1 1/2 0]); b = [0;0;0]; d = [0;0;1]; gamma = 0;
Постройте график контура конуса.
[X,Y] = meshgrid(-2:0.1:2); Z = sqrt(X.^2 + Y.^2/4); surf(X,Y,Z) view(8,2) xlabel 'x' ylabel 'y' zlabel 'z'
The b
и gamma
аргументы перемещают конус. The A
и d
аргументы вращают конус и изменяют его форму.
Алгоритм использует метод interior-point. Для получения дополнительной информации смотрите Алгоритм программирования конуса второго порядка.
Задача Optimize Live Editor обеспечивает визуальный интерфейс для coneprog
.
coneprog
lambda
Структуры, переименованныеПоведение изменено в R2021a
coneprog
lambda
поля выходного аргумента lambda.eq
и lambda.ineq
были переименованы в lambda.eqlin
и lambda.ineqlin
, соответственно. Это изменение вызывает coneprog
lambda
структурировать поля так, чтобы они имели те же имена, что и соответствующие поля в других решателях.
linprog
| Оптимизировать | quadprog
| secondordercone
| SecondOrderConeConstraint
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.