Ethanol : Optimal Control of a Fed-Batch Bioreactor for the Production of Ethanol from the Anaerobic Glucose Fermentation by Saccharomyces Cerevisiae


  • Neculai Andrei, Nonlinear Optimization Applications Using the GAMS Technology,Springer Optimization and Its Applications, Model Ethanol (12.11) in chapter Optimal Control , 2013

Category : GAMS NOA library

Mainfile : ethanol.gms

Optimal control of fed-batch reactor for ethanol production.
A fed-batch bioreactor for the production of ethanol from the anaerobic
glucose fermentation by Saccharomyces cerevisiae.

Larrosa, J.A.E., New heuristics for global optimization of complex
bioprocesses. Ph.D. Thesis, Universidade de Vigo, Departamento de Enxeera
Qumica, Vigo, 2008.

$if     set n  $set nh %n%
$if not set nh $set nh 100

set nh Number of subintervals / 0*%nh% /;
alias (nh,k);

Scalar    tf   final time /54/
          y1_0 initial value for y1 / 20/
          y2_0 initial value for y2 / 150 /
          y3_0 initial value for y3 / 21 /
          y4_0 initial value for y4 / 10 /
          a    a parameter in objective function /0.0/
          h ;


Variables y1(nh)  microbial population concentration
          y2(nh)  substrate concentration
          y3(nh)  the product concentration
          y4(nh)  volume
          u(nh)   control variable
          obj     criterion ;

Equations eobj        criterion definition
          state1(nh)  state equation 1
          state2(nh)  state equation 2
          state3(nh)  state equation 3
          state4(nh)  state equation 4
          ep2(nh) ;

* Objective function to be maximized:
 obj =e= y3['%nh%']*y4['%nh%'] +
         h*a*sum(nh(k+1), ((u(k+1)-u(k))*(u(k+1)-u(k))) );

* Constraints:
y1[k+1] =e= y1(k)+
   (h/2)*( p1(k)*y1(k)    - u(k)*y1(k)/y4(k) +
           p1(k+1)*y1(k+1)- u(k+1)*y1(k+1)/y4(k+1) ) ;

y2[k+1] =e= y2(k)+
   (h/2)*( (-10)*p1(k)*y1(k) + u(k)*((150-y2(k))/y4(k)) +
           (-10)*p1(k+1)*y1(k+1) + u(k+1)*((150-y2(k+1))/y4(k+1)) );

y3[k+1] =e= y3(k)+
   (h/2)*( p2(k)*y1(k) - u(k)*y3(k)/y4(k) +
           p2(k+1)*y1(k+1) - u(k+1)*y3(k+1)/y4(k+1) );

y4[k+1] =e= y4(k) + (h/2)*(u(k) + u(k+1));

ep1(nh(k)).. p1(k) =e= (0.408/(1+y3(k)/16))*(y2(k)/(0.22+y2(k)));
ep2(nh(k)).. p2(k) =e= (1/(1+y3(k)/71.5))*(y2(k)/(0.44+y2(k)));

*Initial point
u.l[nh] =10;

* Fixed values:
y1.fx ['0'] = y1_0;
y2.fx ['0'] = y2_0;
y3.fx ['0'] = y3_0;
y4.fx ['0'] = y4_0;
y4.fx ['%nh%'] = 200;

u.lo(nh) = 0;     u.up(nh) = 12;

y1.lo(nh) = 0;
y2.lo(nh) = 0;
y3.lo(nh) = 0;
y4.lo(nh) = 0;

Model ethanol /all/;

$iftheni x%mode%==xbook
$onecho >bench.opt
  solvers conopt knitro
option nlp=bench

Solve ethanol maximizing obj using nlp;

$iftheni x%mode%==xbook
file stat1 /eth1.dat/;
file stat2 /eth2.dat/;
file stat3 /eth3.dat/;
file stat4 /eth4.dat/;
file cont  /eth.dat/;

put stat1;
loop(nh, put y1.l(nh):10:5,',', put/)

put stat2;
loop(nh, put y2.l(nh):10:5,',', put/)

put stat3;
loop(nh, put y3.l(nh):10:5,',', put/)

put stat4;
loop(nh, put y4.l(nh):10:5,',', put/)

put cont;
loop(nh, put u.l(nh):10:5,',', put/)

* End of ethanol