Matlabのtf2ssの謎

Matlabが好きだ。
なぜなら、それはシンプルで、必要最低限のプログラミング言語習得で、
大きなことが簡単にできるからだ。
それでいて、構造的で、システマチック。
「そなたは美しい」

こんにちは、データサイエンティストひろき🐶です。

伝達関数の状態空間表現tf2ssの謎

さて、
前回こちらのブログで紹介した伝達関数から状態空間表現の係数(A,B,C,D)を求める便利な関数“tf2ss”とても便利です。

例えば、上記モデルの伝達関数から状態空間表現の係数を求めてみましょう。

$$\begin{align*} G=\frac{x}{y}=\frac{cs+k}{ms^2+cs+k} \
\end{align*}$$

使い方は簡単。
例えば下記のようなMatlabコードになります。

% パラメータの定義
m = 2; % 質点 [kg]  
k = 1; % バネのばね定数 [N/m]
c = 3; % ダンパーの減衰係数 [N.s/m]

num=[c k];
den=[m c k];
[A,B,C,D]=tf2ss(num,den);

% 状態空間モデルの作成
sys = ss(A, B, C, D);


% 結果のプロット
figure;
bode(sys)
grid on;

ここでtf2ssで出力されたA,B,C,Dの中身をみてみると、

$$ A \begin{align*} &= \end{align*} \begin{pmatrix} -1.5 & -0.5 \\
1 & 0 \\
\end{pmatrix}$$

$$ B \begin{align*} &= \end{align*} \begin{pmatrix} 1 \\
0 \\
\end{pmatrix}$$

$$ C \begin{align*} &= \end{align*} \begin{pmatrix} 1.5 & 0.5 \\
\end{pmatrix}$$
$$ D=0 $$

となっており、前回のブログのA,B,C,Dと様子が違います。

$$ A \begin{align*} &= \end{align*} \begin{pmatrix} 0 & 1 \\
-k/m & -c/m \\
\end{pmatrix}$$

$$ B \begin{align*} &= \end{align*} \begin{pmatrix} 0 \\
1/m \\
\end{pmatrix}$$

$$ C \begin{align*} &= \end{align*} \begin{pmatrix} k & c \\
\end{pmatrix}$$
$$ D=0 $$ と様子が違います。

今回の記事では、

  • 伝達関数Gからtf2ssで求めた状態空間パラメータA,B,C,Dを確かめる

を紹介します。

まずは下記コードで確かめてみます。

  % パラメータの定義
m = 2; % 質点 [kg]  ※適切な値を設定してください
k = 1; % バネのばね定数 [N/m] ※適切な値を設定してください
c = 3; % ダンパーの減衰係数 [N.s/m] ※適切な値を設定してください

num=[c k];
den=[m c k];
[A,B,C,D]=tf2ss(num,den)

% 状態空間モデルの作成
sys = ss(A, B, C, D);

A1 = [0 1; -k/m -c/m];
B1 = [0; 1/m];
C1 = [k c];
D1 = 0;

sys1=ss(A1,B1,C1,D1)


% 結果のプロット
figure;
bode(sys)
hold on
bode(sys1)
grid on;
legend("sys","sys1")

結果は下記の通り、ぴたりと重なります。

次に手計算で確かめてみます。
Matlabの"tf2ss"で求めたABCDは下記の形をしています。

$$ A \begin{align*} &= \end{align*} \begin{pmatrix} a1 & a2 \\
1 & 0 \\
\end{pmatrix}$$

$$ B \begin{align*} &= \end{align*} \begin{pmatrix} 1 \\
0 \\
\end{pmatrix}$$

$$ C \begin{align*} &= \end{align*} \begin{pmatrix} c1 & c2 \\
\end{pmatrix}$$
$$ D=0 $$

そこで、上記ABCDを下記伝達関数G

$$\begin{align*} G=\mathbf{C} (s\mathbf{I} -A)^{-1} B +D \
\end{align*}$$

へ代入した値と、モデルから直接求めた下記伝達関数
$$\begin{align*} G=\frac{x}{y}=\frac{cs+k}{ms^2+cs+k} \
\end{align*}$$

を比較して、a1 a2 c1 c2を求めると、 確かに、tf2ssの結果と一致することがわかります。
手計算でやってみてくださいね♡

最後に、なぜtf2ssで求めたABCDがこのような形をしているのか?

それは一般に、伝達関数から状態空間表現に変換した際の表し方は一通りではなく、 様々な表現方法があるからです。

それでは今日はこの辺で
最後まで読んでくださりありがとうございました。
Love&Respect♡
Hiroki🐶