Hi,
I am facing problem in making some constraints. At the end of this briefing you can find model. One can see eq_2 under mixer section, it is non-linear equation and I want to transform into linear equation because I am using MIP modelling. Eq_5 is basically energy balance equation of the below form
mcpt1 = mcpt2
where m and t are variables and cp is constant, so multiplication of two variables are not allowed in MIP modelling so in order
to make above equation linear, I introduce a new variable z and replace m and t with z and resulting equation become linear as follows
z1cp =z2 cp
and bounds of z is assume z.lo = m.lot.lo and z.up = m.upt.up . Uptill this point constraints work well but when I construct another equation to get back value of t, equation again become non linear because t = z/f where z and f are variables (eq_3 in model). Currently as I knew that f is equal to 6200 so I divided by 6200 instead by F but again problem is I dont want to make variable ‘f’ a scalar quantity.
Please help me in this regard how to make a constraint that I can get value of t and f remain variable and problem still remain MIP???
Scalars
eps1 /0.0001/
supply Raw material kg per mint /1240 /
Feed_cost Feed cost per kg / 0.068 /
\
- upper Limits
uflow upper limit to flow / 100000 /
utemp upper limit to temp /7/
upress upper limit to prssure /4/
;
sets
str process streams /1*3/
compon chemical components /
H2O
LAMI
CELL
MANN
ALGI
ASH
PRO
FUC
Lip
/
sets
mxr mixer / 1 /
\
-
================
-
Mixer
-
================
imxr(mxr,str) inlet streams to mixer /
1.(1,2)
/
omxr(mxr,str) outlet stream from mixer /
1.3
/
;
Parameters
composition(compon) chemical composotion of feed /
LAMI = 0.14
CELL = 0.06
MANN = 0.12
ALGI = 0.23
ASH = 0.26
PRO = 0.12
FUC = 0.05
LIP = 0.02
/
parameter cp(str) pure component heat capacites
/
1 1.00
2 2.99
3 2.59
/
\
-
================
-
Streams
-
================
binary variable y(str) ;
variable
profit overall profit ($1000 per year);
positive variables
fc(str,compon) component mass flowrate (kg per mint)
f(str) stream mass flowrate (kg per mint)
p(str) stream pressure (mega-pascal)
t(str) stream temperature (100 k)
equations
fbal(str) Total flow
feed(compon) define feed component flows
feed2 ammount of water added to make 70% composition of water
feed3 total flow of stream 2 setting to component flow of water
obj objective function
a100 feed avaialble is equal to supply
;
fbal(str)…
f(str) =e= sum( compon, fc(str,compon) ) ;
feed(compon)$composition(compon)…
fc(‘1’,compon) =e= f(‘1’) * composition(compon) ;
a100… f(‘1’) =e= supply ;
feed2…
fc(‘3’,‘h2o’) =e= 0.8*f(‘3’) ;
feed3…
f(‘2’) =e= fc(‘2’,‘H2O’) ;
\
-
================
-
Mixer 1
-
================
positive variable
mxr_qh(mxr)
mxrp(mxr) mixer pressure (m-pa)
mxrt(mxr) mixer temperature (100 k)
z(str)
;
equations
eq_1(mxr,compon) component balance in mixer
eq_2 heat balance in mixer
eq_3 returing value of temperature
eq_4(mxr,str) inlet pressure relation
eq_5(mxr,str) outlet pressure relation
;
*component balance
eq_1(mxr,compon)…
sum(str$omxr(mxr,str),fc(str,compon)) =e= sum(str$imxr(mxr,str),fc(str,compon)) ;
eq_2(mxr)…
-
sum( str $ imxr(mxr,str) , f(str) * t(str) * cp(str) ) =e=
-
sum( str $ omxr(mxr,str) , f(str) * t(str) * cp(str) ) ;
-
Here I introduced new variable z which is equal to z = f(str)*t(Str), for making above equation linear
-
and bounds of z is equal to f.lot.lo and f.upt.up
sum( str imxr(mxr,str) , z(str) * cp(str) ) =e=
sum( str omxr(mxr,str) , z(str) * cp(str) ) ;
eq_3(mxr)…
- below equation has one limitation, I am not finding a way how to formulate constraint
*that can give back value of temperature, actually value of t can be calculated - dividing z by total flow. However if a do so, constraint will again become non- linear
- because both flow and z are variables, please help me to formulate constraint
sum( str omxr(mxr,str) , z(str)/6200) =e= sum( str omxr(mxr,str) , t(str)) ;
eq_4(mxr,str) (imxr(mxr,str)(ord(mxr) eq 1))…
mxrp(mxr) =e=
p(str) ;
eq_5(mxr,str) (omxr(mxr,str)(ord(mxr) eq 1))…
mxrp(mxr) =e=
p(str) ;
\
- ================================
- = Objective function =
- ================================
obj… profit =e=
-510*(f(‘1’)* Feed_cost)
;
-
==================
-
= Bounds =
-
==================
f.lo(str) = 0;
f.up(str)= 100000 ;
p.lo(str) = 0.1;
p.up(str) = 4.0;
t.lo(str) = 2.93 ;
t.up(str) = 7 ;
z.lo(str) = 0 ;
z.up(str) = 43400 ; -
plant design capacity based on ethanol
*f.up(‘47’) = 300; -
Seaweed feed
t.fx(‘1’) = 2.93;
p.fx(‘1’) = 0.1 ;
z.fx(‘1’) = 3633.2; -
Water feed
t.fx(‘2’) = 2.93;
p.fx(‘2’) = 0.1 ;
\ -
==================
-
= m i x e r =
-
==================
mxrt.lo(mxr) = 2.73 ;
mxrt.up(mxr) = 7 ;
mxrp.lo(mxr) = 0.1 ;
mxrp.up(mxr) = 4.0 ;
t.fx(‘3’) = 2.931;
*option nlp = cplex;
model m /all/;
solve m maximize profit using mip;
Display f.l,p.l,t.l,z.l;