gams:model_an_absolute_value_in_a_linear_model

**This is an old revision of the document!**

You cannot put an absolute term for a variable directly
into a linear model. The model fragment below will **not** work:

[...] obj.. z=e=sum(j, abs(x(j))); cons(i).. sum(j, a(i,j)*x(j)) =l= b(i); model foo /all/; solve foo minimizing z using lp;

Various error messages will be given:

14 solve foo minimizing z using lp; **** $51,256 **** 51 Endogenous function argument(s) not allowed in linear models **** 256 Error(s) in analyzing solve statement. More detail appears **** Below the solve statement above **** The following LP errors were detected in model foo: **** 51 equation obj.. the function ABS is called with non-constant arguments

Instead of using the `abs()`

function, you could introduce two positive variables `xpos(j)`

and `xneg(j)`

and substitute:

`abs(x(j)) = xpos(j) + xneg(j)`

`x(j) = xpos(j) - xneg(j)`

This reformulation splits the `x(j)`

into a positive part `xpos(j)`

and a negative part `xneg(j)`

. Note that this only works if `abs(x(j))`

is minimized, because in that case, either `xpos(j)`

or `xneg(j)`

is forced to zero in an optimal solution.

The reformulated model fragment is:

[...] positive variable xpos(j), xneg(j); [...] obj.. z=e=sum(j, xpos(j) + xneg(j)); cons(i).. sum(j, a(i,j)*(x(j))) =l= b(i); xsplit(j).. x(j) =e= xpos(j) - xneg(j); model foo /all/; solve foo minimizing z using lp;

IMPRESSUM / LEGAL NOTICE
PRIVACY POLICY
gams/model_an_absolute_value_in_a_linear_model.1589808559.txt.gz · Last modified: 2020/05/18 15:29 by Frederik Fiand