SeDuMi解决SDP(简单例子)
Solve SDP by SeDuMi (simple example)
我正在考虑以下半定规划:
变量 y =[y00 ; y10 ; y01 ; y20 ; y11 ; y02] 所以维度是 6.
我的 MATLAB 代码是
A1 = zeros(3,3); A2 = zeros(3,3); A3 = zeros(3,3);
A4 = zeros(3,3); A5 = zeros(3,3); A6 = zeros(3,3);
A0 = zeros(3,3); % F0
A1(1,1)=1; %y00 F1
A2(1,2)=1; A2(2,1)=1; %y10 F2
A3(1,3)=1; A3(3,1)=1; %y01 F3
A4(2,2)=1; %y20 F4
A5(2,3)=1; A5(3,2)=1; %y11 F5
A6(3,3)=1; %y02 F6
F0 = A0;
F1 = A1; F2 = A2; F3 = A3; F4 = A4; F5 = A5; F6 = A6;
c = [0;0;0;1;0;1]; btt = -c; % object function
A = [0 0 1 0 0 0;
0 0 0 0 2 0]; % Equality constraint A
b = [-1;-1]; delta = [10^-8;10^-8]; hatb = b-delta;
At = -[vec(F1) vec(F2) vec(F3) vec(F4) vec(F5) vec(F6)]; Att = [-A;At];
ctt = [-hatb;vec(F0)];
K.l = size(A,1);
K.s = size(F0,1);
[x,y,info] = sedumi(Att,btt,ctt,K);
y
我阅读了以下教程:
https://www.ece.uvic.ca/~wslu/Talk/SeDuMi-Remarks.pdf(来自第 7 页的 SDP)
注意
- 在p.9,我们要求Ay>=b。但是,我的约束之一是“=”。所以我减去 \delta(非常小的数),这样我就可以制定 Ay>=b。
- 不等式约束可以表示为
y00*A1 + y10*A2 + ....>= 0
- 我得到的y很小(只有y00=0.0287)而且y02不等于y02。 (与上面给出的答案不同)
我不确定哪里出错了。请给我一些建议。
提前致谢。
为什么减去一个小的增量与将不等式转化为等式有什么关系?等式将是双面不等式(即两个等式将给出四个元素约束)
但是,这里正确的方法是使用 K.f 字段来传达相等性。
更好的是,您的模型应该被解释为原始标准形式的表示,这意味着您只应该有两个 A 矩阵来传达两个等式。
也许你应该使用 YALMIP 或 CVX 等建模工具来避免所有这些低级的细节,除了这些小问题之外,这些细节对任何事情来说都是可怕的
承接之前的回答:比如10x = 4,但是你需要把它放到一个不等式中,你也可以这样说:
10x <= 4 和 10x >=4。
此外,我建议您改为查看以下内容:
http://sedumi.ie.lehigh.edu/sedumi/files/sedumi-downloads/SeDuMi_Guide_11.pdf
我正在考虑以下半定规划:
变量 y =[y00 ; y10 ; y01 ; y20 ; y11 ; y02] 所以维度是 6.
我的 MATLAB 代码是
A1 = zeros(3,3); A2 = zeros(3,3); A3 = zeros(3,3);
A4 = zeros(3,3); A5 = zeros(3,3); A6 = zeros(3,3);
A0 = zeros(3,3); % F0
A1(1,1)=1; %y00 F1
A2(1,2)=1; A2(2,1)=1; %y10 F2
A3(1,3)=1; A3(3,1)=1; %y01 F3
A4(2,2)=1; %y20 F4
A5(2,3)=1; A5(3,2)=1; %y11 F5
A6(3,3)=1; %y02 F6
F0 = A0;
F1 = A1; F2 = A2; F3 = A3; F4 = A4; F5 = A5; F6 = A6;
c = [0;0;0;1;0;1]; btt = -c; % object function
A = [0 0 1 0 0 0;
0 0 0 0 2 0]; % Equality constraint A
b = [-1;-1]; delta = [10^-8;10^-8]; hatb = b-delta;
At = -[vec(F1) vec(F2) vec(F3) vec(F4) vec(F5) vec(F6)]; Att = [-A;At];
ctt = [-hatb;vec(F0)];
K.l = size(A,1);
K.s = size(F0,1);
[x,y,info] = sedumi(Att,btt,ctt,K);
y
我阅读了以下教程:
https://www.ece.uvic.ca/~wslu/Talk/SeDuMi-Remarks.pdf(来自第 7 页的 SDP)
注意
- 在p.9,我们要求Ay>=b。但是,我的约束之一是“=”。所以我减去 \delta(非常小的数),这样我就可以制定 Ay>=b。
- 不等式约束可以表示为 y00*A1 + y10*A2 + ....>= 0
- 我得到的y很小(只有y00=0.0287)而且y02不等于y02。 (与上面给出的答案不同)
我不确定哪里出错了。请给我一些建议。
提前致谢。
为什么减去一个小的增量与将不等式转化为等式有什么关系?等式将是双面不等式(即两个等式将给出四个元素约束)
但是,这里正确的方法是使用 K.f 字段来传达相等性。
更好的是,您的模型应该被解释为原始标准形式的表示,这意味着您只应该有两个 A 矩阵来传达两个等式。
也许你应该使用 YALMIP 或 CVX 等建模工具来避免所有这些低级的细节,除了这些小问题之外,这些细节对任何事情来说都是可怕的
承接之前的回答:比如10x = 4,但是你需要把它放到一个不等式中,你也可以这样说: 10x <= 4 和 10x >=4。
此外,我建议您改为查看以下内容: http://sedumi.ie.lehigh.edu/sedumi/files/sedumi-downloads/SeDuMi_Guide_11.pdf