coneprog

Решатель второго порядка конического программирования

Описание

coneprog функция является решателем программирования конуса второго порядка, который находит минимум задачи, заданной

minxfTx

удовлетворяющее ограничениям

Asc(i)xbsc(i)dscT(i)xγ(i)AxbAeqx=beqфунтxub.

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)

пример

x = coneprog(f,socConstraints,A,b,Aeq,beq) решает задачу, удовлетворяющую ограничениям неравенства A*x  b и ограничения равенства   Aeq*x = beq. Задайте   A = [] и   b = [] если неравенства не существует.

пример

x = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub) задает набор нижних и верхних границ переменных проектов, x так, что решение всегда находится в области значений     lb ≤ x ≤ ub. Задайте   Aeq = [] и   beq = [] если равенств не существует.

пример

x = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options) минимизирует использование опций оптимизации, заданных options. Использовать optimoptions чтобы задать эти опции.

пример

x = coneprog(problem) находит минимум для problem, структуру, описанную в problem.

пример

[x,fval] = coneprog(___) также возвращает значение целевой функции в решении fval = f'*x, использование любой комбинации входных аргументов в предыдущих синтаксисах.

пример

[x,fval,exitflag,output] = coneprog(___) дополнительно возвращает значение exitflag который описывает выходное условие и структуру output который содержит информацию о процессе оптимизации.

пример

[x,fval,exitflag,output,lambda] = coneprog(___) дополнительно возвращает структуру lambda поля которого содержат двойственные переменные в решении x.

Примеры

свернуть все

Чтобы настроить задачу с ограничением конуса второго порядка, создайте объект ограничения конуса второго порядка.

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

Создайте задачу программирования конуса второго порядка. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.

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

Создайте задачу программирования конуса второго порядка. Чтобы сэкономить время и память, сначала создайте ограничение с самым высоким индексом.

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'*x. Это обозначение принимает, что f является вектор-столбец, но можно использовать вектор-строку или массив. Внутренне, coneprog преобразует f в вектор-столбец f(:).

Пример: f = [1,3,5,-6]

Типы данных: double

Ограничения конуса второго порядка, заданные как вектор SecondOrderConeConstraint объекты. Создайте эти объекты с помощью secondordercone функция.

socConstraints кодирует ограничения

Asc(i)xbsc(i)dscT(i)xγ(i)

где отображение между массивом и уравнением выглядит следующим образом:

  • 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 является 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 является 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 является 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 является 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

Нижние границы, заданные как вектор действительных чисел или вещественный массив. Если длина 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

Верхние границы, заданные как вектор действительных чисел или действительный массив. Если длина 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

Опции оптимизации, заданные как выход optimoptions.

ОпцияОписание
ConstraintTolerance

Допустимый допуск для ограничений, скаляр от 0 через 1. ConstraintTolerance измеряет основной допустимый допуск. Значение по умолчанию является 1e-6.

Display

Level of display (см. Итеративное отображение):

  • 'final' (по умолчанию) отображает только окончательный выход.

  • 'iter' отображает вывод при каждой итерации.

  • 'off' или 'none' не отображает выход.

LinearSolver

Алгоритм решения одного шага итерации:

  • 'auto' (по умолчанию) - coneprog выбирает решатель шага.

    • Если задача разрежена, то решатель шага 'prodchol'.

    • В противном случае решатель шага 'augmented'.

  • 'augmented' - Решение шага дополненной формы. См. раздел [1].

  • 'normal' - Решатель шага нормальной формы. См. раздел [1].

  • 'prodchol' - Форма продукта Холецкий шаговый решатель. См. [4] и [5].

  • 'schur' - решатель шага метода комплемента Шура. См. раздел [2].

Если 'auto' не работает хорошо, попробуйте эти предложения для LinearSolver:

  • Если проблема разреженная, попробуйте 'normal'.

  • Если проблема разрежена с некоторыми плотными столбцами или большими конусами, попробуйте 'prodchol' или 'schur'.

  • Если задача плотная, используйте 'augmented'.

Разреженный пример см. в Сравнении скоростей алгоритмов coneprog.

MaxIterations

Максимально допустимое количество итераций, положительное целое число. Значение по умолчанию является 200.

См. Допуски и критерий остановки и итерации и счетчики функций.

MaxTime

Максимальное количество времени в секундах, которое запускает алгоритм, положительное число или Inf. Значение по умолчанию является Inf, что отключает этот критерий остановки.

OptimalityTolerance

Допуск на расторжение при двойной выполнимости, положительной скалярной величине. Значение по умолчанию является 1e-6.

Пример: optimoptions('coneprog','Display','iter','MaxIterations',100)

Структура задачи, заданная как структура со следующими полями.

Имя поляВход

f

Вектор линейной целевой функции f

socConstraints

Массив структур из ограничений конуса второго порядка

Aineq

Матрица линейных ограничений неравенства

bineq

Вектор линейных ограничений неравенства

Aeq

Матрица линейных ограничений равенства

beq

Вектор линейных ограничений равенства
lbВектор нижних границ
ubВектор верхних границ

solver

'coneprog'

options

Опции, созданные с optimoptions

Типы данных: struct

Выходные аргументы

свернуть все

Решение, возвращенное как вектор действительных чисел или действительный массив. Размер x совпадает с размером f. The x выход пуст, когда exitflag значение равно - 2, – 3, или - 10.

Значение целевой функции в решении, возвращаемое как действительное число. Обычно fval = f'*x. The fval выход пуст, когда exitflag значение равно - 2, – 3, или - 10.

Причина coneprog stop, возвращается как целое число.

ЗначениеОписание

1

Функция сходилась к решению x.

0

Превышено количество итераций options.MaxIterations, или время решения в секундах превысило options.MaxTime.

-2

Допустимая точка не найдена.

-3

Проблема неограниченная.

-7

Поисковое направление стало слишком маленьким. Дальнейшего прогресса достичь не удалось.

-10

Проблема численно нестабильна.

Совет

Если вы получите выходной флаг 0, -7, или -10, попробуйте использовать другое значение LinearSolver опция.

Информация о процессе оптимизации, возвращенная как структура с этими полями.

ОбластьОписание
algorithm

Используемый алгоритм оптимизации

dualfeasibility

Максимум двойных нарушений ограничений

dualitygap

Разрыв двойственности

iterations

Количество итераций

message

Выходное сообщение

primalfeasibility

Максимальное количество нарушений ограничений

linearsolverИспользуется алгоритм внутреннего шагового решателя

The output поля dualfeasibility, dualitygap, и primalfeasibility пусты, когда exitflag значение -2, -3 или -10.

Двойные переменные в решении, возвращенные как структура с этими полями.

ОбластьОписание
lower

Нижние границы, соответствующие lb

upper

Верхние границы, соответствующие ub

ineqlin

Линейное неравенство, соответствующее A и b

eqlin

Линейные равенства, соответствующие Aeq и beq

socОграничения конуса второго порядка, соответствующие socConstraints

lambda пуст ([]) когда exitflag значение равно - 2, – 3, или - 10.

Множители Лагранжа (двойственные переменные) являются частью следующего Лагранжа, который является стационарным (нулевой градиент) в решении:

fTx+iλsoc(i)(dsocT(i)xгамма(i)Asoc(i)xbsoc(i))      +λineqlinT(bAx)+λeqlinT(Aeqxbeq)+λверхнийT(ubx)+λнижеT(xlb).

Условия неравенства, которые умножают lambda поля неотрицательны.

Подробнее о

свернуть все

Ограничение конуса второго порядка

Почему это ограничение

AxbdTxγ

называется ограничением конуса второго порядка? Рассмотрим конус в трехмерном пространстве с эллиптическими сечениями в плоскости x - y и диаметром, пропорциональным z координате. Координата y имеет шкалу ½, а координата x - шкала 1. Неравенство, определяющее внутренность этого конуса с его точкой в [0,0,0], является

x2+y24z.

В 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'

Cone with point at zero, widening in the vertical direction.

The b и gamma аргументы перемещают конус. The A и d аргументы вращают конус и изменяют его форму.

Алгоритмы

Алгоритм использует метод interior-point. Для получения дополнительной информации смотрите Алгоритм программирования конуса второго порядка.

Альтернативная функциональность

Приложение

Задача Optimize Live Editor обеспечивает визуальный интерфейс для coneprog.

Вопросы совместимости

расширить все

Поведение изменено в R2021a

Введенный в R2020b