alkyl.gms : Simplified Alkylation Process

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.


Reference

  • Berna, T J, Locke, M H, and Westerberg, A W, A New Approach to Optimization of Chemical Processes. American Institute of Chemical Engineers Journal 26, 1 (1980), 37-43.

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;