로켓 : 로켓의 동적 최적화

참조

  • Neculai Andrei, 슬롯 나라 기술을 사용한 비선형 최적화 애플리케이션, 스프링거 최적화 및 그 애플리케이션, 모델로켓(5.30) 장기계공학의 응용, 2013

카테고리 : 슬롯 나라 NOA 라이브러리


메인파일 : rocket.gms

$onText
    고다드 로켓.
    다음을 사용하여 수직 발사 로켓의 최종 고도를 최대화합니다.
    추력을 제어로 사용하고 초기 질량, 연료 질량 및
    로켓의 항력 특성.

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

    이산화 지점의 수는 다음을 사용하여 지정할 수 있습니다.
    명령줄 매개변수.
    COPS 성능 테스트는 nh = 50에 대해 보고되었습니다.
    100, 200, 400

    참고자료:
  * Dolan, E D 등, JJ, 벤치마킹 최적화
    COPS가 포함된 소프트웨어. 기술. 대표, 수학과 컴퓨터
    과학부, 2000.
  * Bryson, AE, 동적 최적화. 애디슨 웨슬리, 1999.
$offText

$if 세트 n $set nh %n%
$설정되지 않은 경우 nh $set nh 1000

h 간격 설정 / h0 * h%nh%/

스칼라
   h_0 초기 높이 / 1 /
   v_0 초기 속도 / 0 /
   m_0 초기 질량 / 1 /
   g_0 표면의 중력 / 1 /
   nh 메시의 간격 수 / %nh% /
   r_c 추력 상수 /3.5/
   v_c / 620 /
   h_c / 500 /
   m_c / 0.6 /
   D_c
   m_f 최종 질량
   c ;

* 상수:
c = 0.5*sqrt(g_0*h_0);
m_f = m_c*m_0;
D_c = 0.5*v_c*(m_0/g_0);

변수 final_velocity

긍정적인
변수 단계 단계 크기
           v(h) 속도
           ht(h) 높이
           g(h) 중력
           m(h) 질량
           r(h) 추력
           d(h) 드래그 ;

* 경계:
ht.lo(h) = h_0;

r.lo(h) = 0.0;
r.up(h) = r_c*(m_0*g_0);

m.lo(h) = m_f;
m.up(h) = m_0;

* 초기값:
ht.l(h) = 1;
v.l(h) = ((ord(h)-1)/nh)*(1 - ((ord(h)-1)/nh));
m.l(h) = (m_f - m_0)*((ord(h)-1)/nh) + m_0;
r.l(h) = r.up(h)/2;
단계 1 = 1/nh;

d.l(h) = D_c*sqr(v.l(h))*exp(-h_c*(ht.l(h)-h_0)/h_0);
g.l(h) = g_0*sqr(h_0/ht.l(h));

* 변수의 고정 값:
ht.fx('h0') = h_0;
v.fx('h0') = v_0;
m.fx('h0') = m_0;
m.fx('h%nh%') = m_f;

방정식 df(h) 끌기 함수
           gf(h) 중력 함수
           객체
           h_eqn(h), v_eqn(h), m_eqn(h);

obj..final_velocity =e= ht('h%nh%');

df(h).. d(h) =e= D_c*sqr(v(h))*exp(-h_c*(ht(h)-h_0)/h_0);

gf(h).. g(h) =e= g_0*sqr(h_0/ht(h));

h_eqn(h-1)..ht(h) =e= ht(h-1) + .5*단계*(v(h) + v(h-1));

m_eqn(h-1).. m(h) =e= m(h-1) - .5*단계*(r(h) + r(h-1))/c;

v_eqn(h-1).. v(h) =e= v(h-1)
                    + .5*단계*((r(h) - D(h) - m(h) *g(h)) /m(h)
                              +(r(h-1) - D(h-1) - m(h-1)*g(h-1))/m(h-1));

모형 로켓 /all/;

$ifThenI x%mode%==xbook
로켓.iterlim=80000;
$endIf

final_velocity를 최대화하는 nlp를 사용하여 로켓을 해결합니다.

$ifThenI x%mode%==xbook
 파일 res1 /m9.dat/;
 res1을 넣어

 루프(h, r.l(h):10:7 넣기, 넣기/)
$endIf

* 엔드 로켓

*------------------- 내가 얻은 수치 실험 ----------------
* 2011년 1월 15일
*
*
* 변형 1:
* nh=500
* m=2502, n=3007
* CONOPT3:
* 1997년 반복, 22.713초
* vfo=1.012836666
* 니트로:
* 70개의 주요 반복, 91개의 작은 반복, 171개의 기능 평가
* 5.89초
* vfo=1.01262977
* 미노스:
* iter=43, fev=2781, 0.230초
* vfo=1.102603
*
* 변형 2:
* nh=1000
* m=5003, n=6008
* CONOPT3:
* 2700회 반복, 49.801초
* vfo=1.012835932
* 니트로:
* 71개의 주요 반복, 93개의 작은 반복, 164개의 기능 평가
* 19.327초
* vfo=1.0123973821
* 미노스:
* 35회 반복, 38.846초
* vfo=1.012243
*-------------------------------------------------------