matlaboptimizationcplexdocplexquadratic-programming

Unable to find the same solution on CPLEX and MATLAB for a quadratic program


I'm trying to solve the following quadratic problem with MATLAB (using quadprog function) and CPLEX. The problem is that MATLAB and CPLEX provided feasible solutions but both solutions didn't match. In fact, CPLEX claims that the obtained solution is optimal while the solution obtained with MATLAB is better in terms of objective.

Minimize obj= 0.5*(1100*x^2 + 509*y^2 + 33*z^2 + 1060*x*y + 252*y*z + 260*z*x)- 60*x- 36*y - 11*z

Subject to:
-x-y+z <= 10
-x+y-z <= 10
-x+y+z <= 10
x-y-z <= 10
x-y+z <= 10
x+y-z <= 10
x+y+z <= 10
-x-y-z <= 10
x,y and z are real numbers.

In matlab, I got: obj=-3, x=0.0436, y=-0.2670, z=1.1830
In CPLEX, I got: obj=-2.07, x=0.028, y=0.000, z=0.222

I don't understand why.

I tried to solve the problem with MATLAB and CPLEX but the solutions didn't match.


Solution

  • which cplex version have you tried ?

    I wrote

    dvar float x;
    dvar float y;
    dvar float z;
    
    minimize 0.5*(1100*x^2 + 509*y^2 + 33*z^2 + 1060*x*y + 252*y*z + 260*z*x)- 60*x- 36*y - 11*z;
    
    subject to
    {
    -x-y+z <= 10;
    -x+y-z <= 10;
    -x+y+z <= 10;
    x-y-z <= 10;
    x-y+z <= 10;
    x+y-z <= 10;
    x+y+z <= 10;
    -x-y-z <= 10;
    }
    

    in OPL CPLEX and got obj -3

    x = 0.043662;
    y = -0.26761;
    z = 1.1831;
    

    and with docplex python I also get the same

    from docplex.mp.model import Model
    
    mdl = Model(name='quad')
    
    x=mdl.continuous_var(name='x',lb=-10,ub=10)
    y=mdl.continuous_var(name='y',lb=-10,ub=10)
    z=mdl.continuous_var(name='z',lb=-10,ub=10)
    
    
    
    mdl.minimize(0.5*(1100*x*x + 509*y*y + 33*z*z + 1060*x*y + 252*y*z + 260*z*x)- 60*x- 36*y - 11*z)
    
    
    mdl.add(-x-y+z <= 10)
    mdl.add(-x+y-z <= 10)
    mdl.add(-x+y+z <= 10)
    mdl.add(x-y-z <= 10)
    mdl.add(x-y+z <= 10)
    mdl.add(x+y-z <= 10)
    mdl.add(x+y+z <= 10)
    mdl.add(-x-y-z <= 10)
    
    mdl.solve(log_output=True,)
    
    decisionVars=[x,y,z]
    for v in decisionVars:
        print(v.name," = ",v.solution_value)
    
    print(mdl.objective_value)