pwplib01.gms : Test piecewise polynomials in pwpcclib

Description

This test makes sure that the extrinsic piecewise polynomials implemented in a
C library work in the same way as modeling it "by hand".

Contributor: L. Westermann


Small Model of Type : GAMS


Category : GAMS Test library


Main file : pwplib01.gms

$title Test piecewise polynomials in pwpcclib (PWPLIB01,SEQ=527)

$onText
This test makes sure that the extrinsic piecewise polynomials implemented in a
C library work in the same way as modeling it "by hand".

Contributor: L. Westermann
$offText

set idummy 'maximum of functions, segments, degrees' /0*3/;

* Define two piecewise polynomial functions
Table pwpdata(*,*,*) '1st index: function number, 2nd index: segment number, 3rd index: degree'
                 leftBound       0          1         2
       1.1       1               2.4       -2.7       0.3
       1.2       4               5.6       -4.3       0.5
       2.1       0               0         -6.3333    0
       2.2       0.3333          1.0370   -12.5554    9.3333
       2.3       0.6667          9.7792   -38.7791   29
;
* Write pwp data to gdx file read by external library
$gdxOut pwp.gdx
$unLoad pwpdata
$gdxOut

* Load extrinsic function
$funcLibIn pwplib pwpcclib
function pwp /pwplib.pwpfunc/;


* Formulate and solve model using by-hand formulation
set xi / 1,2 /, yi / 1,2,3 /;
Variables x, y, xp, yp, objvar;
positive variable xps(xi), xms(xi), yps(yi), yms(yi);
binary variables bx(xi), by(yi);

Equations e1, defxp, defyp, defsumbx, defsumby, defxs, defys;

e1..     objvar =E= cos(x) - sin(0.1*x) - 2*y + 10*y**2 - 3*y**3 - 5*y**4 + xp + yp;

defxp(xi).. xp =e= pwpdata('1',xi,'0') +  pwpdata('1',xi,'1')*x + pwpdata('1',xi,'2')*sqr(x) + xps(xi) - xms(xi);
defyp(yi).. yp =e= pwpdata('2',yi,'0') +  pwpdata('2',yi,'1')*y + pwpdata('2',yi,'2')*sqr(y) + yps(yi) - yms(yi);

defsumbx.. sum(xi, bx(xi)) =e= 1;
defsumby.. sum(yi, by(yi)) =e= 1;

defxs(xi).. xps(xi) + xms(xi) =l= 100*(1-bx(xi));
defys(yi).. yps(yi) + yms(yi) =l= 100*(1-by(yi));

equation deflox1, defupx1; deflox1.. pwpdata('1','1','leftbound') =l= x + x.up*(1-bx('1')); defupx1.. x - x.up*(1-bx('1')) =l= pwpdata('1','2','leftbound');
equation deflox2, defupx2; deflox2.. pwpdata('1','2','leftbound') =l= x + x.up*(1-bx('2')); defupx2.. x - x.up*(1-bx('2')) =l= x.up;

equation defloy1, defupy1; defloy1.. pwpdata('2','1','leftbound') =l= y + y.up*(1-by('1')); defupy1.. y - y.up*(1-by('1')) =l= pwpdata('2','2','leftbound');
equation defloy2, defupy2; defloy2.. pwpdata('2','2','leftbound') =l= y + y.up*(1-by('2')); defupy2.. y - y.up*(1-by('2')) =l= pwpdata('2','3','leftbound');
equation defloy3, defupy3; defloy3.. pwpdata('2','3','leftbound') =l= y + y.up*(1-by('3')); defupy3.. y - y.up*(1-by('3')) =l= y.up;

* set non default bounds

x.lo = 1; x.up = 7;
y.lo = 0; y.up = 1;

Model m / all /;
Solve m using MINLP minimizing objvar;




* Formulate and solve model using extrinsic function
Variables objpwp, xpwp, ypwp;

Equation extr Use extrinsic function pwp;

extr..     objpwp =E= cos(xpwp) - sin(0.1*xpwp) - 2*ypwp + 10*ypwp**2 - 3*ypwp**3 - 5*ypwp**4 + PWP(1,xpwp) + PWP(2,ypwp);

Model ext / extr /;

* set non default bounds
xpwp.lo = 1; xpwp.up = 7;
ypwp.lo = 0; ypwp.up = 1;

Solve ext using DNLP minimizing objpwp;



abort$(abs(objvar.l-objpwp.l)>1e-6) 'Objective value differs', objvar.l, objpwp.l;
abort$(abs(x.l-xpwp.l)>1e-6)        'X value differs', x.l, xpwp.l;
abort$(abs(y.l-ypwp.l)>1e-6)        'Y value differs', x.l, xpwp.l;