为基于问题的锥编程编写约束
为了确保 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)
例如,当您调用 solve
时, coneprog
是以下两个等效问题表示的默认求解器。
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
| solve
| prob2struct