Is it possible to convert non-zero values to one in CVX?


I am working on a model likes:

expression a(N);
variable p(N);
variable b(N)
obj = obj + b * Constant;

subject to
for i = 1:N
    b(i)>= a(i);
    b(i)<= a(i);

where the value of expression a depends on a step function of the variable p :
a(i) = 0, if p(i)=0
a(i) = 1, if p(i)>0

I have studied the materials on the website of CVX, but still have no idea how to implement a constraint like the above equation. Is it possible to implement such constraints in cvx?

Thank you!

You need to use Big M logic modeling. You will need to declare a as a binary variable rather than an expression.

I presume p is nonnegative, although you haven’t declared it as such or specified such a constraint. The constraint below will enforce nonnegativity of p. Assume U is an upper bound for p (U could be a scalar or a vector).

Let non-zero_threshold be a small positive number, such as 1e-5, for what constitutes the smallest value of p which is practically speaking positive (keep in mind solver tolerances might allow a variable value of 1e-8 when it is really essentially zero).

non-zero_threshold*a <= p <= U.*a

Hi Mark,
Thanks for the quick response! The big M modeling does work, but seems a will be set to a small number because of p might get small compared to its upper bound. I specify it as binary and use Mosek to solve the problem. I am also considering using Taylor Series Approximation and penalized the objective function to make it an binary variable.

Is there any better approach to address this problem?

Thank you!

As I wrote, declare a as binary. Then use a solver, such as Mosek, which can handle binary variables. That should be better than trying to create a penalty term or use a Taylor series approximation. I think Mosek or Gurobi will do a better job of handling binary variables than any "home-brew’ approach you might create.

Got that! Thank you so much, Mark!