Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

coneprog

二阶锥规划求解器

自 R2020b 起

说明

coneprog 函数是一个二阶锥规划求解器,用于求由下式指定的问题的最小值

minxfTx

需满足以下约束

Asc(i)xbsc(i)dscT(i)xγ(i)AxbAeqx=beqlbxub.

f、x、b、beq、lb 和 ub 是向量,A 和 Aeq 是矩阵。对于每个 i,矩阵 Asc(i)、向量 dsc(i) 和 bsc(i) 以及标量 γ(i) 在您使用 secondordercone 创建的二阶锥约束范围内。

有关锥约束的详细信息,请参阅二阶锥约束

示例

x = coneprog(f,socConstraints) 求解二阶锥规划问题,socConstraints 中的约束编码为

  • Asc(i) = socConstraints(i).A

  • bsc(i) = socConstraints(i).b

  • dsc(i) = socConstraints(i).d

  • γ(i) = socConstraints(i).gamma

示例

x = coneprog(f,socConstraints,A,b,Aeq,beq) 在不等式约束 A*x b 和等式约束 Aeq*x = beq 下求解问题。如果不存在不等式,请设置 A = []b = []

示例

x = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub) 定义设计变量 x 的一组下界和上界,使解始终在 lb ≤ x ≤ ub 范围内。如果不存在等式,请设置 Aeq = []beq = []

示例

x = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options) 使用 options 指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。

示例

x = coneprog(problem)problem 的最小值,它是 problem 中所述的一个结构体。

示例

[x,fval] = coneprog(___) 还使用上述语法中的任何输入参数组合返回在解 fval = f'*x 处的目标函数值。

示例

[x,fval,exitflag,output] = coneprog(___) 还返回说明退出条件的值 exitflag,以及包含优化过程信息的结构体 output

示例

[x,fval,exitflag,output,lambda] = coneprog(___) 还返回结构体 lambda,其字段包含在解 x 处的对偶变量。

示例

全部折叠

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

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

指定一个目标函数向量和单个二阶锥约束。

f = [-4;-9;-2];
Asc = diag([1,4,0]);
b = [0;0;0];
d = [0;0;1];
gamma = 0;
socConstraints = secondordercone(Asc,b,d,gamma);

指定一个线性不等式约束。

A = [1/4,1/9,1];
b = 5;

求解。

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

    3.2304
    0.6398
    4.1213

fval = -26.9225

要观测 coneprog 求解器的迭代,请将 Display 选项设置为 'iter'

options = optimoptions('coneprog','Display','iter');

创建一个二阶锥规划问题,并使用 options 对其进行求解。

Asc = diag([1,1/2,0]);
b = zeros(3,1);
d = [0;0;1];
gamma = 0;
socConstraints = secondordercone(Asc,b,d,gamma);
f = [-1,-2,0];
Aineq = [];
bineq = [];
Aeq = [];
beq = [];
lb = [-Inf,-Inf,0];
ub = [Inf,Inf,2];
[x,fval] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub,options)
Iter           Fval  Primal Infeas    Dual Infeas    Duality Gap    Time
   1   0.000000e+00   0.000000e+00   5.714286e-01   1.250000e-01    0.03
   2  -7.558066e+00   0.000000e+00   7.151114e-02   1.564306e-02    0.04
   3  -7.366973e+00   0.000000e+00   1.075440e-02   2.352525e-03    0.04
   4  -8.243432e+00   0.000000e+00   5.191882e-05   1.135724e-05    0.05
   5  -8.246067e+00   1.387779e-17   2.430813e-06   5.317403e-07    0.05
   6  -8.246211e+00   0.000000e+00   6.154504e-09   1.346298e-09    0.05
Optimal solution found.
x = 3×1

    0.4851
    3.8806
    2.0000

fval = -8.2462

创建一个二阶锥规划问题的元素。为了节省时间和内存,请先创建最高阶指数约束。

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];
options = optimoptions('coneprog','Display','iter');

按照problem中所述,创建一个包含必需字段的问题结构体。

problem = struct('f',f,...
    'socConstraints',socConstraints,...
    'Aineq',[],'bineq',[],...
    'Aeq',[],'beq',[],...
    'lb',[],'ub',[],...
    'solver','coneprog',...
    'options',options);

通过调用 coneprog 求解问题。

[x,fval] = coneprog(problem)
Iter           Fval  Primal Infeas    Dual Infeas    Duality Gap    Time
   1   0.000000e+00   0.000000e+00   5.333333e-01   5.555556e-02    0.09
   2  -9.696012e+00   1.850372e-17   7.631901e-02   7.949897e-03    0.11
   3  -1.178942e+01   9.251859e-18   1.261803e-02   1.314378e-03    0.11
   4  -1.294426e+01   1.850372e-17   1.683078e-03   1.753206e-04    0.11
   5  -1.295217e+01   1.850372e-17   8.994595e-04   9.369370e-05    0.11
   6  -1.295331e+01   1.850372e-17   4.748841e-04   4.946709e-05    0.11
   7  -1.300753e+01   9.251859e-18   2.799942e-05   2.916606e-06    0.12
   8  -1.300671e+01   9.251859e-18   2.366136e-05   2.464725e-06    0.12
   9  -1.300850e+01   1.850372e-17   8.187205e-06   8.528338e-07    0.12
  10  -1.300843e+01   4.625929e-18   7.326330e-06   7.631594e-07    0.12
  11  -1.300862e+01   9.251859e-18   2.707005e-06   2.819797e-07    0.12
  12  -1.300892e+01   0.000000e+00   9.204457e-08   9.587976e-09    0.13
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = -13.0089

创建一个二阶锥规划问题。为了节省时间和内存,请先创建最高阶指数约束。

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];
options = optimoptions('coneprog','Display','iter');
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

求解该问题,请求有关求解过程的信息。

[x,fval,exitflag,output] = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options)
Iter           Fval  Primal Infeas    Dual Infeas    Duality Gap    Time
   1   0.000000e+00   0.000000e+00   5.333333e-01   5.555556e-02    0.04
   2  -9.696012e+00   5.551115e-17   7.631901e-02   7.949897e-03    0.06
   3  -1.178942e+01   3.700743e-17   1.261803e-02   1.314378e-03    0.06
   4  -1.294426e+01   1.850372e-17   1.683078e-03   1.753206e-04    0.06
   5  -1.295217e+01   9.251859e-18   8.994595e-04   9.369370e-05    0.06
   6  -1.295331e+01   9.251859e-18   4.748841e-04   4.946709e-05    0.06
   7  -1.300753e+01   9.251859e-18   2.799942e-05   2.916606e-06    0.06
   8  -1.300671e+01   9.251859e-18   2.366136e-05   2.464725e-06    0.06
   9  -1.300850e+01   9.251859e-18   8.222244e-06   8.564838e-07    0.06
  10  -1.300843e+01   1.850372e-17   7.318333e-06   7.623264e-07    0.06
  11  -1.300865e+01   9.251859e-18   2.636568e-06   2.746425e-07    0.07
  12  -1.300892e+01   1.850372e-17   3.407939e-08   3.549936e-09    0.07
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = -13.0089
exitflag = 1
output = struct with fields:
           iterations: 12
    primalfeasibility: 1.8504e-17
      dualfeasibility: 3.4079e-08
           dualitygap: 3.5499e-09
            algorithm: 'interior-point'
         linearsolver: 'augmented'
              message: 'Optimal solution found.'

  • 迭代输出和输出结构体都表明 coneprog 使用了 12 次迭代才得出解。

  • 退出标志值 1output.message'Optimal solution found.' 表明该解是可靠的。

  • output 结构体表明,不可行性在求解过程中越来越低,对偶间隙也越来越小。

  • 您可以通过乘以 f'*x 来重现 fval 输出。

f'*x
ans = -13.0089

创建一个二阶锥规划问题。为了节省时间和内存,请先创建最高阶指数约束。

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,exitflag,output,lambda] = coneprog(f,socConstraints);
Optimal solution found.

检查返回的 lambda 结构体。由于唯一的问题约束是锥约束,因此只检查 lambda 结构体中的 soc 字段。

disp(lambda.soc)
   1.0e-05 *

    0.0543
    0.1853
    0.0612

约束具有非零的对偶值,指示约束在解处为活动约束。

输入参数

全部折叠

系数向量,指定为实数向量或实数数组。系数向量表示目标函数 f'*x。该表示法假设 f 是列向量,但您也可以使用行向量或数组。coneprog 在内部将 f 转换为列向量 f(:)

示例: f = [1,3,5,-6]

数据类型: double

二阶锥约束,指定为由 SecondOrderConeConstraint 对象组成的向量。使用 secondordercone 函数创建这些对象。

socConstraints 对约束进行编码

Asc(i)xbsc(i)dscT(i)xγ(i)

其中,数组和方程之间的映射如下:

  • Asc(i) = socConstraints.A(i)

  • bsc(i) = socConstraints.b(i)

  • dsc(i) = socConstraints.d(i)

  • γ(i) = socConstraints.gamma(i)

示例: Asc = diag([1 1/2 0]); bsc = zeros(3,1); dsc = [0;0;1]; gamma = -1; socConstraints = secondordercone(Asc,bsc,dsc,gamma);

数据类型: struct

线性不等式约束,指定为实矩阵。AM×N 矩阵,其中 M 是不等式的数目,而 N 是变量的数目(f 的长度)。对于大型问题,将 A 作为稀疏矩阵传递。

A 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 N 个变量组成的列向量 x(:)b 是具有 M 个元素的列向量。

例如,假设有以下不等式:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];
b = [10;20;30];

示例: 要指定 x 的各个分量加起来等于或小于 1,请指定 A = ones(1,N)b = 1

数据类型: double

线性不等式约束,指定为实数向量。b 是与 A 矩阵相关的包含 M 个元素的向量。如果将 b 作为行向量传递,求解器会在内部将 b 转换为列向量 b(:)。对于大型问题,将 b 作为稀疏向量传递。

b 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 N 个变量组成的列向量 x(:)A 是大小为 M×N 的矩阵。

例如,假设有以下不等式:

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30。

通过输入以下约束来指定不等式。

A = [1,2;3,4;5,6];
b = [10;20;30];

示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N)b = 1

数据类型: double

线性等式约束,指定为实矩阵。AeqMe×N 矩阵,其中 Me 是等式的数目,而 N 是变量的数目(f 的长度)。对于大型问题,将 Aeq 作为稀疏矩阵传递。

Aeq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)beq 是具有 Me 个元素的列向量。

例如,请参考以下等式:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。

通过输入以下约束来指定等式。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定 x 分量之和为 1,请指定 Aeq = ones(1,N)beq = 1

数据类型: double

线性等式约束,指定为实数向量。beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。如果将 beq 作为行向量传递,求解器会在内部将 beq 转换为列向量 beq(:)。对于大型问题,将 beq 作为稀疏向量传递。

beq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)Aeq 是大小为 Me×N 的矩阵。

例如,请参考以下等式:

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20。

通过输入以下约束来指定等式。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N)beq = 1

数据类型: double

下界,指定为实数向量或实数数组。如果 f 的长度等于 lb 的长度,则 lb 指定

x(i) >= lb(i)(对于全部 i)。

如果 numel(lb) < numel(f),则 lb 指定

x(i) >= lb(i) (1 <= i <= numel(lb))。

在这种情况下,求解器会发出警告。

示例: 要指定所有 x 分量都为正,请指定 lb = zeros(size(f))

数据类型: double

上界,指定为实数向量或实数数组。如果 f 的长度等于 ub 的长度,则 ub 指定

x(i) <= ub(i)(对于全部 i)。

如果 numel(ub) < numel(f),则 ub 指定

x(i) <= ub(i) (1 <= i <= numel(ub))。

在这种情况下,求解器会发出警告。

示例: 要指定所有 x 分量都小于 1,请使用 ub = ones(size(f))

数据类型: double

优化选项,指定为 optimoptions 的输出。

选项描述
ConstraintTolerance

约束的可行性容差,01 范围内的标量。ConstraintTolerance 测量原始可行性容差。默认值为 1e-6

Display

显示级别(请参阅迭代输出):

  • 'final'(默认值)仅显示最终输出。

  • 'iter' 在每次迭代时显示输出。

  • 'off''none' 不显示输出。

LinearSolver

迭代中求解单步的算法:

  • 'auto'(默认值)- coneprog 选择步长求解器。

    • 如果问题是稀疏的,步长求解器为 'prodchol'

    • 否则,步长求解器为 'augmented'

  • 'augmented' - 增强形式步长求解器。请参阅[1]

  • 'normal' - 标准形式步长求解器。请参阅[1]

  • 'prodchol' - 产品形式乔列斯基步长求解器。请参阅[4][5]

  • 'schur' - Schur 补方法步长求解器。请参阅[2]

如果 'auto' 表现不佳,请对 LinearSolver 尝试以下建议:

  • 对于稀疏问题,请尝试 'normal'

  • 对于有一些密集列或大型锥体的稀疏问题,请尝试 'prodchol''schur'

  • 对于密集问题,请使用 'augmented'

有关稀疏示例,请参阅Compare Speeds of coneprog Algorithms

MaxIterations

允许的迭代最大次数,为正整数。默认值为 200

请参阅容差和停止条件迭代和函数计算次数

MaxTime

算法运行的最长时间(以秒为单位),为一个正数或 Inf。默认值为 Inf,表示禁用此停止条件。

OptimalityTolerance

对偶可行性的终止容差,正标量。默认值为 1e-6

示例: optimoptions('coneprog','Display','iter','MaxIterations',100)

问题结构体,指定为含有以下字段的结构体。

字段名称条目

f

线性目标函数向量 f

socConstraints

二阶锥约束的结构体数组

Aineq

线性不等式约束矩阵

bineq

线性不等式约束向量

Aeq

线性等式约束矩阵

beq

线性等式约束向量
lb由下界组成的向量
ub由上界组成的向量

solver

'coneprog'

options

optimoptions 创建的选项

数据类型: struct

输出参数

全部折叠

解,以实数向量或实数数组形式返回。x 的大小与 f 的大小相同。当 exitflag 值为 -2、-3 或 -10 时,x 输出为空。

解处的目标函数值,以实数形式返回。通常,fval = f'*x。当 exitflag 值为 -2、-3 或 -10 时,fval 输出为空。

coneprog 停止的原因,以整数形式返回。

描述

1

函数收敛于解 x

0

迭代次数超过了 options.MaxIterations,或以秒为单位的求解时间超过了 options.MaxTime

-2

找不到可行点。

-3

此问题无界。

-7

搜索方向的模变得太小。无法取得进一步进展。

-10

此问题在数值上不稳定。

提示

如果出现退出标志 0-7-10,请尝试对 LinearSolver 选项使用不同值。

有关优化过程的信息,以包含下列字段的结构体形式返回。

字段描述
algorithm

使用的优化算法

dualfeasibility

对偶约束违反值的最大值

dualitygap

对偶间隙

iterations

迭代次数

message

退出消息

primalfeasibility

约束违反值的最大值

linearsolver使用的内部步长求解器算法

exitflag 值为 -2、-3 或 -10 时,output 字段 dualfeasibilitydualitygapprimalfeasibility 为空。

解处的对偶变量,以包含下列字段的结构体形式返回。

字段描述
lower

对应于 lb 的下界

upper

对应于 ub 的上界

ineqlin

对应于 Ab 的线性不等式

eqlin

对应于 Aeqbeq 的线性等式

soc对应于 socConstraints 的二阶锥约束

exitflag 值为 -2、-3 或 -10 时,lambda 为空 ([])。

拉格朗日乘数(对偶变量)是以下拉格朗日的一部分,它在解处是固定的(零梯度):

fTx+iλsoc(i)(Asoc(i)xbsoc(i)dsocT(i)x+gamma(i))      +λineqlinT(Axb)+λeqlinT(Aeqxbeq)+λupperT(xub)+λlowerT(lbx).

乘以 lambda 字段的不等式项为非负值。

详细信息

全部折叠

二阶锥约束

为什么约束

AxbdTxγ

称为二阶锥约束?假设三维空间中有一个锥体在 x-y 平面中具有椭圆形横截面,并且直径与 z 坐标成正比。y 坐标的刻度为 ½,而 x 坐标的刻度为 1。定义点在 [0,0,0] 的锥体内部的不等式为

x2+y24z.

coneprog 语法中,此锥体具有以下参数。

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

绘制锥体的边界。

[X,Y] = meshgrid(-2:0.1:2);
Z = sqrt(X.^2 + Y.^2/4);
surf(X,Y,Z)
view(8,2)
xlabel 'x'
ylabel 'y'
zlabel 'z'

Cone with point at zero, widening in the vertical direction.

bgamma 参数用于移动锥体。Ad 参数用于旋转锥体并更改其形状。

算法

该算法使用内点法。有关详细信息,请参阅Second-Order Cone Programming Algorithm

替代功能

App

优化实时编辑器任务为 coneprog 提供可视化界面。

版本历史记录

在 R2020b 中推出

全部展开