exponenta event banner

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

Гарантировать это 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'

Смотрите также

| |

Похожие темы