上海浦东做网站的公司,广州开发区第二小学北校区,app开发大概多少钱,网页设计代码显示时间博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中约束条件操作相关函数的用法。
1.约束条件操作的相关函数
1.1 boundingbox函数 boundingbox函数用于求出一组约… 博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中约束条件操作相关函数的用法。
1.约束条件操作的相关函数
1.1 boundingbox函数 boundingbox函数用于求出一组约束条件中所包含变量的上下限即提取约束条件中变量的显式边界使用语法如下
[B,L,U] boundingbox(Constraint,options,x) 其中Constraint表示约束条件(必要输入)options表示Yalmip设置(可选输入)x表示需要提取边界的变量可选输入B为变量x的上下限约束为lmi变量形式L和U分别表示变量的上下限均为矩阵形式(可选输出)下面是一个简单的示例 例1使用boundingbox求出约束x²y²4中变量的上下界并画图展示
sdpvar x y
Ball x^2y^2 4;
[Box,L,U] boundingbox(Ball);
plot(Box,[x y]);
hold on
plot(Ball,[x y],y) 运行结果 图1 boundingbox函数效果展示
L -2.0000 -2.0000
U 2.0000 2.0000 光看上面的例子可能很难体会到这个函数的作用但其实这个函数在求解优化问题时是非常有用的。我们知道在求解优化问题的过程中经常会有非线性项需要用到大M法将其转为线性项这时候如果可以确定变量的边界将会非常有效地提高优化问题求解效率下面进行举例说明
例2有1个0-1变量x和1个大于0的连续变量y相乘使用大M法将其线性化。 引入大于0的连续辅助变量zxy可以使用变量z和3个辅助约束条件代替这个非线性项 z≤Mxz≤yz≥y-M(1-x) 其中M是变量y的一个上界下面分析一下两者是否等效 1)当x0时由zxy可得z0由z≤Mx和z≥0同样可得z0两者等效 2)当x1时由zxy可得zy由z≤Mxz≤yz≥y-M(1-x)可得z≤y且z≥y即zy两者仍然等效。 但在实际使用时M的取值不能太大也不能太小如果M取值太大可能会因为浮点数精度的问题造成约束的偏差也扩大了约束的范围降低求解效率如果M取值太小甚至小于变量y的上界那可能会改变变量y的取值范围甚至导致模型不可解(例如变量y∈[0,100]M取了50那么约束z≤Mx会将y的范围限制在[0,50]之间改变了y的取值范围)。 因此M最合适的取值就是y的上限使用boundingbox函数可以方便的求出变量的上界这就是其作用所在求出变量的上界之后如果Yalmip建模时用到了大M法将会自动使用变量的上界进行等效转换。
1.2 chebyball函数 chebyball函数用于求解一组约束条件所限定的边界中最大的内切圆(如果有3个或以上的变量就是内切球以及内切超球体)其基本语法如下
[xc,r] chebyball(Constraint,options) 其中Constraint表示约束条件options表示Yalmip选项xc和r分别表示内切圆的圆心坐标和半径。举例说明如下
例3已知变量x和y满足约束0≤x≤10≤y≤1画出该范围内最大的圆。 代码和运行结果如下
sdpvar x y
Box -1 [x y] 1;
[xc,r] chebyball(Box);
plot(Box);
hold on
plot((x-xc(1))^2 (y-xc(2))^2 r^2,[],y) 运行结果 图2 chebyball函数效果展示 例3和例1正好正好是一个逆向过程。
1.3 check函数 check函数用在约束问题求解之后用于检查约束条件的满足情况其基本语法如下
[pres,dres] check(F) 其中F表示约束条件pres和dres分别表示原始约束和对偶约束的残差残差即为约束实际取值和约束条件边界的偏差值当约束条件满足时残差为正数当约束条件不满足时残差为负数(具体理论不做介绍可以使用help check或者自行查找相关理论)举例说明如下
例4
sdpvar x
F0 [x 1];
F1 [x 1.25];
F2 [0.9 x 1.2];
F3 [x 2];
optimize(F0);
[pres1,dres1] check(F1);
[pres2,dres2] check(F2);
[pres3,dres3] check(F3);
pres1
pres2
pres3 运行结果
pres1 -0.250
pres2 0.1000
pres3 -1 x实际取值为1约束条件F1不满足所以残差为负数取值为-0.25约束条件F2满足所以残差为正数取值为0.1约束条件F3不满足所以残差为负数取值为-1。在调试代码时check函数可以发挥很大作用。
1.4 dual函数 dual函数用于求出与约束条件相应的对偶变量其语法如下
Z dual(F) 其中F表示约束条件Z表示其对偶变量的取值。由于该方法是直接获取对偶变量的取值所以一般都需要优化问题求解成功后才可以使用。首先来看官方文档给出的例子学习一下dual函数的用法。
例5求解优化问题后使用dual函数提取约束条件对应的对偶变量。
A [-1 2;-3 -4];
P sdpvar(2,2);
F [P 0, A*PP*A 0, trace(P) 1];
optimize(F);
Z2 dual(F(2));
运行结果
Z2 1.0e-09 * 0.8605 -0.1947 -0.1947 0.0440 求解优化问题后使用dual函数就可以求出某个约束条件对应的对偶变量取值。由线性规划的理论可知如果原问题具有最优解那么当原问题取得最优解时其对偶问题也取得最优解且两个问题的最优目标函数相同我们用一个例子来验证
例6已知一个线性规划的原问题和对偶问题使用dual函数验证强对偶定理(即原问题的最优解和对偶问题的最优解相同) 原问题为 对偶问题为 matlab代码和运行结果
sdpvar x1 x2
z 50*x1 100*x2;
F [ x1 x2 300 , ...2*x1 x2 400 , ...x2 500 , x1 0 , x2 0];
optimize(F , -z)
y dual(F(1:3))
z value(z)
w [300 400 250]*y
运行结果
y 100 0 0
z 30000
w 30000 由结果可知原问题和对偶问题的最优解相等满足强对偶定理。
1.5 hull函数 hull函数用于求出一组约束条件的凸包(convex hull此处不再做理论介绍只介绍用法)标准语法如下
F hull(F1,F2,...) 其中F1F2...表示原始的约束条件F表示这组约束条件的凸包官方文档中用图形直观地展示了这个函数的作用
例7
sdpvar x y
F1 [-1 x 1, -1 y 1];
F2 [-1.5 x-y 1.5, -1.5 xy 1.5];
H hull(F1,F2);
plot(H);hold on
plot(F2);
plot(F1);
运行结果
图3 约束条件和相应的convex hull
1.6 vertex函数 (该函数仅最新版yalmip才有如果没有去官网下载最新版即可)vertex函数用于求出一组约束的顶点其标准语法如下
V vertex(Constraint,[x]) 其中Constraint表示约束条件x表示决策变量V表示顶点坐标举例说明如下
例8 二维空间
x sdpvar(2,1);
B [-1 x 1, sum(x) 3/2];
clf
plot(B,[],[],[],sdpsettings(plot.shade,0.1));
hold on;grid on
v vertex(B,x);
m plot(v(1,:),v(2,:),bo);
set(m,Markersize,10);
set(m,Markerface,yellow); 三维空间
x sdpvar(3,1);
P [-1 x 1, sum(abs(x)) 1,sum(x).5]
clf
plot(P,x,[],[],sdpsettings(plot.shade,0.1));
hold on;grid on
v vertex(P,x);
m plot3(v(1,:),v(2,:),v(3,:),bo);
set(m,Markersize,10);
set(m,Markerface,yellow); 运行结果为 图4 二维约束的顶点 图5 三维约束的顶点 2.调试小技巧给约束命名 当所求优化问题比较复杂时有的时候很难记住每个约束在对应的约束变量中是第几个位置调试代码时很不方便这时候可以使用一个:加上一个字符串就可以给约束命名用于在约束变量中打上标记。例如
sdpvar x
Constraints [(x 0):Positivity,(x 1):Bounded] 运行结果 当需要用到某个约束时还可以用对应的’Tag’来索引例如
sdpvar x
Constraints [(x 0):Positivity,(x 1):Bounded];
Constraints(Bounded) 运行结果