glider.gms : 행글라이더 COPS 2.0 #11

설명

열 상승 기류의 최종 수평 위치를 최대화합니다.

이 모델은 COPS 벤치마킹 제품군에서 나온 것입니다.
참조http://www-unix.mcs.anl.gov/~more/cops/.이산화 지점 수는 무료 슬롯를 사용하여 지정할 수 있습니다.
user1 매개변수입니다. nh =에 대한 COPS 성능 테스트가 보고되었습니다.
50, 100, 200, 400

대형 모델 유형 :NLP


카테고리 : 무료 슬롯 모델 라이브러리


메인 파일 : glider.gms

$title 행글라이더 COPS 2.0 #11 (GLIDER,SEQ=239)

$onText
열 상승 기류의 최종 수평 위치를 최대화합니다.

이 모델은 COPS 벤치마킹 제품군에서 나온 것입니다.
http://www-unix.mcs.anl.gov/~more/cops/를 참조하세요.

무료 슬롯를 사용하여 이산화 지점 수를 지정할 수 있습니다.
user1 매개변수입니다. nh =에 대한 COPS 성능 테스트가 보고되었습니다.
50, 100, 200, 400

Dolan, E D 등, JJ, 벤치마킹 최적화
COPS가 포함된 소프트웨어. 기술. 대표, 수학과 컴퓨터
과학부, 2000.

Bulirsch, R, Nerz, E, Pesch, HJ 및 von Stryk, O,
비선형 최적에서 직접 및 간접 방법 결합
제어: 행글라이더의 범위 최대화. 불리르쉬에서는
R, Miele, A, Stoer, J 및 Well, KH, Eds, 최적 제어.
Birkhauser Verlag, 1993, pp. 273-288.

키워드: 비선형 프로그래밍, 공학, 행글라이더, 궤도 최적화
          최적의 제어
$offText

$설정되지 않은 경우 nh $set nh 50

세트
   c '좌표' / x '거리', y '고도' /
   h '간격' / h0*h%nh% /;

스칼라
   nh '메쉬의 간격 수' / %nh% /
   cL_min '제어변수에 바운드' / 0.0 /
   cL_max '제어 변수에 대한 경계' / 1.4 /
   u_c / 2.5 /
   r_0 / 100 /
   m / 100 /
   지 / 9.81 /
   c0 / 0.034 /
   c1 / 0.069662 /
   S / 14 /
   로 / 1.13 /;

매개변수
   c_0(c) '초기 위치' / x 0, y 1000 /
   v_0(c) '초기 속도' / x 13.23, y -1.288 /
   c_f(c) '최종 위치' / y 900 /
   v_f(c) '최종 속도' / x 13.23, y -1.288 /;

변수
   t_f
   pos(c,h) '위치 x 거리 y 고도'
   vel(c,h) '속도 x 거리 y 고도'
   cl(h) '제어 변수'
   r(h) 'r 함수'
   u(h) 'u 함수'
   w(h) 'w 함수'
   v(h) 'v 함수'
   D(h) 'D 함수'
   L(h) 'L 함수'
   v_dot(c,h)
   final_x
   단계 '단계 크기';

양의 변수 단계;

방정식
   tf_eqn
   rdef(h)
   udef(h)
   wdef(h)
   vdef(h)
   Ddef(h)
   Ldef(h)
   vx_dot_def(h)
   vy_dot_def(h)
   객체
   pos_eqn(c,h)
   vel_eqn(c,h);

별칭(h,i);

tf_eqn.. t_f =e= 단계*nh;

rdef(i).. r[i] =e= sqr(pos['x',i]/r_0 - 2.5);
udef(i).. u[i] =e= u_c*(1 - r[i])*exp(-r[i]);

wdef(i).. w[i] =e= vel['y',i] - u[i];
vdef(i).. v[i] =e= sqrt(sqr(vel['x',i]) + sqr(w[i]));

Ddef(i).. D[i] =e= .5*(c0 + c1*sqr(cL[i]))*rho*S*sqr(v[i]);
Ldef(i).. L[i] =e= .5* cL[i] *rho*S*sqr(v[i]);

vx_dot_def(i).. v_dot['x',i] =e= (-L[i]*w[i]/v[i] - D[i]*vel['x',i]/v[i])/m;
vy_dot_def(i).. v_dot['y',i] =e= ( L[i]*vel['x',i]/v[i] - D[i]*w[i]/v[i])/m - g;

obj..final_x =e= pos('x','h%nh%');

pos_eqn(c,i-1).. pos[c,i] =e= pos[c,i-1] + .5*step*(vel[c,i] + vel[c,i-1]);

vel_eqn(c,i-1).. vel[c,i] =e= vel[c,i-1] + .5*step*(v_dot[c,i] + v_dot[c,i-1]);

cl.lo(h) = cL_min;
cl.up(h) = cL_max;
pos.lo('x',h) = 0;
vel.lo('x',h) = 0;
v.lo(h) = 0.01;

* 경계 조건
pos.fx(c,'h0') = c_0(c);
pos.fx('y','h%nh%') = c_f('y');
vel.fx(c,'h0') = v_0(c);
vel.fx(c,'h%nh%') = v_f(c);

* 초기 지점
pos.l('x',h) = c_0('x') + v_0('x')*((ord(h) - 1)/nh);
pos.l('y',h) = c_0('y') + ((ord(h) - 1)/nh)*(c_f('y') - c_0('y'));
vel.l(c,h) = v_0(c);
cL.l(h) = cL_max/2;
단계 1 = 1.0/nh;

* 중간변수의 초기값
t_f.l = 단계.l*nh;
r.l[i] = sqr(pos.l['x',i]/r_0 - 2.5);
u.l[i] = u_c*(1 - r.l[i])*exp(-r.l[i]);
w.l[i] = vel.l['y',i] - u.l[i];
v.l[i] = sqrt(sqr(vel.l['x',i]) + sqr(w.l[i]));
D.l[i] = .5*(c0 + c1*sqr(cL.l[i]))*rho*S*sqr(v.l[i]);
L.l[i] = .5* cL.l[i] *rho*S*sqr(v.l[i]);
v_dot.l['x',i] = (-L.l[i]*w.l[i]/v.l[i] - D.l[i]*vel.l['x',i]/v.l[i])/m;
v_dot.l['y',i] = ( L.l[i]*vel.l['x',i]/v.l[i] - D.l[i]*w.l[i]/v.l[i])/m - g;

모델 글라이더 / 모두 /;

glider.workSpace = 5;

nlp를 사용하여 글라이더를 최대화하는 final_x를 해결합니다.