-
Notifications
You must be signed in to change notification settings - Fork 0
/
example_pop_no_strong_duality.m
62 lines (51 loc) · 1.16 KB
/
example_pop_no_strong_duality.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
clc; clear; close all;
restoredefaultpath;
addpath(genpath('../SOSTOOLS'))
addpath(genpath('../../../mosek'))
x = mpvar('x',2,1); % dummy x
h = [];
% without redundant ball constraint
% g = [monomials(x,0);
% x(1) + 1;
% 1 - x(1)];
g = [monomials(x,0);
x(1) + 1;
1 - x(1);
- x(2)^2];
% with redundant ball constraint
% g = [monomials(x,0);
% x(1) + 1;
% 1 - x(1);
% - x(2)^2;
% 4 - x(1)^2 - x(2)^2];
p = x(1)*x(2);
prog = sosprogram(x);
gam = dpvar('gam');
prog = sosdecvar(prog,gam);
kappa = 1;
lhs = p - gam;
lams = {};
for i = 1:length(h)
hi = h(i);
deg_hi = hi.maxdeg;
deg_lam = 2*kappa - deg_hi;
[prog,lam] = sospolyvar(prog,monomials(x,0:deg_lam));
lhs = lhs - lam*hi;
lams{end+1} = lam;
end
sigs = {};
for i = 1:length(g)
gi = g(i);
deg_gi = gi.maxdeg;
if deg_gi <= 2*kappa
deg_sig = floor((2*kappa - deg_gi)/2);
[prog,sig] = sossosvar(prog,monomials(x,0:deg_sig));
lhs = lhs - sig*gi;
sigs{end+1} = sig;
end
end
prog = soseq(prog,lhs);
prog = sossetobj(prog,-gam);
options.solver = 'mosek';
prog = sossolve(prog,options);
gam_val = sosgetsol(prog,gam);