PROPT Lee-Ramirez Bioreactor

From TomWiki
Jump to navigationJump to search

Notice.png

This page is part of the PROPT Manual. See PROPT Manual.

Dynamic optimization of chemical and biochemical processes using restricted second-order information 2001, Eva Balsa-Canto, Julio R. Banga, Antonio A. Alonso Vassilios S. Vassiliadis

Case Study II: Lee-Ramirez bioreactor

Problem description

This problem considers the optimal control of a fed-batch reactor for induced foreign protein production by recombinant bacteria, as presented by Lee and Ramirez (1994) and considered afterwards by Tholudur and Ramirez (1997) and Carrasco and Banga (1998). The objective is to maximize the profitability of the process using the nutrient and the inducer feeding rates as the control variables. Three different values for the ratio of the cost of inducer to the value of the protein production (Q) were considered.

The mathematical formulation, following the modified parameter function set presented by Tholudur and Ramirez (1997) to increase the sensitivity to the controls, is as follows:

Find u1(t) and u2(t) over t in [t0 t_f] to maximize:


subject to:





where the state variables are the reactor volume (x1), the cell density (x2), the nutrient concentration (x3), the foreign protein concentration (x4), the inducer concentration (x5), the inducer shock factor on cell growth rate (x6) and the inducer recovery factor on cell growth rate (x7). The two control variables are the glucose rate (u1) and the inducer feeding rate (u2). Q is the ratio of the cost of inducer to the value of the protein production, and the final time is considered fixed as t_f = 10 h. The model parameters were described by Lee and Ramirez (1994). The initial conditions are:


The following constraints on the control variables are considered:


% Copyright (c) 2007-2008 by Tomlab Optimization Inc.

Problem setup

toms t

for n=[20 35 55 85]


    p = tomPhase('p', t, 0, 10, n);
    setPhase(p);

    tomStates z1 z2 z3s z4 z5 z6 z7

    % Declaring u as "states" makes it possible to work with their
    % derivatives.
    tomStates u1 u2

    % Scale z3 by 40
    z3 = z3s*40;

    % Initial guess
    if n == 20
        x0 = {icollocate({z1 == 1; z2 == 0.1
            z3 == 40; z4 == 0; z5 == 0
            z6 == 1; z7 == 0})
            icollocate({u1==t/10; u2==t/10})};
    else
        x0 = {icollocate({z1 == z1opt
            z2 == z2opt; z3 == z3opt
            z4 == z4opt; z5 == z5opt
            z6 == z6opt; z7 == z7opt})
            icollocate({u1 == u1opt
            u2 == u2opt})};
    end

    % Box constraints
    cbox = {mcollocate({0 <= z1; 0 <= z2
        0 <= z3; 0 <= z4; 0 <= z5})
        0 <= collocate(u1) <= 1
        0 <= collocate(u2) <= 1};

    % Boundary constraints
    cbnd = initial({z1 == 1; z2 == 0.1
        z3 == 40; z4 == 0; z5 == 0
        z6 == 1; z7 == 0});

    % Various constants and expressions
    c1 = 100; c2 = 0.51; c3 = 4.0;
    Q  = 0;

    t1 = 14.35+z3+((z3).^2/111.5);
    t2 = 0.22+z5;
    t3 = z6+0.22./t2.*z7;

    g1 = z3./t1.*(z6+z7*0.22./t2);
    g2 = 0.233*z3./t1.*((0.0005+z5)./(0.022+z5));
    g3 = 0.09*z5./(0.034+z5);

    % ODEs and path constraints
    ceq = collocate({
        dot(z1) == u1+u2
        dot(z2) == g1.*z2-(u1+u2).*z2./z1
        dot(z3) == u1./z1.*c1-(u1+u2).*z3./z1-g1.*z2/c2
        dot(z4) == g2.*z2-(u1+u2).*z4./z1
        dot(z5) == u2*c3./z1-(u1+u2).*z5./z1
        dot(z6) == -g3.*z6
        dot(z7) == g3.*(1-z7)});

    % Objective
    J = -final(z1)*final(z4)+Q*integrate(u2);

    spenalty = 0.1/n; % penalty term to yield a smoother u.
    objective = J + spenalty*integrate(dot(u1)^2+dot(u2)^2);

Solve the problem

    options = struct;
    options.name = 'Lee Bio Reactor';
    solution = ezsolve(objective, {cbox, cbnd, ceq}, x0, options);

    % Optimal z, u for starting point
    z1opt = subs(z1, solution);
    z2opt = subs(z2, solution);
    z3opt = subs(z3, solution);
    z4opt = subs(z4, solution);
    z5opt = subs(z5, solution);
    z6opt = subs(z6, solution);
    z7opt = subs(z7, solution);
    u1opt = subs(u1, solution);
    u2opt = subs(u2, solution);
Problem type appears to be: qpcon
Time for symbolic processing: 0.75819 seconds
Starting numeric solver
===== * * * =================================================================== * * *
TOMLAB - TOMLAB Development license  999007. Valid to 2011-12-31
=====================================================================================
Problem: ---  1: Lee Bio Reactor                f_k      -6.158551034261496900
                                       sum(|constr|)      0.000000279053783607
                              f(x_k) + sum(|constr|)     -6.158550755207713200
                                              f(x_0)      0.001000000000000196

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  744 ConJacEv  744 Iter  573 MinorIter 3217
CPU time: 2.308815 sec. Elapsed time: 2.305000 sec. 

Problem type appears to be: qpcon
Time for symbolic processing: 0.74722 seconds
Starting numeric solver
===== * * * =================================================================== * * *
TOMLAB - TOMLAB Development license  999007. Valid to 2011-12-31
=====================================================================================
Problem: ---  1: Lee Bio Reactor                f_k      -6.149281027809802700
                                       sum(|constr|)      0.000002151758382440
                              f(x_k) + sum(|constr|)     -6.149278876051420500
                                              f(x_0)     -6.161215441652444700

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  548 ConJacEv  548 Iter  486 MinorIter 1855
CPU time: 5.787637 sec. Elapsed time: 5.447000 sec. 

Problem type appears to be: qpcon
Time for symbolic processing: 0.75518 seconds
Starting numeric solver
===== * * * =================================================================== * * *
TOMLAB - TOMLAB Development license  999007. Valid to 2011-12-31
=====================================================================================
Problem: ---  1: Lee Bio Reactor                f_k      -6.148479046961865500
                                       sum(|constr|)      0.000000948376662244
                              f(x_k) + sum(|constr|)     -6.148478098585203000
                                              f(x_0)     -6.151342657272863300

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  508 ConJacEv  508 Iter  443 MinorIter 2428
CPU time: 16.052503 sec. Elapsed time: 16.059000 sec. 

Problem type appears to be: qpcon
Time for symbolic processing: 0.75258 seconds
Starting numeric solver
===== * * * =================================================================== * * *
TOMLAB - TOMLAB Development license  999007. Valid to 2011-12-31
=====================================================================================
Problem: ---  1: Lee Bio Reactor                f_k      -6.149330296208792600
                                       sum(|constr|)      0.000000385398306198
                              f(x_k) + sum(|constr|)     -6.149329910810486400
                                              f(x_0)     -6.149452089871609000

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  689 ConJacEv  689 Iter  616 MinorIter 2438
CPU time: 79.123707 sec. Elapsed time: 79.308000 sec. 


end

t  = subs(collocate(t),solution);
z1 = subs(collocate(z1),solution);
z2 = subs(collocate(z2),solution);
z3 = subs(collocate(z3),solution);
z4 = subs(collocate(z4),solution);
z5 = subs(collocate(z5),solution);
z6 = subs(collocate(z6),solution);
z7 = subs(collocate(z7),solution);
u1 = subs(collocate(u1),solution);
u2 = subs(collocate(u2),solution);

Plot result

figure(1)
plot(t,z1,'*-',t,z2,'*-',t,z3/10,'*-',t,z4,'*-' ...
    ,t,z5,'*-',t,z6,'*-',t,z7,'*-');
legend('z1','z2','z3/10','z4','z5','z6','z7');
title('Lee Bio Reactor state variables.');

figure(2)
plot(t,u1,'+-',t,u2,'+-');
legend('u1','u2');
title('Lee Bio Reactor control');

disp('J = ');
disp(subs(J,solution));
J = 
   -6.1510

LeeBioReactor 01.png

LeeBioReactor 02.png