설명
경계가 다양한 단일 방정식 제곱 비선형 시스템 고정 변수에 대한 솔루션에서 정확히 자유로워지는 것입니다. 경계가 없는 모델에는 x = 2와 x = -2라는 두 가지 해가 있습니다. 반환되는 값은 초기 값에 따라 달라질 수 있습니다. 물론 경계는 솔루션 중 하나를 제외할 수 있습니다.
소형 모델 유형 :CNS
카테고리 : 슬롯 커뮤니티 테스트 라이브러리
메인 파일 : cns01.gms
$title 경계가 1-변수 CNS 모델 sqr(x)=4 (cns01,SEQ=91)를 어떻게 변경하는지 테스트합니다.
$onText
다양한 범위를 갖는 단일 방정식 제곱 비선형 시스템
고정 변수에 대한 솔루션에서 정확히 자유로워지는 것입니다.
경계가 없는 모델에는 x = 2와 x = -2라는 두 가지 해가 있습니다.
반환되는 값은 초기 값에 따라 달라질 수 있습니다.
물론 경계는 솔루션 중 하나를 제외할 수 있습니다.
$offText
maxexecererror = 1;
$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-6
스칼라 tol / %TESTTOL% /;
$설정되지 않은 경우 SLOWOK $set SLOWOK 0
scalar SlowOK '느린 해결은 괜찮습니다. 이 경우에는 abort.noerror' / %SLOWOK% /;
변수 x;
방정식 f;
모델 m / f /;
f .. x*x =e= 4;
옵션 limrow = 0, limcol = 0;
* 사례 1: x = -2 또는 x = 2 모두 괜찮습니다.
x.l = 8;
cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion% 또는 m.modelstat <> %modelStat.solved%)
'잘못된 반환 코드', m.solvestat, m.modelstat;
abort$(abs(sqr(x.l)-4) > tol) 'x.l은 + 또는 -2여야 합니다.',x.l;
* 사례 2: x = -2 또는 x = 2 모두 괜찮습니다.
x.l = -8;
cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion% 또는 m.modelstat <> %modelStat.solved%)
'잘못된 반환 코드', m.solvestat, m.modelstat;
abort$(abs(sqr(x.l)-4) > tol) 'x.l은 + 또는 -2여야 합니다.',x.l;
* 사례 3: 야코비안은 초기점에서는 특이점이지만,
* 두 가지 솔루션. 반환은 솔버에 따라 다릅니다.
x.l = 0;
cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion%) '잘못된solvestat', m.solvestat;
if (m.modelstat = %modelStat.locallyInfeasible%),
* 로컬에서는 실행 불가능하며 그런 식으로 행을 보고해야 합니다.
중단$(m.numinfes < 1) '잘못된 .numinfes';
그렇지 않으면
abort$(m.modelstat <> %modelStat.solved%) '잘못된 modelstat', m.modelstat;
abort$(abs(sqr(x.l)-4) > tol) 'x.l은 + 또는 -2여야 합니다.',x.l;
;
* 사례 4: 경계 때문에 x = 2를 반환해야 합니다.
x.lo = 1; x.up = 3; x.l = 8;
cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion% 또는
(m.modelstat <> %modelStat.solvedUnique% eqv m.modelstat <> %modelStat.solved%))
'잘못된 반환 코드', m.solvestat, m.modelstat;
abort$(abs(x.l-2) > tol) 'x.l은 2여야 합니다.',x.l;
* 사례 5: 경계 때문에 x = 2를 반환해야 합니다. 참고
* 해가 경계에 있지만 경계를 위반하지 않습니다.
x.lo = 2; x.up = 3; x.l = 8;
cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion% 또는
(m.modelstat <> %modelStat.solvedUnique% eqv m.modelstat <> %modelStat.solved%))
'잘못된 반환 코드', m.solvestat, m.modelstat;
abort$(abs(x.l-2) > tol) 'x.l은 2여야 합니다.',x.l;
* 다음 테스트는 모두 "holdFixed"와 관련된 특정 동작에 관한 것입니다.
* 비동기식 해결에서는 무시되므로 다음과 같은 경우에는 일찍 종료하세요.
$ifE %슬롯 커뮤니티solveLink%=%solveLink.asyncGrid% $exit
$ifE %슬롯 커뮤니티solveLink%=%solveLink.asyncSimulate% $exit
$ifE %슬롯 커뮤니티solveLink%=%solveLink.aSyncThreads% $exit
$ifE %슬롯 커뮤니티solveLink%=%solveLink.threadsSimulate% $exit
* 사례 6a: 고정되지 않은 부분이 없기 때문에 모형이 정사각형이 아닙니다.
* 변수는 남았지만 방정식은 하나입니다. 이것이 어떻게 처리되는지
* 홀드픽스 설정에 따라 다름
* Holdfixed가 0인 경우 슬롯 커뮤니티는 이 모델을 정사각형이 아닌 것으로 거부합니다.
* - 솔버에 도달하지 않습니다.
m.holdfixed = 0; x.lo = 2; x.up = 2; x.l = 8; cns를 사용하여 m을 해결합니다.
abort.noerror$[slowOK 및 %solvestat.ResourceInterrupt% = m.solvestat] '너무 느리게 해결';
abort$(execerror=0) '이전 해결에서는 실행 오류가 발생했어야 했습니다.';
abort$(m.solvestat <> %solveStat.solveProcessingSkipped% 또는 m.modelstat <> %modelStat.noSolutionReturned%)
'잘못된 반환 코드', m.solvestat, m.modelstat;
실행 오류 = 0;
* 사례 6b: 고정된 경우 = 1 슬롯 커뮤니티는 모델과 솔버를 수락합니다.
*합리적인 수익을 주어야 합니다. NB 슬롯 커뮤니티의 승인
* 이 모델은 우연히 발생합니다. 항상 그런 것은 아닙니다.
*holdfixed=1로 설정하면 복구됩니다.
* 직각도. 이 경우, 방정식의 수는
* 드롭아웃은 고정 변수의 수와 동일하므로
* 정사각형을 유지
m.holdfixed = 1; x.lo = 2; x.up = 2; x.l = 8; cns를 사용하여 m을 해결합니다.
abort.noError$[slowOK and %solveStat.resourceInterrupt% = m.solvestat] '해결 속도가 너무 느림';
abort$(m.solvestat <> %solveStat.normalCompletion%) '잘못된solvestat', m.solvestat;
abort$(m.modelstat <> %modelStat.solvedUnique% 및 m.modelstat <> %modelStat.solved%) '잘못된 modelstat', m.modelstat;
* 사례 8a: 6a 및 6b와 동일한 검사이지만 변수가
* 실현 불가능한 점
m.holdfixed = 0; x.lo = 3; x.up = 3; x.l = 8; cns를 사용하여 m을 해결합니다.
abort.noerror$[slowOK 및 %solvestat.ResourceInterrupt% = m.solvestat] '너무 느리게 해결';
abort$(execerror=0) '이전 해결에서는 실행 오류가 발생했어야 했습니다.';
abort$(m.solvestat <> %solveStat.solveProcessingSkipped% 또는 m.modelstat <> %modelStat.noSolutionReturned%)
'잘못된 반환 코드', m.solvestat, m.modelstat;
실행 오류 = 0;
* 사례 8b: 고정된 경우 = 1 슬롯 커뮤니티는 정사각형 모델을 볼 수 있지만
* 제거된 행은 9 =e= 4처럼 보입니다. 슬롯 커뮤니티는
* 모델 생성 시 오류가 발생했습니다.
m.holdfixed = 1; x.lo = 3; x.up = 3; x.l = 8; cns를 사용하여 m을 해결합니다.
abort.noerror$[slowOK 및 %solvestat.ResourceInterrupt% = m.solvestat] '너무 느리게 해결';
abort$(execerror=0) '이전 해결에서는 실행 오류가 발생했어야 했습니다.';
abort$(m.solvestat <> %solveStat.solveProcessingSkipped% 또는 m.modelstat <> %modelStat.noSolutionReturned%)
'잘못된 반환 코드', m.solvestat, m.modelstat;
실행 오류 = 0;