The question is how to arrive at a system in which another equation is enforced based on the value of a function. To be fairly general, use the following statement:
z = f(x) when y > 0 z = g(x) when y < 0
Note that the distinction between >=
and just >
is not meaningful for a numerical algorithm on a finite precision machine.
Start by writing, in GAMS,
Variable fs, gs; z =E= (f(x) - fs) + (g(x) - gs);
So, when y > 0
, we want fs = 0
and gs = g(x)
. When y < 0
, we want fs = f(x)
and gs = 0;
Now declare a binary variable, b
, that will be 1 when y > 0
and 0 and y < 0
.
Binary Variable b; Positive Variable yp, yn; y =E= yp - yn; yp =L= ymax * b; yn =L= ymax * (1 - b);
Next, split the two terms of z
into positive and negative parts.
Positive Variable fp, fn, gp, gn; f(x) - fs =E= fp - fn; g(x) - gs =E= gp -gn; fp + fn =L= fmax * b; gp + gn =L= gmax * (1 - b);
So, b = 0 ⇒ fs = f(x)
and b = 1 ⇒ gs = g(x)
.
Finally split just the f and g slacks fs and gs into positive and negative components.
Positive Variable fsp, fsn, gsp, gsn; fs =E= fsp - fsn; gs =E= gsp - gsn; fsp + fsn =L= fmax* (1 - b); gsp + gsn =L= gmax * b;
So, b= 0 ⇒ gs = 0; and b = 1 ⇒ fs = 0
;
Taken together, the last two sections give b = 0 ⇒ z = g(x)
and b = 1 ⇒ z = f(x)
.