설명
이 예는 기능적으로 예 1과 동일합니다. 새로운 측면은 I가 기록된 세트의 크기입니다. 피망 슬롯 스크래치 디렉터리에 있는 파일입니다. 외부 방정식은 피망 슬롯 스크래치의 이름을 요청합니다. 초기화 중에 디렉터리를 읽고 크기와 예상 크기와 비교합니다.
소형 모델 유형 :피망 슬롯
카테고리 : 피망 슬롯 테스트 라이브러리
메인 파일 : ex5.gms
$title 외부 방정식 - 예 5 (EX5,SEQ=569)
$onText
이 예는 기능적으로 예 1과 동일합니다.
새로운 측면은 I가 기록된 세트의 크기입니다.
피망 슬롯 스크래치 디렉터리에 있는 파일입니다.
외부 방정식은 피망 슬롯 스크래치의 이름을 요청합니다.
초기화 중에 디렉터리를 읽고 크기와
예상 크기와 비교합니다.
$offText
i / i1*i4 / 설정
별칭(i,j);
모수 Q(i,j) 공분산 행렬
X0(i) 목표;
Q(i,j) = power(0.5, abs(ord(i)-ord(j)) );
X0(i) = ord(i);
Q, X0을 표시합니다.
변수 x(i), z;
방정식 zdef, zdefX;
$onText
피망 슬롯에서 구현된 원하는 방정식은 다음과 같습니다.
$offText
zdef .. sum( (i,j), (x(i)-x0(i)) * Q(i,j) * (x(j)-x0(j) ) ) =e= z;
$onText
이는 다음과 같은 외부 방정식으로 구현됩니다.
$offText
zdefX .. sum(i, ord(i)*x(i) ) + (카드(i)+1)* z =X= 1;
$onText
방정식의 계수는 X-변수가 다음과 같다는 것을 보여줍니다.
1부터 카드(i)까지 번호가 매겨져 있고 Z는 카드(i)+1의 숫자를 가지고 있습니다.
외부 방정식 코드.
외부 방정식은 하나만 있으며 숫자 1, 즉 값이 있습니다.
오른쪽의.
방정식의 모든 변수에는 변수가 할당되어야 합니다.
숫자이며 모두 외부 방정식에 나타나야 합니다. 당신
아직 일부 항이 선형이라는 것을 솔버에게 알릴 수 없습니다.
-- 모든 항은 솔버의 관점에서 볼 때 비선형입니다.
$offText
$ 미리 설정
$ifI %system.filesys%==unix $set pre 'lib'
$ 세트 '64'
$set N ex5
$set cN %pre%%N%c%suf%
$set fN %pre%%N%f%suf%
모델 %N% '피망 슬롯 구현' / zdef /;
model %cN% 'C 파일 이름이 전달된 외부 방정식' / zdefX /;
model %fN% 'F 파일 이름이 전달된 외부 방정식' / zdefX /;
옵션 limcol = 0;
$onText
대상과 비교하여 솔루션을 확인하십시오.
$offText
매개변수 보고서(i,*,*) 솔루션 요약;
스칼라 totdist /0/;
$onText
모델의 크기는 abc.dat라는 파일에 기록됩니다.
피망 슬롯 스크래치 디렉토리. 확장자는 %scext%로 선택됩니다.
따라서 파일이 실행되는 동안 피망 슬롯에 의해 자동으로 제거됩니다.
일반적인 정리 과정.
$offText
파일 f / '%피망 슬롯scrdir%abc.%피망 슬롯scrext%' /;
putclose f 카드(i):5:0;
$onEchoV > runme.gms
z.l = 0;
z.m = 0;
x.l(i) = 0;
x.m(i) = 0;
zdefX.l = 0;
zdefX.m = 0;
z를 최소화하는 nlp를 사용하여 %1을 해결합니다.
abort$(%1.solvestat <> 1) '%1 모델 실행에 문제가 있습니다';
Report(i,'대상', '%1') = x0(i);
보고서(i,'값', '%1') = x.l(i);
보고서(i,'거리','%1') = abs(x.l(i) - x0(i));
totdist = totdist + sum(i,abs(x.l(i) - x0(i)));
$offEcho
$ 확장 '.dll' 설정
$ifI %system.filesys%==unix $set ext '.so'
$ifI %system.platform%==dex $set ext '.dylib'
$ifI %system.platform%==dax $set ext '.dylib'
$ 세트 eq
$ifI %system.filesys%==unix $set eq "'"
$if set runall $set runC '1' set runF '1'
$ifThen nocomp를 설정하지 않음
$ ifI set runC $call 피망 슬롯 complink lo=%피망 슬롯lo% --lang=c --files=ex5c.c --libname=%cN%%ext%
$ 오류 수준 1인 경우 $abort C 라이브러리 컴파일 오류
$ ifI set runF $call 피망 슬롯 complink lo=%피망 슬롯lo% --lang=fortran90 --files=%eq%"gehelper.f90 ex5f.f90"%eq% --libname=%fN%%ext%
$ 오류 수준 1인 경우 $abort Fortran90 라이브러리 컴파일 오류
$endIf
$ batInclude runme %N%
$if set runC $batInclude runme %cN%
$if set runF $batInclude runme %fN%
보고서 표시;
if ((totdist < 1.0E-6),
"@@@@ #테스트에 통과했습니다."를 표시합니다.
그렇지 않으면
abort totdist, "@@@@ #테스트가 통과되지 않았습니다. 자세한 내용은 Filcom.lst를 검사하세요.";
);