obstacle.gms : 장애물 문제

설명

막을 통해 밀어 올려진 막의 위치를 계산하는 프로그램
(직사각형) 단단한 판에 있는 구멍; 게다가 딱딱한 것도 있고
구멍 내부의 장애물(플레이트와 같은 높이가 아닐 수도 있음).
이러한 장애물은 멤브레인을 위나 아래에서 제한할 수 있습니다.

막의 정확한 위치(최소 에너지의 위치)는
막의 2차 함수를 최소화하여 결정됨
위치는 홀과 장애물로 인한 제약을 받습니다.
아래 MCP는 이 QP에 대한 최적 조건에서 발생합니다.

MCP는 GUSS를 사용하여 여러 힘 상수 c에 대해 해결됩니다.
GAMSModelInstance. 이것은 이 라이브러리의 첫 번째 모델입니다.
이런 식으로 해결되는 모델 유형입니다.

소형 모델 유형 :MCP


카테고리 : 크레이지 슬롯 모델 라이브러리


메인 파일 : obstacle.gms

$title 장애물 문제

$onText
밀어 올려진 멤브레인의 위치를 계산하는 프로그램 
(직사각형) 단단한 판에 있는 구멍; 게다가 딱딱한 것도 있고 
구멍 내부의 장애물(플레이트와 같은 높이가 아닐 수도 있음). 
이러한 장애물은 멤브레인을 위나 아래에서 제한할 수 있습니다.

막의 정확한 위치(최소 에너지의 위치)는 
막의 2차 함수를 최소화하여 결정됨 
위치는 홀과 장애물로 인한 제약을 받습니다.  
아래 MCP는 이 QP에 대한 최적 조건에서 발생합니다.

MCP는 GUSS를 사용하여 여러 힘 상수 c에 대해 해결됩니다.
GAMSModelInstance. 이것은 이 라이브러리의 첫 번째 모델입니다.
이런 식으로 해결되는 모델 유형입니다.

Ciarlet, P G, 타원 문제에 대한 유한 요소법.
Elsevier Science, 수학 및 응용 연구, 1978.
$offText

세트
   나는 / 0 * 11 /
   J / 0 * 11 /
   경계(I,J)
   인테리어(I,J)
   ubnd(I,J) '상한이 있는 점';

경계(I,J)$[(ord(J) eq 카드(J)) 또는 (ord(J) eq 1) 또는
               (ord(I) eq 카드(I)) 또는 (ord(I) eq 1)] = 예;
내부(I,J) = 경계가 아님(I,J);

스칼라
   xlo / 0 /
   xhi / 1 /
   욜로 / 0 /
   안녕 / 1 /
   dx,디
   c '힘 상수' / 1 /
   M 'I의 분할 수'
   N 'J의 분할 수';

M = (카드(I)-1);  
N = (카드(J)-1);  
dx = (xhi - xlo) / M;
dy = (yhi - ylo) / N;

매개변수
   d(I,J) '사각형 중심에서 점까지의 거리'
   tmp(I,J)
   ub(I,J);

변수 v(I,J) '막의 높이';

방정식 dv(I,J);

dv(I,J) ..
  (dy/dx) * (2*v(I,J) - v(I+1,J) - v(I-1,J))
+ (dx/dy) * (2*v(I,J) - v(I,J+1) - v(I,J-1))
  =아니=
  c * dx * dy;

모델 장애물 / dv.v /;

* 공이 위에서 구속되는 문제
스칼라
  midI, midJ
  cheight '공 중심 높이' / .55 /
  ball_rad '볼 반경' / 0.5 /
  ;
midI = 1 + M / 2;
midJ = (카드(J) + 1) / 2;
d(I,J) = sqrt(sqr((ord(I)-midI)/M) + sqr((ord(J)-midJ)/N));

ubnd(I,J) = [d(I,J) <= ball_rad];
v.up(ubnd(I,J)) = cheight - sqrt(ball_rad-sqr(d(I,J)));

* 위치 v는 경계에서 0으로 고정됩니다.
v.fx(경계) = 0;

v.l(interior(I,J)) = min(cheight, v.up(I,J));

s '강제 시나리오' 설정 / s1*s5 /;
매개변수 cval(s);

cval(들) = (ord(들)-1)*(1.5-0.5)/(카드(들)-1) + 0.5;
디스플레이 cval;

mattrib / system.GUSSModelAttributes / 설정;

매개변수
   대(들,I,J)
   srep(s, mattrib) 'modelstat 등과 같은 모델 속성'
   o(*) 'GUSS 옵션' / SkipBaseCase 1 /;

obstdict / s.scenario.'', o.opt.srep, c.param.cval, v.level.vs / 설정;

mcp 시나리오 obstdict를 사용하여 장애물을 해결합니다.

옵션 vs:4:1:1; 디스플레이 대;

* 이제 GAMSModelInstance로 동일한 작업을 수행합니다.

$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용

$set 솔버로그
$if set useSolverLog $setsolverlog 출력=sys.stdout

임베디드 코드 Python:
defsolvMI(mi, SymIn=[], SymOut=[]):
  SymIn의 Sym에 대해:
    크레이지 슬롯db[sym].copy_symbol(mi.sync_db[sym])
  mi.solve(%solverlog%)
  SymOut의 Sym에 대해:
    시도해 보세요:
      크레이지 슬롯db[sym].clear() # Sym에 대해 "writerTo" 플래그가 설정되었는지 확인하기 위해 기호를 명시적으로 지웁니다.
      mi.sync_db[sym].copy_symbol(크레이지 슬롯db[sym])
    제외:
      통과
크레이지 슬롯wsWorkingDir = "."    
일시중지임베디드코드
abort$execerror '파이썬 오류입니다. 로그를 확인하세요';

$libInclude pyEmbMI miObst 'mcp를 사용하는 장애물' -all_model_types=path c.Zero

옵션 v:4:1:1;
루프(들,
   c = cval(들);
   계속임베디드코드:
   크레이지 슬롯db['c'].copy_symbol(miObst.sync_db['c'])
   solvMI(miObst,['c'],['v'])
   PauseEmbeddedCode v
   디스플레이 v.l;
);