Main Content

为基于问题的锥编程编写约束

为了确保 solveprob2struct 调用 coneprog 来求解二阶锥问题,请将二阶锥约束约束为以下两种类型之一:

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

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

这里,linear expression 表示优化变量中的线性表达式。sum of squares 表示优化变量的显式平方和,例如 sum(x.^2)coneprog 的目标函数在优化变量中必须是线性的。有关平方和形式的更多信息,请参阅 编写基于问题的最小二乘法的目标函数

当约束类型具有与列出的两种等效形式时,solveprob2struct 也会调用 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'

另请参阅

| |

相关主题