Решатель второго порядка конического программирования
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 activeans = -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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.