Dynamics and Control 
of two tanks in series  
Author's Data: Housam BINOUS
Department of Chemical Engineering
National Institute of Applied Sciences and Technology
Tunis, TUNISIA
Email: binoushousam@yahoo.com

Assume volumeric flowrate proportional to square root of tank height :  \(TraditionalForm\`q\_i\ \((t)\)\  = \ \(\(k\_i\)\(\ \)\(\@\(\(h\_\(\(i\)\(\ \)\)\)(t)\)\)\(\ \)\)\) where i=1, 2. Initially the two tanks are empty. Tank volume (Subscript[v, i])(t) = 
        (Subscript[A, i]) (Subscript[h, i ])(t) for i=1, 2.

Feed flowrate is constant equal to 1

(Subscript[q, 0])[t_] := UnitStep[t]

Numerical solution of the governing equations for (Subscript[A, 1])=4, (Subscript[A, 2])=3, (Subscript[k, 1]) = 0.5 and (Subscript[k, 2]) = 1.2

(Subscript[A, 1]) = 4; (Subscript[A, 2]) = 3; (Subscript[k, 1]) = 0.5; (Subscript[k, 2]) = 1.2;

sol1 = 
      NDSolve[{(Subscript[q, 0])[t] - (Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] == (Subscript[A, 1]) 
              D[(Subscript[h, 1])[t], {t, 
                  1}], 
(Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] - (Subscript[k, 2]) (Sqrt[(Subscript[h, 2])])[t] == (Subscript[A, 2]) D[(Subscript[h, 2])[t], {t, 1}], (Subscript[h, 1])[0] == 0, 
          (Subscript[h, 2])[0] == 0}, {(Subscript[h, 1])[t], (Subscript[h, 2])[t]}, {t, 0, 1000}]

Plotting heights of the two tanks versus time

plt1 = 
      Plot[{(Subscript[h, 1])[t] /. sol1, (Subscript[h, 2])[t] /. sol1}, {t, 0, 200}, 
        PlotStyle -> {RGBColor[1, 0, 0], RGBColor[0, 1, 0]}]

Control of the height of the second tank (set point equal to 2) by manipulating the feed flow rate using proportional and proportional-integral controllers.

Proportional controller gain (Subscript[K, p]) = 5

(Subscript[K, p]) = 5; (Subscript[hset, 2]) = 2;

Feed flowrate

(Subscript[q, 0])[t_] := Max[0, 1 + (Subscript[K, p]) ((Subscript[hset, 2]) - (Subscript[h, 2])[t])]

Numerical solution of the governing equations for (Subscript[A, 1])=4, (Subscript[A, 2])=3, (Subscript[k, 1]) = 0.5 and (Subscript[k, 2]) = 1.2

sol2 = 
      NDSolve[{(Subscript[q, 0])[t] - (Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] == (Subscript[A, 1]) 
              D[(Subscript[h, 1])[t], {t, 
                  1}], 
(Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] - (Subscript[k, 2]) (Sqrt[(Subscript[h, 2])])[t] == (Subscript[A, 2]) D[(Subscript[h, 2])[t], {t, 1}], (Subscript[h, 1])[0] == 0, 
          (Subscript[h, 2])[0] == 0}, {(Subscript[h, 1])[t], (Subscript[h, 2])[t]}, {t, 0, 1000}]

Plotting heights of the two tanks versus time

plt2 = 
      Plot[{(Subscript[h, 1])[t] /. sol2, (Subscript[h, 2])[t] /. sol2}, {t, 0, 200}, 
        PlotStyle -> {RGBColor[1, 0, 0], RGBColor[0, 1, 0]}]

Plotting feed flowrate versus time

plt3 = 
      Plot[(Subscript[q, 0])[t] /. sol2, {t, 0, 200}, PlotStyle -> RGBColor[0, 0, 1], 
        PlotRange -> All]

height of the second tank

(Subscript[h, 2])[t] /. sol2 /. t -> 200

Proportional-integral controller gain (Subscript[K, p]) = 5and time constant (Subscript[τ, I]) = 20 .

(Subscript[K, p]) = 5; (Subscript[hset, 2]) = 2; (Subscript[τ, I]) = 20;

Feed flowrate

(Subscript[q, 0])[t_] := 
      Max[0, 1 + (Subscript[K, p]) ((Subscript[hset, 2]) - (Subscript[h, 2])[t]) + 
          (Subscript[K, p])/(Subscript[τ, I]) int[t]]

Numerical solution of the governing equations for (Subscript[A, 1])=4, (Subscript[A, 2])=3, (Subscript[k, 1]) = 0.5 and (Subscript[k, 2]) = 1.2

sol3 = 
      NDSolve[{(Subscript[q, 0])[t] - (Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] == (Subscript[A, 1]) 
              D[(Subscript[h, 1])[t], {t, 
                  1}], 
(Subscript[k, 1]) (Sqrt[(Subscript[h, 1])])[t] - (Subscript[k, 2]) (Sqrt[(Subscript[h, 2])])[t] == (Subscript[A, 2]) D[(Subscript[h, 2])[t], {t, 1}], 
          D[int[t], {t, 1}] == (Subscript[hset, 2]) - (Subscript[h, 2])[t], (Subscript[h, 1])[0] == 0, 
          (Subscript[h, 2])[0] == 0, int[0] == 0}, {(Subscript[h, 1])[t], (Subscript[h, 2])[t], 
          int[t]}, {t, 0, 1000}]

Plotting heights of the two tanks versus time

plt4 = 
      Plot[{(Subscript[h, 1])[t] /. sol3, (Subscript[h, 2])[t] /. sol3}, {t, 0, 200}, 
        PlotStyle -> {RGBColor[1, 0, 0], RGBColor[0, 1, 0]}]

height of the second tank

(Subscript[h, 2])[t] /. sol3 /. t -> 200

Plotting feed flowrate versus time

plt5 = 
      Plot[(Subscript[q, 0])[t] /. sol3, {t, 0, 200}, PlotStyle -> RGBColor[0, 0, 1], 
        PlotRange -> All]