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