主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

coneprog

R2026a

二阶锥规划求解器

描述

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

minxfTx

需满足以下约束

‖Asoc(i)⋅x−bsoc(i)‖≤dsocT(i)⋅x−γ(i)A⋅x≤bAeq⋅x=beqlb≤x≤ub.

f、x、b、beq、lb 和 ub 是向量,A 和 Aeq 是矩阵。对于每个 i,矩阵 Asoc(i)、向量 dsoc(i) 和 bsoc(i) 以及标量 γ(i) 处于使用 secondordercone 创建的二阶锥约束中。

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

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

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

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

  • dsoc(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 处的对偶变量。

示例

示例

全部折叠

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

Asoc = diag([1,1/2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = 0;
socConstraints = secondordercone(Asoc,bsoc,dsoc,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(Asoc*x-bsoc) - dsoc'*x % Near 0 when the constraint is active
ans = 
-2.5677e-08

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

Asoc = diag([1,2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(Asoc,bsoc,dsoc,gamma);

Asoc = diag([3,0,1]);
dsoc = [0;1;0];
socConstraints(2) = secondordercone(Asoc,bsoc,dsoc,gamma);

Asoc = diag([0;1/2;1/2]);
dsoc = [1;0;0];
socConstraints(1) = secondordercone(Asoc,bsoc,dsoc,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];
Asoc = diag([1,4,0]);
bsoc = [0;0;0];
dsoc = [0;0;1];
gamma = 0;
socConstraints = secondordercone(Asoc,bsoc,dsoc,gamma);

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

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

求解。

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

    3.2305
    0.6398
    4.1213

fval = 
-26.9225

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

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

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

Asoc = diag([1,1/2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = 0;
socConstraints = secondordercone(Asoc,bsoc,dsoc,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
   0   0.000000e+00   0.000000e+00   5.714286e-01   2.000000e-01    0.01
   1  -7.558066e+00   0.000000e+00   7.151114e-02   2.502890e-02    0.01
   2  -7.366973e+00   0.000000e+00   1.075440e-02   3.764040e-03    0.01
   3  -8.243432e+00   0.000000e+00   5.191882e-05   1.817159e-05    0.01
   4  -8.246067e+00   0.000000e+00   2.430813e-06   8.507845e-07    0.01
   5  -8.246211e+00   1.387779e-17   6.154504e-09   2.154077e-09    0.01
Optimal solution found.
x = 3×1

    0.4851
    3.8806
    2.0000

fval = 
-8.2462

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

Asoc = diag([1,2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([3,0,1]);
dsoc = [0;1;0];
socConstraints(2) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([0;1/2;1/2]);
dsoc = [1;0;0];
socConstraints(1) = secondordercone(Asoc,bsoc,dsoc,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
   0   0.000000e+00   0.000000e+00   5.333333e-01   9.090909e-02    0.04
   1  -9.696012e+00   5.551115e-17   7.631901e-02   1.300892e-02    0.05
   2  -1.178942e+01   0.000000e+00   1.261803e-02   2.150800e-03    0.05
   3  -1.294426e+01   4.625929e-18   1.683078e-03   2.868883e-04    0.05
   4  -1.295217e+01   1.850372e-17   8.994595e-04   1.533170e-04    0.05
   5  -1.295331e+01   0.000000e+00   4.748841e-04   8.094615e-05    0.05
   6  -1.300753e+01   9.251859e-18   2.799942e-05   4.772628e-06    0.05
   7  -1.300671e+01   9.251859e-18   2.366136e-05   4.033187e-06    0.05
   8  -1.300850e+01   1.850372e-17   8.259278e-06   1.407831e-06    0.05
   9  -1.300842e+01   3.700743e-17   7.366918e-06   1.255725e-06    0.05
  10  -1.300864e+01   1.850372e-17   2.647853e-06   4.513386e-07    0.05
  11  -1.300892e+01   1.850372e-17   4.467886e-08   7.615715e-09    0.05
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = 
-13.0089

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

Asoc = diag([1,2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([3,0,1]);
dsoc = [0;1;0];
socConstraints(2) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([0;1/2;1/2]);
dsoc = [1;0;0];
socConstraints(1) = secondordercone(Asoc,bsoc,dsoc,gamma);
f = [-1;-2;-4];
options = optimoptions("coneprog",Display="iter");
Aineq = [];
bineq = [];
Aeq = [];
beq = [];
lb = [];
ub = [];

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

[x,fval,exitflag,output] = coneprog(f,socConstraints,Aineq,bineq,Aeq,beq,lb,ub,options)
Iter           Fval  Primal Infeas    Dual Infeas    Duality Gap    Time
   0   0.000000e+00   0.000000e+00   5.333333e-01   9.090909e-02    0.06
   1  -9.696012e+00   1.850372e-17   7.631901e-02   1.300892e-02    0.09
   2  -1.178942e+01   1.850372e-17   1.261803e-02   2.150800e-03    0.09
   3  -1.294426e+01   9.251859e-18   1.683078e-03   2.868883e-04    0.09
   4  -1.295217e+01   9.251859e-18   8.994595e-04   1.533170e-04    0.10
   5  -1.295331e+01   1.850372e-17   4.748841e-04   8.094615e-05    0.10
   6  -1.300753e+01   1.850372e-17   2.799942e-05   4.772628e-06    0.10
   7  -1.300671e+01   3.700743e-17   2.366136e-05   4.033187e-06    0.10
   8  -1.300850e+01   9.251859e-18   8.232024e-06   1.403186e-06    0.10
   9  -1.300843e+01   4.625929e-18   7.388668e-06   1.259432e-06    0.11
  10  -1.300861e+01   9.251859e-18   2.727129e-06   4.648516e-07    0.11
  11  -1.300891e+01   0.000000e+00   1.544274e-07   2.632285e-08    0.11
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = 
-13.0089
exitflag = 
1
output = struct with fields:
           iterations: 11
    primalfeasibility: 0
      dualfeasibility: 1.5443e-07
           dualitygap: 2.6323e-08
            algorithm: 'interior-point'
         linearsolver: 'augmented'
              message: 'Optimal solution found.'

  • 迭代显示和输出结构都表明,coneprog 经过 11 次迭代才得出解。

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

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

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

f'*x
ans = 
-13.0089

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

Asoc = diag([1,2,0]);
bsoc = zeros(3,1);
dsoc = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([3,0,1]);
dsoc = [0;1;0];
socConstraints(2) = secondordercone(Asoc,bsoc,dsoc,gamma);
Asoc = diag([0;1/2;1/2]);
dsoc = [1;0;0];
socConstraints(1) = secondordercone(Asoc,bsoc,dsoc,gamma);
f = [-1;-2;-4];

求解问题,请求在解处的对偶变量以及所有其他 coneprog 输出。

[x,fval,exitflag,output,lambda] = coneprog(f,socConstraints);
Optimal solution found.

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

disp(lambda.soc)
    5.9356
    4.6079
    2.4654

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

输入参数

全部折叠

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

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

数据类型: double

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

socConstraints 对约束进行编码

‖Asoc(i)⋅x−bsoc(i)‖≤dsocT(i)⋅x−γ(i)

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

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

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

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

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

示例: Asoc = diag([1 1/2 0]); bsoc = zeros(3,1); dsoc = [0;0;1]; gamma = -1; socConstraints = secondordercone(Asoc,bsoc,dsoc,gamma);

线性不等式约束,指定为实矩阵。A 是 M×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 以如下形式编写 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。

数据类型: single | double

线性等式约束,指定为实矩阵。Aeq 是 Me×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 以如下形式编写 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。

数据类型: single | 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 的输出。

MATLAB 选项
选项描述
ConstraintTolerance

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

Display

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

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

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

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

LinearSolver

迭代中求解单步的算法:

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

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

    • 否则,步长求解器为 "augmented"。

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

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

  • "normal-dense" - 使用稠密线性代数的标准形式步长求解器。

  • "prodchol" - 乘积形式乔列斯基步长求解器。请参阅[4]和[5]。

  • "schur" - 舒尔补方法步长求解器。请参阅[2]。

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

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

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

  • 对于稠密问题,请使用 'normal-dense' 或 'augmented'。

有关稀疏示例,请参阅比较 coneprog 算法的速度。

MaxIterations

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

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

MaxTime

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

OptimalityTolerance

相对对偶间隙的终止容差,非负标量。有关定义,请参阅公式 5。默认值为 1e-6。

代码生成
ConstraintTolerance

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

Display

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

  • 'off'、'none' 和默认的 'final' 都不显示输出。

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

迭代显示不会在生成的代码中显示时间列。

LinearSolver

迭代中求解单步的算法:

  • 'augmented'(默认)- 增强形式步骤求解器。请参阅[1]。

  • 'normal' 或 'normal-dense' - 范式步骤求解器。请参阅[1]。

对于代码生成,LinearSolver 的选择有限。代码生成后,您无法更改 LinearSolver 选项的值。换句话说,coneprog 仅支持 LinearSolver 选项的静态值来生成代码。

MaxIterations

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

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

OptimalityTolerance

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

代码生成不支持 MaxTime 选项。

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

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

字段名称条目

f

线性目标函数向量 f

socConstraints

二阶锥约束的结构体数组,或 SecondOrderConeConstraint 对象的元胞数组。如果使用元胞数组,请确保该数组为单个 1×1 元胞,例如

cons = {soc1 soc2 soc3};
problem.socConstraints = {cons};

Aineq

线性不等式约束矩阵

bineq

线性不等式约束向量

Aeq

线性等式约束矩阵

beq

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

solver

'coneprog'

options

用 optimoptions 创建的选项

小心

problem 参量必须是一个标量结构体。如果将锥形约束作为元胞数组创建,则生成的问题结构可以是非标量结构体数组。为确保 problem 为标量,请传入 {{soc1 soc2 ... socn}} 或传入一个锥形约束向量。

数据类型: struct

输出参量

全部折叠

解,以实数向量或实数数组形式返回。x 的大小与 f 的大小相同。当 exitflag 值为 –x、–NaN 或 –2 时,3 输出为空(对于代码生成为 10)。

解处的目标函数值,以实数形式返回。通常,fval = f'*x。当 exitflag 值为 –fval、–NaN 或 –2 时,3 输出为空(对于代码生成为 10)。

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

值描述

1

函数收敛于解 x。

0

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

-2

找不到可行点。

-3

此问题无界。

-7

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

-8

步骤未定义,算法因奇异系统而无法继续。仅使用稀疏数据生成代码。切换到完整数据而非稀疏数据可帮助求解器顺利完成求解。

-10

此问题在数值上不稳定。

提示

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

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

字段描述
algorithm

'interior point'

dualfeasibility

对偶约束违反值的最大值

dualitygap

对偶间隙

iterations

迭代次数

message

退出消 - 在代码生成中不可用

primalfeasibility

约束违反值的最大值

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

当 exitflag 值为 –2、-3 或 –10 时,output 字段 algorithm、dualfeasibility、dualitygap、linearsolver 和 primalfeasibility 为空(对于代码生成,数值为 NaN)。

对于代码生成,iterations 字段具有 int32 类型,而不是 double 类型。

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

字段描述
lower

对应于 lb 的下界

upper

对应于 ub 的上界

ineqlin

对应于 A 和 b 的线性不等式

eqlin

对应于 Aeq 和 beq 的线性等式

soc对应于 socConstraints 的二阶锥约束

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

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

fTx+∑iλsoc(i)(‖Asoc(i)x−bsoc(i)‖−dsocT(i)x+γ(i))      +λineqlinT(Ax−b) +λeqlinT(Aeq x−beq)+λupperT(x−ub)+λlowerT(lb−x).

详细信息

全部折叠

算法

该算法使用内点法。有关详细信息,请参阅二阶锥规划算法。

替代功能

App

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

扩展功能

全部展开

版本历史记录

在 R2020b 中推出

全部展开