Main Content

secondordercone

创建二阶锥约束

自 R2020b 起

说明

secondordercone 函数创建表示不等式的二阶锥约束

AxbdTxγ

(基于输入矩阵 Abdgamma)。

socConstraint = secondordercone(A,b,d,gamma) 创建二阶锥约束对象 socConstraint

使用 coneprog 函数求解具有二阶锥约束的问题。要表示多个锥约束,请将由这些约束组成的数组传递给 coneprog,如示例多个锥约束中所示。

示例

示例

全部折叠

要使用二阶锥约束设立问题,请创建一个二阶锥约束对象。

A = diag([1,1/2,0]);
b = zeros(3,1);
d = [0;0;1];
gamma = 0;
socConstraints = secondordercone(A,b,d,gamma);

创建一个目标函数向量。

f = [-1,-2,0];

该问题没有线性约束。为这些约束创建空矩阵。

Aineq = [];
bineq = [];
Aeq = [];
beq = [];

x(3) 设置上界和下界。

lb = [-Inf,-Inf,0];
ub = [Inf,Inf,2];

使用 coneprog 函数求解该问题。

[x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub)
Optimal solution found.
x = 3×1

    0.4851
    3.8806
    2.0000

fval = 
-8.2462

解的分量 x(3) 位于其上界。锥约束在解处处于活动状态:

norm(A*x-b) - d'*x % Near 0 when the constraint is active
ans = 
-2.5677e-08

要设立一个具有多个二阶锥约束的问题,请创建一个约束对象数组。为了节省时间和内存,请先创建最高阶指数约束。

A = diag([1,2,0]);
b = zeros(3,1);
d = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(A,b,d,gamma);

A = diag([3,0,1]);
d = [0;1;0];
socConstraints(2) = secondordercone(A,b,d,gamma);

A = diag([0;1/2;1/2]);
d = [1;0;0];
socConstraints(1) = secondordercone(A,b,d,gamma);

创建线性目标函数向量。

f = [-1;-2;-4];

使用 coneprog 函数求解该问题。

[x,fval] = coneprog(f,socConstraints)
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = 
-13.0089

输入参数

全部折叠

锥的线性因子,指定为实矩阵。A 中的列数必须等于 d 中的元素数,并且 A 中的行数必须等于 b 中的元素数。

示例: diag([1,1/2,0])

数据类型: double

锥的中心,指定为实数向量。b 中的元素数必须等于 A 中的行数。

示例: zeros(3,1)

数据类型: double

线性边界,指定为实数向量。d 中的元素数必须等于 A 中的列数。

示例: [0;0;1]

数据类型: double

边界,指定为实数标量。gamma 的值越小,对应的约束条件越宽松。

示例: -1

数据类型: double

输出参量

全部折叠

二阶锥约束,以 SecondOrderConeConstraint 对象形式返回。将此对象用作 coneprog 求解器的约束。如果您有多个锥约束,请将约束向量传递给 coneprog;请参阅多个锥约束

版本历史记录

在 R2020b 中推出