Ограничения записи для программирования конусов на основе проблем

Обеспечить, чтобы solve или prob2struct требования coneprog для проблемы конуса второго порядка задайте ограничения конуса второго порядка как один из двух типов.

  • norm(linear expression) + constant <= linear expression

  • sqrt(sum of squares) + constant <= linear expression

Здесь, linear expression означает линейное выражение в переменных оптимизации. sum of squares означает сумму явных квадратов переменных оптимизации, таких как sum(x.^2). Целевая функция для coneprog должен быть линейным в переменных оптимизации. Дополнительные сведения о форме суммы квадратов см. в разделе Запись целевой функции для проблемных наименьших квадратов.

solve и prob2struct также звоните coneprog если тип ограничения имеет форму, эквивалентную двум перечисленным:

  • linear expression >= sqrt(sum of squares) + constant

  • linear expression >= norm(linear expression) + constant

  • const*norm(linear expression) + constant <= linear expression если const > 0

  • (sum of squares)^0.5 вместо sqrt(sum of squares)

Например, coneprog является решателем по умолчанию для каждой из следующих двух эквивалентных формулировок задачи при вызове solve.

x = optimvar('x',3,...
    'LowerBound',[-Inf,-Inf,0],...
    'UpperBound',[Inf,Inf,2]);
A = diag([1,1/2,0]);
d = [0;0;1];
f = [-1,-2,0];
probnorm = optimproblem('Objective',f*x);
probsumsq = optimproblem('Objective',f*x);

consnorm = norm(A*x) <= d'*x;
probnorm.Constraints.consnorm = consnorm;
conssumsq = sqrt(sum((A*x).^2)) <= dot(d,x);
probsumsq.Constraints.conssumsq = conssumsq;

optnorm = optimoptions(probnorm);
class(optnorm)
ans =

    'optim.options.ConeprogOptions
optsumsq = optimoptions(probsumsq);
class(optsumsq)
ans =

    'optim.options.ConeprogOptions

Если записать ограничения второго порядка по-другому, например математический эквивалент sqrt(x'*x), solve вызывает другой решатель, например fmincon. В этом случае необходимо поставить solve с начальной точкой, и процесс решения может быть различным (и часто менее эффективным), как в следующем примере.

x = optimvar('x',3,...
    'LowerBound',[-Inf,-Inf,0],...
    'UpperBound',[Inf,Inf,2]);
A = diag([1,1/2,0]);
d = [0;0;1];
f = [-1,-2,0];
prob = optimproblem('Objective',f*x);
cons = sqrt(x'*A'*A*x) <= d'*x;
prob.Constraints.cons = cons;
opt = optimoptions(prob);
class(opt)
ans =

    'optim.options.Fmincon'

См. также

| |

Связанные темы