설명
이 테스트는 외부 조각별 다항식이 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;