« View all new features in
Mathematica
9
◄
previous

next
►
New in
Mathematica
9
›
Enhanced Control Systems
Hydraulic System
Model the change in height of water in three tanks, with the third tank leaking.
Flow rates depend on pressure differences and geometry.
In[1]:=
X
flowRate = (p1[t]  pB[t]) (\[Pi] pipeDia^4)/(128 \[Mu] pipeLenB); flowRate1 = (pB[t]  p2[t]) (\[Pi] pipeDia^4)/(128 \[Mu] pipeLen1); flowRate2 = (pB[t]  p3[t]) (\[Pi] pipeDia^4)/(128 \[Mu] pipeLen2);
Create a descriptor
StateSpaceModel
from the DAEs.
In[2]:=
X
flowRateConstraint = (flowRate == flowRate1 + flowRate2); pressureEqns = {p1[t] == \[Rho] g h1[t], p2[t] == \[Rho] g h2[t], p3[t] == \[Rho] g h3[t]}; massConservation = {a1 h1'[t] == flowRate + inflow[t], a2 h2'[t] == flowRate1, a3 h3'[t] == flowRate2  a3 h3[t]/10};
In[3]:=
X
params = {pipeLenB > 1/10, pipeLen1 > 1/10, pipeLen2 > 1/5, pipeDia > 1/5, \[Rho] > 1/5, \[Mu] > 2 10^3, g > 9.81, a1 > 1, a2 > 1, a3 > 1};
In[4]:=
X
tanks = StateSpaceModel[ Join[pressureEqns, massConservation, {flowRateConstraint}] , {h1[t], h2[t], h3[t], pB[t], p1[t], p2[t], p3[t]}, {inflow[t]}, {h1[t], h2[t], h3[t]}, t] /. params
Out[4]=
The tanks take over a minute to settle from a nonzero initial condition.
In[5]:=
X
tanks = StateSpaceModel[ Join[pressureEqns, massConservation, {flowRateConstraint}] , {h1[t], h2[t], h3[t], pB[t], p1[t], p2[t], p3[t]}, {inflow[t]}, {h1[t], h2[t], h3[t]}, t] /. params; OutputResponse[{tanks, {1, 0, 0, 0, 0, 0, 0}}, {0}, {t, 0, 60}]; Plot[%, {t, 0, 60}, PlotRange > All, ImageSize > Medium]
Out[5]=
Find optimal state feedback gains based on cost matrices for the states and inputs. The resulting closedloop system settles much faster.
In[6]:=
X
k = Chop@LQRegulatorGains[tanks, {\!\(\* TagBox[ RowBox[{"(", "", GridBox[{ {"10", "0", "0", "0", "0", "0", "0"}, {"0", "10", "0", "0", "0", "0", "0"}, {"0", "0", "10", "0", "0", "0", "0"}, {"0", "0", "0", "2", "0", "0", "0"}, {"0", "0", "0", "0", "2", "0", "0"}, {"0", "0", "0", "0", "0", "2", "0"}, {"0", "0", "0", "0", "0", "0", FractionBox["1", "100"]} }, GridBoxAlignment>{ "Columns" > {{Center}}, "ColumnsIndexed" > {}, "Rows" > {{Baseline}}, "RowsIndexed" > {}, "Items" > {}, "ItemsIndexed" > {}}, GridBoxSpacings>{"Columns" > { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" > {}, "Rows" > { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" > {}, "Items" > {}, "ItemsIndexed" > {}}], "", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]\), {{100}}}];
In[7]:=
X
closedloopTanks = SystemsModelStateFeedbackConnect[tanks, k];
In[8]:=
X
closedloopTanks = SystemsModelStateFeedbackConnect[tanks, k];; OutputResponse[{closedloopTanks, {100, 0, 0, 0, 0, 0, 0}}, {0}, {t, 0, 60}]; Plot[%, {t, 0, 60}, PlotRange > All, ImageSize > Medium]
Out[8]=