pwplib01.gms : pwpcclib에서 조각별 다항식 테스트

설명

이 테스트는 외부 조각별 다항식이
C 라이브러리는 "손으로" 모델링하는 것과 동일한 방식으로 작동합니다.

기여자: L. Westermann

소형 모델 유형 :슬롯


카테고리 : 슬롯 테스트 라이브러리


메인 파일 : pwplib01.gms

$title pwpcclib에서 조각별 다항식 테스트(PWPLIB01,SEQ=527)

$onText
이 테스트는 외부 조각별 다항식이 다음과 같이 구현되었는지 확인합니다.
C 라이브러리는 "손으로" 모델링하는 것과 동일한 방식으로 작동합니다.

기여자: L. Westermann
$offText

IDummy '최대 함수, 세그먼트, 각도' 설정 /0*3/;

* 두 개의 조각별 다항식 함수 정의
Table pwpdata(*,*,*) '1번째 인덱스: 함수 번호, 2번째 인덱스: 세그먼트 번호, 3번째 인덱스: 도'
                 왼쪽 경계 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
;
* 외부 라이브러리에서 읽은 gdx 파일에 pwp 데이터 쓰기
$gdxOutpwp.gdx
$unLoad pwpdata
$gdx아웃

* 외부 함수 로드
$funcLibIn pwplib pwpcclib
함수 pwp /pwplib.pwpfunc/;

* 직접 공식을 사용하여 모델을 공식화하고 해결합니다.
xi / 1,2 /, yi / 1,2,3 / 설정;
변수 x, y, xp, yp, objvar;
양의 변수 xps(xi), xms(xi), yps(yi), yms(yi);
이진 변수 bx(xi), by(yi);

방정식 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));

방정식 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');
방정식 deflox2, defupx2; deflox2.. pwpdata('1','2','leftbound') =l= x + x.up*(1-bx('2')); defupx2.. x - x.up*(1-bx('2')) =l= x.up;

방정식 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');
방정식 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');
방정식 defloy3, defupy3; defloy3.. pwpdata('2','3','leftbound') =l= y + y.up*(1-by('3')); defupy3.. y - y.up*(1-by('3')) =l= y.up;

* 기본이 아닌 경계를 설정

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

모델 m / 모두 /;
objvar를 최소화하는 MINLP를 사용하여 m을 해결합니다.

* 외재함수를 이용한 모델의 공식화 및 해결
변수 objpwp, xpwp, ypwp;

방정식 extr 외부 함수 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);

모델 내선 / 내선 /;

* 기본이 아닌 경계를 설정
xpwp.lo = 1; xpwp.up = 7;
ypwp.lo = 0; ypwp.up = 1;

objpwp를 최소화하는 DNLP를 사용하여 ext를 해결합니다.

abort$(abs(objvar.l-objpwp.l)>1e-6) '목표 값이 다릅니다.', objvar.l, objpwp.l;
abort$(abs(x.l-xpwp.l)>1e-6) 'X 값이 다릅니다', x.l, xpwp.l;
abort$(abs(y.l-ypwp.l)>1e-6) 'Y 값이 다릅니다', x.l, xpwp.l;