Description
This model describes a simplified alkylation process. Note the modeling of error bounds on the estimated equations. This formulation is very efficient in terms of problem comprehension and solution. The additional nonlinearities are bounded in a narrow range and introduce no additional computational burden.
Small Model of Type : NLP
Category : GAMS Model library
Main file : alkyl.gms
$title Simplified Alkylation Process (ALKYL,SEQ=165)
$onText
This model describes a simplified alkylation process. Note the
modeling of error bounds on the estimated equations. This formulation
is very efficient in terms of problem comprehension and solution. The
additional nonlinearities are bounded in a narrow range and
introduce no additional computational burden.
Berna, T, Locke, M, and Westerberg, A, Simplified Alkylation Process.
AIChE Journal 26 (1980), 37.
Keywords: nonlinear programming, chemical engineering, alkylation process
$offText
Variable
F 'objective variable'
OlefinFeed 'Olefins feed'
IsobutRec 'Isobutane recycle'
AcidFeed 'Acid feed'
AlkylYld 'Alkylate yield'
IsobutMak 'Isobutane makeup'
AcidStren 'Acid strength'
Octane 'Octane number'
Ratio 'iC4 Olefin ratio'
AcidDilut 'Acid dilution factor'
F4Perf 'F4 performance number'
alkerr
octerr
aciderr
F4err;
Equation
Objective 'objective function'
AlkylShrnk 'Alkylate volumetric shrinkage equation'
AcidBal 'Acid material balance'
IsobutBal 'Isobutane component balance'
AlkylDef
OctDef
AcidDef
F4Def;
Objective.. F =e= - 6.3*AlkylYld*Octane + 5.04*OlefinFeed + 0.35*IsobutRec + AcidFeed + 3.36*IsobutMak;
AlkylShrnk.. AlkylYld =e= (OlefinFeed+IsobutMak)/1.22;
AcidBal.. 0.98*AcidFeed =e= AcidStren*((AlkylYld*AcidDilut)/100.0 + AcidFeed);
IsoButBal.. 10.0*IsobutRec + IsobutMak =e= OlefinFeed*Ratio;
AlkylDef.. AlkylYld*AlkErr =e= OlefinFeed*(1.12 + 0.13167*Ratio - 0.0067*Ratio*Ratio);
OctDef.. Octane*OctErr =e= 0.8635+(1.098*Ratio - 0.038*Ratio*Ratio)/100 + 0.325*(AcidStren - 0.89);
AcidDef.. AcidDilut*AcidErr =e= 35.82 - 22.2*F4Perf;
F4Def.. F4Perf*F4Err =e= -1.33 + 3*Octane;
alkerr.lo = .99; alkerr.up = 1/.99; alkerr.l = 1;
octerr.lo = .99; octerr.up = 1/.99; octerr.l = 1;
aciderr.lo = .90; aciderr.up = 1/.90; aciderr.l = 1;
F4err.lo = .99; F4err.up = 1/.99; F4err.l = 1;
F.l = -0.90;
OlefinFeed.lo = 0; OlefinFeed.up = 2.00; OlefinFeed.l = 1.745;
IsobutRec.lo = 0; IsobutRec.up = 1.60; IsobutRec.l = 1.2;
AcidFeed.lo = 0; AcidFeed.up = 1.20; AcidFeed.l = 1.10;
AlkylYld.lo = 0; AlkylYld.up = 5.00; AlkylYld.l = 3.048;
IsobutMak.lo = 0; IsobutMak.up = 2.00; IsobutMak.l = 1.974;
AcidStren.lo = 0.85; AcidStren.up = 0.93; AcidStren.l = 0.893;
Octane.lo = 0.90; Octane.up = 0.95; Octane.l = 0.928;
Ratio.lo = 3; Ratio.up = 12; Ratio.l = 8;
AcidDilut.lo = 1.2; AcidDilut.up = 4; AcidDilut.l = 3.6;
F4Perf.lo = 1.45; F4Perf.up = 1.62; F4Perf.l = 1.45;
Model m / all /;
$onText optimal solutions
OlefinFeed.fx = 1.70368;
IsobutRec.fx = 1.58449;
AcidFeed.fx = .543165;
AlkylYld.fx = 3.03581;
IsobutMak.fx = 2.0;
AcidStren.fx = .90133;
Octane.fx = .950;
Ratio.fx = 10.4743;
AcidDilut.fx = 1.56164;
F4Perf.fx = 1.53535;
m.holdFixed = 1;
$offText
solve m using nlp minimizing f;