설명
목표는 가장 비용이 적게 드는 원심 분리 구성을 식별하는 것입니다. 주어진 압력을 기준으로 사전 지정된 압력 상승을 달성하는 펌프 총 유량.
소형 모델 유형 :MINLP
카테고리 : 무료 슬롯 사이트 모델 라이브러리
메인 파일 : pump.gms
$title 펌프 네트워크 합성 (PUMP,SEQ=205)
$onText
목표는 가장 비용이 적게 드는 원심분리 구성을 식별하는 것입니다.
주어진 압력을 기준으로 사전 지정된 압력 상승을 달성하는 펌프
총 유량.
Floudas, C A, Pardalos, PM, Adjiman, C S, Esposito, W R,
Gumus, ZH, Harding, S T, Klepeis, J L, Meyer, C A 및
Schweiger, CA, 로컬 및 글로벌 테스트 문제 핸드북
최적화. 클루어 학술 출판사, 1999.
Westerlund, T, Petterson, F 및 Grossmann, I E, 최적화
MINLP 문제로서의 펌프 구성 문제. 컴퓨터
및 Chemical Engineering 18, 9 (1994), 845-858.
전체 모델 컬렉션은 다음에서 찾을 수 있습니다.
http://titan.princeton.edu/TestProblems/
키워드: 혼합 정수 비선형 프로그래밍, 펌프 네트워크 최적화, 펌프
구성, 엔지니어링, 프로세스 최적화
$offText
i '레벨 세트' / 1*3 / 설정;
스칼라
wmax '최대 회전 속도' / 2950 /
Vtot '총 체적 유량' / 350 /
dPtot '총 압력 상승' / 400 /
nsmax '직렬로 연결된 최대 펌프 수' / 3 /
npmax '병렬로 연결된 최대 펌프 수' / 3 /;
매개변수
Pmax(i) '최대 전력 출력'
C(i) '펌프의 고정 비용'
Cd(i) '운영 비용 계수';
테이블 ldata(i,*) '레벨 데이터'
Pmax C Cd m1 m2 m3 m4 m5 m6
1 80 6329.03 1800 19.90 0.1610 0.000561 0.696 629 0.01160
2 25 2489.31 1800 1.21 0.0644 0.000564 2.950 215 0.11500
3 45 3270.27 1800 6.52 0.1020 0.000232 0.530 361 0.00946;
Pmax(i) = ldata(i,'Pmax');
C(i) = ldata(i,'C');
Cd(i) = ldata(i,'Cd');
변수
P(i) '레벨 i에 있는 펌프의 전력 출력'
w(i) '레벨 i에 있는 펌프의 회전 속도'
dp(i) '레벨 i의 압력 상승'
vdot(i) '레벨 i의 펌프를 통한 흐름'
x(i) '레벨 i의 총 유량 비율'
np(i) '레벨 i의 평행선 수'
ns(i) '레벨 i에 직렬로 연결된 펌프의 수'
z(i) '레벨 i의 존재'
objval '목적 함수 변수';
양수 변수 P, w, dp, vdot, x;
정수 변수 np, ns;
이진변수 z;
방정식
f '목적 함수'
g(i) '레벨 i에 대한 전력 출력 계산'
gd(i) '레벨 i에 대한 압력 상승 계산'
sumx '부피 분수에 대한 제약'
gvdot(i) '레벨 i의 펌프에 대한 체적 유량 계산'
gdp(i) '압력 상승에 대한 제약'
lw(i) 'w에 대한 논리적 제약'
lP(i) 'P에 대한 논리적 제약'
ldp(i) '논리적 제약 조건 dp'
lvdot(i) 'vdot에 대한 논리적 제약'
lx(i) 'x에 대한 논리적 제약'
lnp(i) 'np에 대한 논리적 제약'
lns(i) 'ns에 대한 논리적 제약';
f.. objval =e= sum(i, (C(i) + Cd(i)*P(i))*np(i)*ns(i)*z(i));
g(i).. P(i) =e= ldata(i,'m1')*power(w(i)/wmax,3)
+ ldata(i,'m2')*power(w(i)/wmax,2)*vdot(i)
- ldata(i,'m3')*w(i)/wmax*power(vdot(i),2);
gd(i).. dp(i) =e= ldata(i,'m4')*w(i)/wmax*vdot(i)
+ ldata(i,'m5')*power(w(i)/wmax,2)
- ldata(i,'m6')*power(vdot(i),2);
sumx..sum(i,x(i)) =e= 1;
gvdot(i).. x(i) =e= vdot(i)/Vtot*np(i);
gdp(i).. z(i) =e= dp(i)/dPtot*ns(i);
lw(i).. w(i)/wmax =l= z(i);
lP(i)..P(i)/Pmax(i) =l= z(i);
ldp(i)..dp(i)/dPtot =l= z(i);
lvdot(i).. vdot(i)/Vtot =l= z(i);
lx(i).. x(i) =l= z(i);
lnp(i)..np(i) =l= npmax*z(i);
lns(i)..ns(i) =l= nsmax*z(i);
P.up(i) = Pmax(i);
w.up(i) = wmax;
dp.up(i) = dPtot;
vdot.up(i) = Vtot;
x.up(i) = 1;
np.up(i) = npmax;
ns.up(i) = nsmax;
h '변수 이름 헤더' 설정 / P, dp, vdot, w, x, np, ns, z /;
테이블 gs(i,h) '전역 솔루션'
P dp vdot w x np ns z
1 28.27034 400 160 2855.102 0.91428570 2 1 1
2 2.63440 200 30 2950.000 0.08571429 1 2 1;
* 시작점 초기화
* 모든 장비를 켜고 모델이 일부를 낮추도록 하세요.
* 그렇지 않으면 NLP 솔버가 실현가능점을 찾지 못합니다.
P.l(i) = P.up(i);
dp.l(i) = dp.up(i);
vdot.l(i) = vdot.up(i);
w.l(i) = w.up(i);
x.l(i) = 0.33;
z.l(i) = 1;
np.l(i) = np.up(i);
ns.l(i) = ns.up(i);
옵션 optCr = 0.0;
모델 펌프 / 모두 /;
objval을 최소화하는 minlp를 사용하여 펌프를 해결합니다.
exec오류 = 0;
* 글로벌 솔루션을 찾았나요?
매개변수 담당자 '솔루션 보고서';
rep('P',i,'local') = P.l(i);
rep('dp',i,'local') = dp.l(i);
rep('vdot',i,'local') = vdot.l(i);
담당자('w',i,'local') = w.l(i);
rep('x',i,'local') = x.l(i);
rep('z',i,'local') = z.l(i);
rep('np',i,'local') = np.l(i);
담당자('ns',i,'local') = ns.l(i);
담당자(h,i,'글로벌') = gs(i,h);
담당자(h,i,'diff') = 담당자(h,i,'글로벌') - 담당자(h,i,'로컬');
옵션 담당자:8:2:1;
디스플레이 담당자;