interconnect【control】公式チュートリアル2023の和訳
Preliminaries
相互接続されたシステム内のすべてのシステムの表現は、次のように表される状態空間形式のLTIシステムとなる。
$ \dot{x}(t) = Ax(t) + Bu(t), y(t)=Cx(t)+Du(t)
離散時間システムの場合は
$ x[k+1] = Ax[k] Bu[k], ~~ y[k] = Cx[k] + D u[k]
auto-splitting(自動分割)
同じ名称の入力をもつ要素を統合する。
code:fig.txt
u y1
u +--> sys1 --->
---|
+--> sys2 --->
u y2
code:auto_split1.py
# arbitrary example systems
sys1 = ct.tf(1, 10, 1, inputs='u', outputs='y1') sys2 = ct.tf(1, 1, 0, inputs='u', outputs='y2') print(ic1) # 1-input, 2-output system
tf 関数を用いて伝達関数を生成、入力と出力に名前を割り当てる。
$ G_1 (s) = \frac{1}{10s+1} = \frac{Y_1(s)}{U(s)}
$ G_2 (s) = \frac{1}{s} = \frac{Y_2(s)}{U(s)}
interconect 関数を用いて相互結合システムを生成する。
ct.interconnect([sys1, sys2], inputs='u', outputs=['y1', 'y2'])
$ Y_1(s)(10s+1) = U(s)より$ 10\dot{y}_1(t)+y_1(t) = u(t)
$ Y_2(s)s=U(s) より$ \dot{y}_2(t) = u(t)
$ 10y_1 = x_1, ~ y_2 = x_2 とおくと、$ y_1 = 0.1 x_1, ~ \dot{y}_1 = 0.1 \dot{x}_1より、
$ \dot{x}_1(t) = -0.1 x_1(t) + u(t)
また、$ x_2 = y_2 とおくと、$ \dot{y}_2 = \dot{x}_2 より、
$ \dot{x}_2 (t) = u(t)
となる。まとめると、
$ \left(\begin{array}{c} \dot{x}_1 \\ \dot{x}_2 \end{array}\right) = \left( \begin{array}{cc} -0.1&0 \\ 0&0 \end{array}\right) \left( \begin{array}{c} x_1 \\ x_2 \end{array}\right) + \left( \begin{array}{c} 1 \\ 1 \end{array}\right) u
$ \left( \begin{array}{c} y_1 \\ y_2 \end{array} \right) = \left( \begin{array}{cc} 0.1 & 0 \\ 0&1 \end{array}\right) \left( \begin{array}{c} x_1 \\ x_2 \end{array}\right)
となる。この1入力-2出力の状態方程式をドイルの記法で表すと、
$ \left( \begin{array}{cc} A & B \\ C & D \end{array}\right) = \left( \begin{array}{cc|c} -0.1 & 0 & 1\\0&0&1\\ \hline 0.1&0&0\\ 0&1&0 \end{array}\right)
となる。
このシステムでは、入力は単一の値 $ u を持ち、出力は 2 要素のベクトル $ y = [y_1, y_2]^\top になる。
auto-summing
同じ名前の出力信号を持つシステムを統合する。
code:fig2.txt
u1 y
---> sys1 ---+
|
+ V y
O----->
+ ^
|
---> sys2 ---+
u1 y
code:auto_summing1.py
sys1 = ct.tf(1, 10, 1, inputs='u1', outputs='y') sys2 = ct.tf(1, 1, 0, inputs='u2', outputs='y') print(ic2) # 2-input, 1-output system
この2入力-1出力システムは
$ \left( \begin{array}{cc|cc} -0.1&0&1&0\\ 0&0&0&1\\ \hline 0.1&1&0&0 \end{array}\right)
となる。
summng junctions
信号の加え合わせ点
code:fig.txt
u w
---> O --->
^
| -v
|
名前を示す文字列中にマイナスを意味する記号を含めることで、加え合わせるときの符号を指定できる。
code:summing_junction01.py
import control as ct
summer1 = ct.summing_junction('u', 'v', 'w1') print(summer1)
summer2 = ct.summing_junction('u', '-v', 'w2') print(summer2)
(1)は
$ \left( \begin{array}{cc} 1& 1\\ \end{array}\right) \left(\begin{array}{c} u \\ v \\ \end{array} \right) \rightarrow u + v = w_1
となり、(2)は
$ \left( \begin{array}{cc} 1& -1\\ \end{array}\right) \left(\begin{array}{c} u \\ v \\ \end{array} \right) \rightarrow u - v = w_2
となる。
課題:次のような複雑に相互接続された システムを実装する。
https://scrapbox.io/files/66a2fb92c06e77001c6c9b10.png
code:problem.py
import control as ct
from pprint import pprint
K = 10
z = 0.001
p = 2
tau = 1
J = 100
B = 1
Cont = ct.tf(K, K*z,1, p, inputs='e', outputs='u') sys1 = ct.tf(1,tau, 1, inputs='u', outputs='v') sys2 = ct.tf(1,J, B, inputs='w', outputs='dth') sys3 = ct.tf(1,1,0, inputs='dth', outputs='th') dist = ct.summing_junction('d', 'v', 'w') sys = ct.interconnect(
outputs='th'
)
pprint(sys)
code:result.txt
>> sys.A
>> sys.B
>> sys.C
array(0., 0., 0., 1.)
>> sys.D
array(0., 0.)
WEB資料と若干異なるが、おそらく等価なシステムが得られている。