6. System Interconnections

6.1 Elementary Interconnections

6.1.1 Connecting in Series

<< ControlSystems`

ss1 = 
      StateSpace[{{(Subscript[a, 11]), (Subscript[a, 12])}, {(Subscript[a, 21]), (Subscript[a, 22])}}, {{(Subscript[b, 11]), (Subscript[b, 12])}, {(Subscript[b, 21]), 
            (Subscript[b, 22])}}, {{(Subscript[c, 11]), (Subscript[c, 12])}, {(Subscript[c, 21]), (Subscript[c, 22])}}, {{(Subscript[d, 11]), 
            (Subscript[d, 12])}, {(Subscript[d, 21]), (Subscript[d, 22])}}]

ss2 = 
      StateSpace[{{(Subscript[A, 11]), (Subscript[A, 12])}, {(Subscript[A, 21]), (Subscript[A, 22])}}, {{(Subscript[B, 1]), 0}, {0, 
            (Subscript[B, 2])}}, {{(Subscript[C, 11]), (Subscript[C, 12])}}, {{(Subscript[D, 11]), (Subscript[D, 12])}}]

SeriesConnect[ss1, ss2]

% // StandardForm

SeriesConnect[ss1, ss2, {2, 1}]

SeriesConnect[ss1, ss2, {{2, 1}, {1, 2}}]

integrator = TransferFunction[s, (1/s)]

SeriesConnect[ss1, integrator, {1, 1}]

SeriesConnect[integrator, integrator]

tf = 
      TransferFunction[
        s, {{(s/((((s + 1))^2) (((s + 2))^2))), 
            (s/(((s + 2))^2))}, {-(s/(((s + 2))^2)), -(s/(((s + 2))^2))}, {(1/(((s + 2))^2)), (s/(((s + 1))^2))}}]

SeriesConnect[tf, integrator, {3, 1}]

cascade[s__] := Fold[SeriesConnect, First[{s}], Rest[{s}]]

cascade[s1, s2, s3, s4]

TreeForm[%]

Table[TransferFunction[s, (1/(s + i))], {i, 0, 3}]

%% /. Thread[{s1, s2, s3, s4} -> %]

6.1.2 Connecting in Parallel

ss1 = 
      StateSpace[{{(Subscript[a, 11]), (Subscript[a, 12])}, {(Subscript[a, 21]), (Subscript[a, 22])}}, {{(Subscript[b, 11]), (Subscript[b, 12])}, {(Subscript[b, 21]), 
            (Subscript[b, 22])}}, {{(Subscript[c, 11]), (Subscript[c, 12])}, {(Subscript[c, 21]), (Subscript[c, 22])}}, {{(Subscript[d, 11]), 
            (Subscript[d, 12])}, {(Subscript[d, 21]), (Subscript[d, 22])}}]

ss2 = 
      StateSpace[{{(Subscript[A, 11]), (Subscript[A, 12])}, {(Subscript[A, 21]), (Subscript[A, 22])}}, {{(Subscript[B, 1]), 0}, {0, 
            (Subscript[B, 2])}}, {{(Subscript[C, 11]), (Subscript[C, 12])}}, {{(Subscript[D, 11]), (Subscript[D, 12])}}]

ParallelConnect[ss1, 
      ss2, {{1, 1}, {2, 2}}, {{1, 1}, {2, 1}}]

tf = 
      TransferFunction[
        s, {{(s/((((s + 1))^2) (((s + 2))^2))), 
            (s/(((s + 2))^2))}, {-(s/(((s + 2))^2)), -(s/(((s + 2))^2))}, {(1/(((s + 2))^2)), (s/(((s + 1))^2))}}]

ParallelConnect[tf, tf, {{1, 2}, {2, 1}}, {{1, 3}, {2, 2}, {3, 1}}] // 
      Simplify

6.1.3 Closing Feedback Loop

ss = 
      StateSpace[DiagonalMatrix[{(Subscript[a, 1]), (Subscript[a, 2])}], DiagonalMatrix[{(Subscript[b, 1]), (Subscript[b, 2])}], 
        DiagonalMatrix[{(Subscript[c, 1]), (Subscript[c, 2])}], 
        DiagonalMatrix[{(Subscript[d, 1]), (Subscript[d, 2])}]]

FeedbackConnect[ss]

Together /@ %

tf = 
      TransferFunction[
        s, {{(s/((((s + 1))^2) (((s + 2))^2))), 
            (s/(((s + 2))^2))}, {-(s/(((s + 2))^2)), -(s/(((s + 2))^2))}, {(1/(((s + 2))^2)), (s/(((s + 1))^2))}}]

FeedbackConnect[tf, {{1, 1}, {2, 2}}] // Simplify

ss1 = 
      StateSpace[{{(Subscript[a, 11]), (Subscript[a, 12])}, {(Subscript[a, 21]), (Subscript[a, 22])}}, {{(Subscript[b, 11]), (Subscript[b, 12])}, {(Subscript[b, 21]), 
            (Subscript[b, 22])}}, {{(Subscript[c, 11]), (Subscript[c, 12])}, {(Subscript[c, 21]), (Subscript[c, 22])}}, {{(Subscript[d, 11]), 
            (Subscript[d, 12])}, {(Subscript[d, 21]), (Subscript[d, 22])}}]

\(FeedbackConnect[ss1, ss /. d\__ -> 0, Positive]\)

\(FeedbackConnect[ss1, 
      ss /. d\__ -> 0, {1, 
        2}, {{2, Positive}, {1, Negative}}]\)

SeriesConnect[TransferFunction[s, g[s]], 
      TransferFunction[s, h[s]]]

ParallelConnect[TransferFunction[s, g[s]], 
      TransferFunction[s, h[s]]]

FeedbackConnect[TransferFunction[s, g[s]], 
      TransferFunction[s, h[s]]]

6.2 Arbitrary Interconnections

ss  =  
      StateSpace[{{(Subscript[a, 1]), 0}, {0, (Subscript[a, 2])}}, {{(Subscript[b, 1]), 0}, {0, (Subscript[b, 2])}}, {{(Subscript[c, 1]), 
            0}, {0, (Subscript[c, 2])}}, {{(Subscript[d, 1]), 0}, {0, (Subscript[d, 2])}}]

ss2 = 
      StateSpace[{{(Subscript[A, 11]), (Subscript[A, 12])}, {(Subscript[A, 21]), (Subscript[A, 22])}}, {{(Subscript[B, 1]), 0}, {0, 
            (Subscript[B, 2])}}, {{(Subscript[C, 11]), (Subscript[C, 12])}}, {{(Subscript[D, 11]), (Subscript[D, 12])}}]

GenericConnect[ss, ss2, 
      TransferFunction[s, (s/(s + a))], {{3, 2, {4, Negative}}, {5, 3}}, {1, 
        2, 4}, {1, 3}]

GenericConnect[TransferFunction[1], TransferFunction[b], 
      TransferFunction[s, (1/s)], TransferFunction[1], 
      TransferFunction[
        a], {{2, 1}, {3, 2, {5, Negative}}, {4, 1, 3}, {5, 
          4}}, {1}, {4}]

6.4 Manipulating a System's Contents

ss = 
      StateSpace[DiagonalMatrix[{(Subscript[a, 1]), (Subscript[a, 2]), (Subscript[a, 3])}], 
        DiagonalMatrix[{(Subscript[b, 1]), (Subscript[b, 2]), (Subscript[b, 3])}], 
        DiagonalMatrix[{(Subscript[c, 1]), (Subscript[c, 2]), (Subscript[c, 3])}], 
        DiagonalMatrix[{(Subscript[d, 1]), (Subscript[d, 2]), (Subscript[d, 3])}]]

Subsystem[ss, {1, 3}]

Subsystem[ss, {1, 3, 2}]

Subsystem[ss, All, {1}, {1, 3}]

TransferFunction[Array[f, {3, 2}]]

DeleteSubsystem[%, None, {1, 3}]

ss1 = 
      StateSpace[{{(Subscript[a, 11]), (Subscript[a, 12])}, {(Subscript[a, 21]), (Subscript[a, 22])}}, {{(Subscript[b, 11]), (Subscript[b, 12])}, {(Subscript[b, 21]), 
            (Subscript[b, 22])}}, {{(Subscript[c, 1]), (Subscript[c, 2])}}, {{(Subscript[d, 1]), (Subscript[d, 2])}}]

ss2 = 
      StateSpace[{{(Subscript[A, 11]), (Subscript[A, 12])}, {(Subscript[A, 21]), (Subscript[A, 22])}}, {{(Subscript[B, 1])}, {(Subscript[B, 2])}}, {{(Subscript[C, 11]), 
            (Subscript[C, 12])}, {(Subscript[C, 21]), (Subscript[C, 22])}}, {{(Subscript[D, 1])}, {(Subscript[D, 2])}}]

MergeSystems[ss1, ss2]

tf1 = TransferFunction[s, {{(1/s), (1/(s + 1))}}]

tf2 = TransferFunction[s, {{(1/(s + 2))}, {(1/(s + 3))}}]

MergeSystems[tf1, tf2]

6.5 Using Interconnecting Functions for Controller Design

plant = StateSpace[{{0, 1}, {0, 0}}, {{0}, {1}}, {{1, 0}}]

pid = 
      TransferFunction[s, 
        (Subscript[k, p]) + ((Subscript[k, i])/s) + (((Subscript[k, d]) s)/(1 + τ s))]

SeriesConnect[pid, plant] // FeedbackConnect // Simplify

TransferFunction[s, %] // ExpandRational

Denominator[%[s]][[1, 
      1]]

\(d\_1 = Expand[%\/τ]\)

(Subscript[d, 2]) = (s + (Subscript[p, 1])) (s + (Subscript[p, 2])) (s + (Subscript[p, 3])) (s + 
            (Subscript[p, 4]))

Solve[
        CoefficientList[(Subscript[d, 1]) - (Subscript[d, 2]), s] == 0, {(Subscript[k, i]), (Subscript[k, d]), 
          (Subscript[k, p]), τ}] // Simplify

% /. (k_ -> expr_) :> k -> 
          Limit[expr, (Subscript[p, 1]) -> -∞]