coneprog
二阶锥编程求解器
语法
描述
的coneprog
函数是一个二阶锥编程求解器,它可以找到指定的问题的最小值
受限于
f,x,b,说真的,磅,乌兰巴托是向量,并且一个而且Aeq矩阵。为每一个我,矩阵一个sc(我),向量dsc(我),bsc(我)和标量γ(我)的二阶锥约束,您可以使用secondordercone
.
有关锥约束的详细信息,请参见二阶锥约束.
求解了约束条件下的二阶锥规划问题x
= coneprog (f
,socConstraints
)socConstraints
编码为
一个sc(我) =
socConstraints(我)。一个
bsc(我) =
socConstraints(我)。b
dsc(我) =
socConstraints .d(我)
γ(我) =
socConstraints(我)可以利用
例子
单锥约束
要使用二阶锥约束来设置问题,请创建一个二阶锥约束对象。
A = diag([1,1/2,0]);B = 0 (3,1);D = [0;0;1];Gamma = 0;socConstraints = seconddordercone (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)
找到最优解。
x =3×10.4851 3.8806 2.0000
Fval = -8.2462
解决方案组件x (3)
在它的上界。锥约束在解处是活动的:
norm(A*x-b) - d'*x%当约束处于活动状态时,接近0
Ans = -2.5677e-08
几个圆锥约束
要用几个二阶锥约束设置一个问题,请创建一个约束对象数组。为了节省时间和内存,请先创建索引最高的约束。
A = diag([1,2,0]);B = 0 (3,1);D = [0;0;1];Gamma = -1;socConstraints(3) = seconddordercone (A,b,d,gamma);A = diag([3,0,1]);D = [0;1;0];socConstraints(2) = seconddordercone (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)
找到最优解。
x =3×10.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 = seconddordercone (Asc,b,d,gamma);
指定一个线性不等式约束。
A = [1/4,1/9,1];B = 5;
解决问题。
[x,fval] = coneprog(f,socConstraints,A,b)
找到最优解。
x =3×13.2304 0.6398 4.1213
Fval = -26.9225
使用非默认选项的圆锥编程
来观察的迭代coneprog
求解器,设置显示
选项“通路”
.
选项= optimoptions(“coneprog”,“显示”,“通路”);
创建一个二阶锥规划问题,并使用选项
.
Asc = diag([1,1/2,0]);B = 0 (3,1);D = [0;0;1];Gamma = 0;socConstraints = seconddordercone (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原始Infeas双Infeas对偶缺口时间1 0.000000e+00 0.000000e+00 5.714286e-01 1.250000e-01 0.01 2 -7.558066e+00 0.000000e+00 7.151114e-02 1.564306e-02 0.02 3 -7.366973e+00 2.775558e-17 1.075440e-02 2.352525e-03 0.02 4 -8.243432e+00 1.387779e-17 5.191882e-05 1.135724e-05 0.02 5 -8.246067e+00 0.000000e+00 2.430813e-06 5.317403e-07 0.02 6 -8.246211e+00 1.387779e-17 6.154504e-09 1.346298e-09找到最优解。
x =3×10.4851 3.8806 2.0000
Fval = -8.2462
问题结构的锥程序设计
创建一个二阶锥规划问题的元素。为了节省时间和内存,请先创建索引最高的约束。
A = diag([1,2,0]);B = 0 (3,1);D = [0;0;1];Gamma = -1;socConstraints(3) = seconddordercone (A,b,d,gamma);A = diag([3,0,1]);D = [0;1;0];socConstraints(2) = seconddordercone (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”,“显示”,“通路”);
用必需的字段创建问题结构,如问题.
问题= struct(“f”f...“socConstraints”socConstraints,...“Aineq”[],“bineq”[],...“Aeq”[],“说真的”[],...“磅”[],乌兰巴托的[],...“规划求解”,“coneprog”,...“选项”、选择);
打电话解决问题coneprog
.
[x,fval] = coneprog(problem)
Iter Fval主Infeas双Infeas对偶缺口时间1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.06 2 -9.696012e+00 5.551115e-17 7.631901e-02 7.949897e-03 0.07 3 -1.178942e+01 3.700743e-17 1.683078e-03 1.753206e-04 0.07 5 -1.295217e+01 9.251859e-18 8.994595e-04 9.369370e-05 0.07 7 -1.300753e+01 9.251859e-18 2.799942e-05 2.916606e-06 0.07 -1.300671e+01 9.251859e-18 2.799942e-05 2.916606e-06 0.07 -1.300671e+01 9.251859e-18 2.799942e-05 9.251859e-182.3.66136e-05 2.464725e-06 0.07 9 -1.300850e+01 9.251859e-18 8.222244e-06 8.564838e-07 0.07 10 -1.300843e+01 1.850372e-17 7.318333e-06 7.623264e-07 0.07 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.08 Optimal solution found.
x =3×10.4238 1.6477 2.3225
Fval = -13.0089
检查coneprog
解决方案的过程
创建一个二阶锥规划问题。为了节省时间和内存,请先创建索引最高的约束。
A = diag([1,2,0]);B = 0 (3,1);D = [0;0;1];Gamma = -1;socConstraints(3) = seconddordercone (A,b,d,gamma);A = diag([3,0,1]);D = [0;1;0];socConstraints(2) = seconddordercone (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”,“显示”,“通路”);A = [];B = [];Aeq = [];Beq = [];Lb = [];Ub = [];
解决问题,请求有关解决方案过程的信息。
[x,fval,exitflag,output] = coneprog(f,socConstraints,A,b,Aeq,beq,lb,ub,options)
Iter Fval主Infeas双Infeas对偶缺口时间1 0.000000e+00 0.000000e+00 5.333333e-01 5.555556e-02 0.03 2 -9.696012e+00 5.551115e-17 7.631901e-02 7.949897e-03 0.03 3 -1.178942e+01 3.700743e-17 1.683078e-03 1.753206e-04 0.03 5 -1.295217e+01 9.251859e-18 8.994595e-04 9.369370e-05 0.03 6 -1.295331e+01 9.251859e-18 4.748841e- 05 4.946709e-05 0.03 7 - 1.30073e +01 9.251859e-18 2.799942e-05 2.916606e-06 0.03 8 -1.300671e+01 9.251859e-18 2.799942e-05 9.251859e-182.3.66136e-05 2.464725e-06 0.03 9 -1.300850e+01 9.251859e-18 8.222244e-06 8.564838e-07 0.03 10 -1.300843e+01 1.850372e-17 7.318333e-06 7.623264e-07 0.03 11 -1.300865e+01 9.251859e-18 2.636568e-06 2.746425e-07 0.04 12 -1.300892e+01 1.850372e-17 3.407939e-08 3.549936e-09 0.04 Optimal solution found.
x =3×10.4238 1.6477 2.3225
Fval = -13.0089
Exitflag = 1
输出=带字段的结构:迭代:12 primal可行性:1.8504e-17 dual可行性:3.4079e-08 dualitygap: 3.5499e-09算法:'内点'线性求解器:'增强'消息:'找到最优解决方案。'
迭代显示和输出结构都显示了这一点
coneprog
用了12次迭代才得到解决方案。退出标志值
1
和output.message
价值“找到了最佳解决方案。”
表示该解决方案可靠。的
输出
结构表明,不可行性倾向于通过解决过程减少,对偶差距也是如此。你可以复制
fval
乘以输出f ' * x
.
f ' * x
Ans = -13.0089
获得coneprog
双变量
创建一个二阶锥规划问题。为了节省时间和内存,请先创建索引最高的约束。
A = diag([1,2,0]);B = 0 (3,1);D = [0;0;1];Gamma = -1;socConstraints(3) = seconddordercone (A,b,d,gamma);A = diag([3,0,1]);D = [0;1;0];socConstraints(2) = seconddordercone (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);
找到最优解。
检查归来者λ
结构。因为唯一的问题约束是锥约束,只检查soc
在λ
结构。
disp (lambda.soc)
1.0e-06 * 0.2109 0.7204 0.3662
约束具有非零对偶值,表明约束在解处是活动的。
输入参数
f
- - - - - -系数向量
真正的向量|真正的数组
系数向量,指定为实向量或实数组。系数向量表示目标函数f ' * x
.这个符号假设f
是列向量,但也可以使用行向量或数组。在内部,coneprog
转换f
对列向量f (:)
.
例子:F = [1,3,5,-6]
数据类型:双
socConstraints
- - - - - -二阶锥约束
向量的SecondOrderConeConstraint
对象
二阶锥约束,指定为向量SecondOrderConeConstraint
对象。属性创建这些对象secondordercone
函数。
socConstraints
编码约束
其中数组与方程的映射如下:
一个sc(我) =
socConstraints.A(我)
bsc(我) =
socConstraints.b(我)
dsc(我) =
socConstraints.d(我)
γ(我) =
socConstraints.gamma(我)
例子:Asc = diag([1 1/2 0]);BSC = 0 (3,1);DSC = [0;0;1];Gamma = -1;socConstraints = secondordercone(Asc,bsc,dsc,gamma);
数据类型:结构体
一个
- - - - - -线性不等式约束
真正的矩阵
线性不等式约束,指定为实矩阵。一个
是一个米
——- - - - - -N
矩阵,米
不等式的数量,和N
变量的数量(长度f
).对于大问题,可以通过一个
作为一个稀疏矩阵。
一个
编码米
线性不等式
A*x <= b
,
在哪里x
列向量是N
变量x (:)
,b
列向量是米
元素。
例如,考虑以下不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30。
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6];B = [10;20;30];
例子:要指定x分量之和小于等于1,取A = ones(1,N)
而且B = 1
.
数据类型:双
b
- - - - - -线性不等式约束
真正的向量
线性不等式约束,指定为实向量。b
是一个米
元素的相关向量一个
矩阵。如果你通过了b
作为行向量,解算器内部转换b
对列向量b (:)
.对于大问题,可以通过b
作为一个稀疏向量。
b
编码米
线性不等式
A*x <= b
,
在哪里x
列向量是N
变量x (:)
,一个
矩阵的大小米
——- - - - - -N
.
例如,考虑以下不等式:
x1+ 2x2≤10
3.x1+ 4x2≤20
5x1+ 6x2≤30。
通过输入以下约束来指定不等式。
A = [1,2;3,4;5,6];B = [10;20;30];
例子:要指定x分量的和为1或更小,请使用A = ones(1,N)
而且B = 1
.
数据类型:双
Aeq
- - - - - -线性等式约束
真正的矩阵
线性等式约束,指定为实矩阵。Aeq
是一个我
——- - - - - -N
矩阵,我
等式的个数,和N
变量的数量(长度f
).对于大问题,可以通过Aeq
作为一个稀疏矩阵。
Aeq
编码我
线性等式
Aeq*x = beq
,
在哪里x
列向量是N
变量x (:)
,说真的
列向量是我
元素。
例如,考虑以下等式:
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
.
数据类型:双
说真的
- - - - - -线性等式约束
真正的向量
线性等式约束,指定为实向量。说真的
是一个我
元素的相关向量Aeq
矩阵。如果你通过了说真的
作为行向量,解算器内部转换说真的
对列向量说真的(:)
.对于大问题,可以通过说真的
作为一个稀疏向量。
说真的
编码我
线性等式
Aeq*x = beq
,
在哪里x
列向量是N
变量x (:)
,Aeq
矩阵的大小我
——- - - - - -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
.
数据类型:双
磅
- - - - - -下界
真正的向量|真正的数组
下界,指定为实向量或实数组。如果的长度f
等于的长度磅
,然后磅
指定
X (i) >= lb(i)
对所有我
.
如果数值(lb) <数值(f)
,然后磅
指定
X (i) >= lb(i)
为1 <= I <= number (lb)
.
在这种情况下,求解器发出警告。
例子:要指定所有x分量都是正的,使用Lb = 0 (size(f))
.
数据类型:双
乌兰巴托
- - - - - -上界
真正的向量|真正的数组
上界,指定为实向量或实数组。如果的长度f
等于的长度乌兰巴托
,然后乌兰巴托
指定
X (i) <= ub(i)
对所有我
.
如果Numel (ub) < Numel (f)
,然后乌兰巴托
指定
X (i) <= ub(i)
为1 <= I <= numel(ub)
.
在这种情况下,求解器发出警告。
例子:指定所有x分量都小于1
,使用Ub = ones(size(f))
.
数据类型:双
选项
- - - - - -优化选项
的输出optimoptions
的优化选项,指定为的输出optimoptions
.
选项 | 描述 |
---|---|
ConstraintTolerance |
可行性公差为约束,一个标量从 |
|
显示水平(见迭代显示):
|
LinearSolver |
迭代中求解某一步的算法: 如果
有关稀疏示例,请参见比较coneprog算法的速度. |
|
允许的最大迭代次数,一个正整数。默认为 |
MaxTime |
算法运行的最大时间(以秒为单位),一个正数或 |
|
终止公差对对偶可行,为正标量。默认为 |
例子:optimoptions(‘coneprog’,‘显示’,‘iter’,‘MaxIterations’,100)
问题
- - - - - -问题的结构
结构
问题结构,指定为具有以下字段的结构。
字段名 | 条目 |
---|---|
|
线性目标函数向量f |
|
构造二阶锥约束数组 |
|
线性不等式约束矩阵 |
|
线性不等式约束向量 |
|
线性等式约束矩阵 |
|
线性等式约束的向量 |
磅 |
下界向量 |
乌兰巴托 |
上界向量 |
|
“coneprog” |
|
创建的选项optimoptions |
数据类型:结构体
输出参数
fval
-解处的目标函数值
实数
目标函数在解处的值,作为实数返回。一般来说,fval
=f ' * x
.的fval
时,输出为空exitflag
取值为-2
,3.
,或-10
.
exitflag
- - -原因coneprog
停止
整数
原因coneprog
停止,以整数形式返回。
价值 | 描述 |
---|---|
|
函数收敛为解 |
|
超过迭代次数 |
|
没有找到可行点。 |
|
这个问题是无界的。 |
|
搜索方向变得太小了。没有进一步的进展。 |
|
这个问题在数值上不稳定。 |
提示
如果你得到退出标志0
,7
,或-10
的值,尝试使用不同的值LinearSolver
选择。
输出
—优化过程信息
结构
关于优化过程的信息,作为带有这些字段的结构返回。
场 | 描述 |
---|---|
算法 |
所使用的优化算法 |
dualfeasibility |
双重约束违反的最大值 |
dualitygap |
二元性的差距 |
迭代 |
迭代次数 |
消息 |
退出消息 |
primalfeasibility |
约束违反的最大值 |
linearsolver |
采用内部步进求解算法 |
的输出
字段dualfeasibility
,dualitygap
,primalfeasibility
为空时,exitflag
取值范围为-2、-3或-10。
更多关于
二阶锥约束
为什么是约束
叫做二阶锥约束?考虑三维空间中的一个圆锥,其截面为椭圆x-y平面,与直径成正比z坐标。的y坐标的比例是1 / 2,而x坐标的刻度为1。定义这个圆锥体内部点为[0,0,0]的不等式为
在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 =√(X。²+ y .²/4);surf(X,Y,Z) view(8,2) xlabel“x”ylabel“y”zlabel“z”
的b
而且γ
参数移动圆锥体。的一个
而且d
参数旋转圆锥体并改变其形状。
算法
该算法采用内点法。详细信息请参见二阶锥规划算法.
选择功能
应用程序
的优化活动编辑器任务提供了一个可视化界面coneprog
.
版本历史
R2020b中介绍MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。