I solved a sdp with matlab lmi using mincx but when i used cvx to solve it i got inaccurate warning and my cost function was much greater than the first run using mincx and infeasible for some other examples.
why is cvx failing to solve simple LMIs?
The inaccurate warning and inaccuracy are due to the solver called by CVX, not CVX itself. You may find that Mosek works more relaibly than SeDuMi or SDPT3, especially on numerically challenging problems, which perhaps yours is; but we wonāt know until we see it.
Perhaps a forum reader can provide some assessment if you provide a complete reproducible example, to include all the input data as well as the solver and CVX output.
Aside from the differing abilities and numerical robustness of the solvers, one other possibility to consider is that you did not actually submit the same problem to mincx and CVX. In the interest of completeness, you should post your mincx code and output as well, although there may not necessarily be readers on this forum knowledegeable in mincx.
Thanks. checked my codes, I think solver is causing problem. also installed mosek but it is not helping.
here is my cvx code:
% sys is chosen arbitrary
[A,B,C,D]=ssdata(sys);
[no,n]=size( C);
[n,ni]=size(B);
cvx_begin sdp
% cvx_precision high
cvx_solver mosek
variable g
variable R(n,n) symmetric
variable S(n,n) symmetric
minimize g
subject to
-[AR+RAā B;
Bā -g*eye(ni)]==semidefinite(n+ni)
-[AāS+SA Cā;
C -g*eye(no)]==semidefinite(n+no)
[R eye(n);
eye(n) S]==semidefinite(2*n)
cvx_end
here is my matlab code:
[A,B,C,D]=ssdata(sys);
[no,n]=size( C);
[n,ni]=size(B);
gmin=-1e12; tol=1e-3;
options=[tol 200 1e8 0 0];
setlmis([]);
R=lmivar(1,[n 1]);
S=lmivar(1,[n 1]);
g=lmivar(1,[1 0]);
lmiterm([1 1 1 R],A,1,āsā);
lmiterm([1 1 2 0],B);
lmiterm([1 2 2 g],-1,1);
lmiterm([2 1 1 S],1,A,āsā);
lmiterm([2 1 2 0],Cā);
lmiterm([2 2 2 g],-1,1);
lmiterm([-3 1 1 R],1,1);
lmiterm([-3 1 2 0],1);
lmiterm([-3 2 2 S],1,1);
clear c_obj
lmisys=getlmis;
nn=decnbr(lmisys);
c_obj(nn)= 1;
[gopt,xopt1]=mincx(lmisys,c_obj,options,[],gmin);
if ~isempty(gopt),
R=dec2mat(lmisys,xopt1,R);
S=dec2mat(lmisys,xopt1,S);
g=dec2mat(lmisys,xopt1,g);
else
return
end
You havenāt provided input data, and you havenāt shown output. Also donāt assume the forum readers have the ssdata function.
this is one of the systems that Iāve simulated:
n0=27.48;
n1=-0.632;
n2=16.06;
n3=-0.756;
n4=2;
n5=-0.737;
d0=34.31;
d1=112.5;
d2=101.9;
d3=58.06;
d4=23.4;
d5=4.757;
sys=tf([n5 n4 n3 n2 n1 n0],[1 d5 d4 d3 d2 d1 d0]);
Can you please provide a complete CVX code, with all inputs, which does not require any toolboxes? You ought to be able to get the output from the toolbox functions, and provide it as input in your posted code.
If your original l code has
[A.B] = toolbox_function(c,d);
and this results in A = 1.2, B = 2ā¦1, then your posted code should have A = 1.2,; B = 2.1;
Then execute the version of the code you have prepared in this way in a fresh MATLAB session and show us the output.
I need to solve this optimization with high precision(optimal value should be around 1e-8. I know this because mincx successfully solves my problem).
mosek fails, sdp3 inaccurately solves it and with sedumi optimal value is 6.9e-05. I cannot accept sedumiās results because I am using them in two other sdp optimizations that run in succession which become infeasible if precision is low.
I also have provided my cvx code with inputs bellow:
clc, clear all;
A=[-0.2430 -0.1154 -1.5739 -1.1832 0.1111 0.0683;
-0.1154 -0.0561 -2.9457 -0.7756 0.0619 0.0384;
1.5739 2.9457 -0.4444 -0.9775 0.1923 0.1116;
1.1832 0.7756 -0.9775 -2.5443 0.7207 0.3991;
0.1111 0.0619 -0.1923 -0.7207 -0.8264 -1.8543;
-0.0683 -0.0384 0.1116 0.3991 1.8543 -0.6428];
B=[0.4945;
0.2038;
-0.5436;
-0.8579;
-0.1148;
0.0690];
C=[ 0.4945 0.2038 0.5436 0.8579 -0.1148 -0.0690];
D=0;
[no,n]=size(C );
[n,ni]=size(B);
cvx_begin sdp
% cvx_precision high
% cvx_solver mosek
% cvx_solver sedumi
cvx_solver SDPT3
variable g
variable R(n,n) symmetric
variable S(n,n) symmetric
minimize g
%+1e-10*trace(R)+1e-10*trace(S)
subject to
-[A*R+R*A' B;
B' -g*eye(ni)]==semidefinite(n+ni)
-[A'*S+S*A C';
C -g*eye(no)]==semidefinite(n+no)
[R eye(n);
eye(n) S]==semidefinite(2*n)
cvx_end
Regards,
Your problem is ill-posed.
Using Mosek 9.0.87 produces
Calling Mosek 9.0.87: 134 variables, 43 equality constraints
For improved efficiency, Mosek is solving the dual problem.
------------------------------------------------------------
MOSEK Version 9.0.87 (Build date: 2019-5-8 09:19:53)
Copyright (c) MOSEK ApS, Denmark. WWW: mosek.com
Platform: Windows/64-X86
Problem
Name :
Objective sense : min
Type : CONIC (conic optimization problem)
Constraints : 43
Cones : 0
Scalar variables : 0
Matrix variables : 3
Integer variables : 0
Optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries : 1 time : 0.00
Lin. dep. - tries : 1 time : 0.00
Lin. dep. - number : 0
Presolve terminated. Time: 0.02
Problem
Name :
Objective sense : min
Type : CONIC (conic optimization problem)
Constraints : 43
Cones : 0
Scalar variables : 0
Matrix variables : 3
Integer variables : 0
Optimizer - threads : 8
Optimizer - solved problem : the primal
Optimizer - Constraints : 43
Optimizer - Cones : 0
Optimizer - Scalar variables : 0 conic : 0
Optimizer - Semi-definite variables: 3 scalarized : 134
Factor - setup time : 0.00 dense det. time : 0.00
Factor - ML order time : 0.00 GP order time : 0.00
Factor - nonzeros before factor : 946 after factor : 946
Factor - dense dim. : 0 flops : 6.75e+04
ITE PFEAS DFEAS GFEAS PRSTATUS POBJ DOBJ MU TIME
0 1.3e+00 1.0e+00 1.0e+00 0.00e+00 0.000000000e+00 0.000000000e+00 1.0e+00 0.05
1 2.2e-01 1.7e-01 2.6e-01 -7.88e-01 -4.203056913e+00 -2.299921100e+00 1.7e-01 0.13
2 3.1e-02 2.3e-02 1.3e-02 5.98e-01 -1.301814435e+00 -1.052672273e+00 2.3e-02 0.13
3 4.1e-03 3.1e-03 8.7e-04 8.06e-01 -4.180042387e-01 -3.522413446e-01 3.1e-03 0.13
4 5.0e-04 3.7e-04 8.9e-05 2.76e-01 -1.791853323e-01 -1.257568582e-01 3.7e-04 0.13
5 6.3e-05 4.7e-05 9.7e-06 1.45e-01 -8.566595977e-02 -4.418532382e-02 4.7e-05 0.14
6 1.2e-05 8.8e-06 1.2e-06 4.33e-01 -4.645256878e-02 -2.845478043e-02 8.8e-06 0.14
7 2.1e-06 1.6e-06 1.6e-07 3.84e-01 -2.593006053e-02 -1.555055329e-02 1.6e-06 0.14
8 4.7e-07 3.5e-07 2.8e-08 5.06e-01 -1.538324103e-02 -9.098928259e-03 3.5e-07 0.16
9 1.2e-07 9.4e-08 5.3e-09 5.97e-01 -9.881680665e-03 -6.668739845e-03 9.4e-08 0.16
10 4.8e-08 3.6e-08 2.4e-09 1.40e-01 -7.452837380e-03 -3.187845465e-03 3.6e-08 0.16
11 8.2e-09 6.2e-09 2.1e-10 7.06e-01 -3.778673804e-03 -2.643217619e-03 6.2e-09 0.17
12 1.3e-09 9.8e-10 2.6e-11 4.51e-01 -2.142965789e-03 -1.462841396e-03 9.8e-10 0.17
13 5.6e-10 4.2e-10 1.3e-11 1.33e-01 -1.707725691e-03 -6.948816421e-04 4.2e-10 0.17
14 8.9e-11 6.7e-11 1.0e-12 7.14e-01 -8.257356440e-04 -5.839109400e-04 6.7e-11 0.19
15 1.8e-11 1.4e-11 1.7e-13 4.54e-01 -5.128554415e-04 -3.648877608e-04 1.4e-11 0.19
16 5.2e-12 3.9e-12 5.1e-14 1.70e-01 -3.339469038e-04 -1.654109190e-04 3.9e-12 0.19
17 9.5e-13 7.2e-13 5.3e-15 6.65e-01 -1.841987395e-04 -1.291230942e-04 7.2e-13 0.20
18 1.3e-13 9.7e-14 5.6e-16 4.39e-01 -9.799057648e-05 -6.330275474e-05 9.5e-14 0.20
19 6.6e-14 5.3e-14 3.4e-16 4.32e-01 -8.330955324e-05 -3.611397792e-05 5.0e-14 0.20
20 1.4e-14 1.6e-14 3.8e-17 7.60e-01 -4.535494749e-05 -3.250483990e-05 1.1e-14 0.20
21 3.3e-15 4.9e-15 8.5e-18 3.63e-01 -2.780569015e-05 -1.612474357e-05 2.5e-15 0.22
22 8.3e-16 4.4e-15 1.4e-18 6.41e-01 -1.779855361e-05 -1.282894159e-05 6.2e-16 0.22
23 2.4e-16 3.3e-15 4.4e-19 2.83e-01 -1.175294775e-05 -6.100990529e-06 1.8e-16 0.22
24 4.8e-17 2.0e-15 5.1e-20 6.82e-01 -6.797485486e-06 -4.866177337e-06 3.6e-17 0.23
25 8.0e-18 2.7e-15 7.3e-21 4.17e-01 -3.770924061e-06 -2.305963359e-06 6.0e-18 0.23
26 2.7e-18 2.4e-15 1.7e-21 7.08e-01 -2.676342257e-06 -1.944487822e-06 2.0e-18 0.23
27 1.1e-18 2.9e-15 9.6e-22 1.12e-01 -2.117097552e-06 -8.545261702e-07 8.5e-19 0.25
28 1.5e-19 3.6e-15 6.3e-23 7.09e-01 -9.734029712e-07 -6.821365263e-07 1.2e-19 0.25
29 4.0e-20 2.9e-15 1.2e-23 5.25e-01 -6.565806959e-07 -4.913282517e-07 3.0e-20 0.25
30 1.2e-20 4.0e-15 4.5e-24 1.10e-01 -4.432024168e-07 -2.074135639e-07 9.2e-21 0.25
31 1.8e-21 4.4e-15 3.6e-25 6.73e-01 -2.236080939e-07 -1.567538193e-07 1.4e-21 0.27
32 4.6e-22 2.0e-15 6.9e-26 5.15e-01 -1.489665686e-07 -1.099102367e-07 3.5e-22 0.27
33 1.4e-22 3.6e-15 2.3e-26 1.29e-01 -9.889971045e-08 -4.738959834e-08 1.0e-22 0.28
Optimizer terminated. Time: 0.34
Interior-point solution summary
Problem status : ILL_POSED
Solution status : PRIMAL_ILLPOSED_CER
Dual. obj: -3.4819661704e-15 nrm: 2e+00 Viol. con: 0e+00 barvar: 7e-08
Optimizer summary
Optimizer - time: 0.34
Interior-point - iterations : 33 time: 0.28
Basis identification - time: 0.00
Primal - iterations : 0 time: 0.00
Dual - iterations : 0 time: 0.00
Clean primal - iterations : 0 time: 0.00
Clean dual - iterations : 0 time: 0.00
Simplex - time: 0.00
Primal simplex - iterations : 0 time: 0.00
Dual simplex - iterations : 0 time: 0.00
Mixed integer - relaxations: 0 time: 0.00
------------------------------------------------------------
Status: Failed
Optimal value (cvx_optval): NaN
If the primal is solved instead (via YALMIP), Mosek reports
Problem status : UNKNOWN
Solution status : UNKNOWN
Setting g to a constant as small as 1e-7 allows the feasibility problem to be solved in all of SeDuMi, SDPT3, and Mosek.
It is obvious that negative value of g can not be feasible.due to making lower right blocks of the first tw0 constraints the wrong definiteness.
value of g is positive! I think you missed the negative before bracket.
I am currently working on ill-posed problems. further recommendations for improving the formulation would be a great help.
I didnāt miss either of the negative signs (directly preceding g as well as outside the brackets for the entire matrix) . So g nonnegative is necessary for feasibility. As g decreases toward zero, the problem becomes ill-posed, with min(trace(R))
increasing toward infinity as g decreases. The problem is theoretically infeasible (i.e., in exact arithmetic) if g is negative.
I think the infimum, but not minimum, of g is at g = 0, and this is achieved by driving trace(R)
to infinity. Numerical solvers are not good at dealing with an infinum which is not a minimum. And in this case, the infimum is āachievedā (well, not really achieved) at the boundary of feasibility. So that is very ill-posed for a numerical solver.
I will leave corroboration of my assertions and any further diagnosis and recommendations for how to improve the formulation to the Mosek guys.
If your research aim is to work on ill-posed problems, at least you now have an example.
The Mosek log shows that the problem is illposed. To me it seems Mosek is doing the best it can.
I installed an older version of cvx and my problem was solved!
Can you show us the output of cvx_version
, as well as all CVX and solver output?
I approved this results because my next two optimization problem become feasible using the output!?
cvx_version:
CVX version 1.22
Code: build 841, 2012-08-16 16:01:21
Documentation: build 827, 2012-02-01 09:48:08
MATLAB version 9.3 (R2017b) on PCWIN64
here is my output:
Calling sedumi: 134 variables, 43 equality constraints
For improved efficiency, sedumi is solving the dual problem.
SeDuMi 1.21 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
eqs m = 43, order n = 27, dim = 243, blocks = 4
nnz(A) = 446 + 0, nnz(ADA) = 1849, nnz(L) = 946
it : by gap delta rate t/tP t/tD* feas cg cg prec
0 : 2.51E+00 0.000
1 : -2.63E+00 4.86E-01 0.000 0.1933 0.9000 0.9000 -0.02 1 1 3.9E+00
2 : -8.92E-01 3.54E-02 0.000 0.0728 0.9900 0.9900 1.02 1 1 3.3E-01
3 : -3.76E-01 7.35E-03 0.000 0.2080 0.9000 0.9000 0.75 1 1 7.0E-02
4 : -1.96E-01 1.43E-03 0.000 0.1945 0.9000 0.9000 0.19 1 1 2.7E-02
5 : -5.91E-02 1.11E-04 0.017 0.0776 0.9900 0.9900 -0.10 1 1 5.7E-03
6 : -1.83E-02 3.66E-05 0.315 0.3294 0.9000 0.9000 -0.41 1 1 3.8E-03
7 : -1.97E-02 8.13E-06 0.000 0.2223 0.9000 0.9000 0.24 1 1 9.2E-04
8 : -7.98E-03 3.86E-07 0.000 0.0475 0.9900 0.9900 0.47 1 1 6.5E-05
9 : -4.59E-03 8.10E-08 0.000 0.2099 0.9000 0.9000 0.18 1 1 2.6E-05
10 : -2.41E-03 1.63E-08 0.000 0.2017 0.9000 0.9000 0.11 1 1 1.0E-05
11 : -1.21E-03 3.28E-09 0.000 0.2010 0.9000 0.9000 0.15 1 1 3.5E-06
12 : -7.45E-04 7.30E-10 0.000 0.2224 0.9000 0.9000 0.32 1 1 1.2E-06
13 : -5.28E-04 2.00E-10 0.000 0.2742 0.9000 0.9000 0.45 1 1 4.4E-07
14 : -3.16E-04 4.84E-11 0.000 0.2419 0.9000 0.9000 0.38 1 1 1.8E-07
15 : -2.09E-04 1.29E-11 0.000 0.2654 0.9000 0.9000 0.44 1 1 7.1E-08
16 : -1.25E-04 3.35E-12 0.000 0.2609 0.9000 0.9000 0.38 1 1 3.1E-08
17 : -9.05E-05 9.67E-13 0.000 0.2885 0.9000 0.9000 0.50 1 1 1.2E-08
iter seconds digits cx by
17 0.8 Inf -1.3413692316e-04 -9.0479108730e-05
|Ax-b| = 2.1e-08, [Ay-c]_+ = 0.0E+00, |x|= 7.1e-01, |y|= 2.7e+04
Detailed timing (sec)
Pre IPM Post
9.375E-02 7.500E-01 7.813E-02
Max-norms: ||b||=1, ||c|| = 2,
Cholesky |add|=0, |skip| = 0, ||L.L|| = 1.19306.
Status: Solved
Optimal value (cvx_optval): +9.04791e-05
That is an ancient version of CVX and of Sedumi⦠Can you show the output running the exact same problem, but calling SeDuMi with CVX 2.1? Note that the version of SeDuMi which is included with CVX 2.1 is 1.34 (beta).