PythonControlで伝達関数と状態方程式を変換する

###目的
Python Controlで、伝達関数と状態方程式を変換する

###事前準備
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)


###状態方程式とは
線形時不変システム(LPIシステム)において、状態方程式は以下の式によって表される。

```math
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
```
uがシステムへの入力、yがシステムの出力であり、xがシステムの内部状態を示す。

[wikipedia：状態方程式](https://ja.wikipedia.org/wiki/%E7%8A%B6%E6%85%8B%E6%96%B9%E7%A8%8B%E5%BC%8F_(%E5%88%B6%E5%BE%A1%E7%90%86%E8%AB%96))

###伝達関数とは
伝達関数とは、システムへの入力を出力に変換する関数のことをいう。以下の式によって表される。

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{b_1s^3+b_2s^2+b_3s^1+b_4}{a_1s^3+a_2s^2+a_3s^1+a_4}...
```

[wikipedia：伝達関数](https://ja.wikipedia.org/wiki/%E4%BC%9D%E9%81%94%E9%96%A2%E6%95%B0%E6%B3%95)



###状態方程式と伝達関数との関係

状態方程式をラプラス変換すると、

```math
sX(s)=AX(s)+BU(s) \\
Y(s)=CX(s)+DU(s)
sX(s)-AX(s)=BU(s) \\
(sI-A)X(s)=BU(s) \\
X(s)={(sI-A)}^{-1} BU(s) \\
```

よって、伝達関数G(s)は

```math
G(s)=\frac{Y(s)}{U(s)}=\frac{{(sI-A)}^{-1} BU(s) +DU(s)}{U(s)}=(sI-A)^{-1} B +DU
```
から求めることができる。
Python Controlではこの計算を行う関数control.ss2tfとcontrol.tf2ssが用意されている。

###伝達関数から状態方程式への変換[control.ss2tf](http://python-control.readthedocs.io/en/latest/generated/control.ss2tf.html)

___ss2tf(sys)___
 線形システムを状態空間の形式に変換する。sysが既に状態空間であっても常に新しいシステムを作成する。
__ss2tf(A, B, C, D)__
　状態方程式と出力方程式の行列から状態空間の形式に変換する。

 - Parameters:	
  - sys: 状態空間
  - A: System 行列
  - B: Control 行列
  - C: Output 行列
  - D: Feedthrough 行列
 - Returns
  - out: 伝達関数

bdalg-matlab_1.py

```
#!/usr/bin/env python
from control.matlab import *    # MATLAB-like functions

# System matrics
A1 = [[0, 1.], [-4, -1]]
B1 = [[0], [1.]]
C1 = [[1., 0]]
sys1ss = ss(A1, B1, C1, 0)
sys1tf = ss2tf(sys1ss)
print sys1ss
print sys1tf
```

```
./bdalg-matlab_1.py
A = [[ 0.  1.] [-4. -1.]]
B = [[ 0.] [ 1.]]
C = [[ 1.  0.]]
D = [[0]]

 1
-----------
s^2 + s + 4

```

###伝達関数から状態方程式への変換[control.tf2ss](http://python-control.readthedocs.io/en/latest/generated/control.tf2ss.html)

___tf2ss(sys)___
___tf2ss(num, den)___

伝達関数の分子係数(num)と分母係数(den)から状態方程式を作成します。


 - Parameters:	
  - sys: LTIシステム
  - num: 分子の多項式係数
  - den: 分母の多項式係数

 - Returns
  - out: 状態空間

bdalg-matlab_2.py


```
#!/usr/bin/env python
from control.matlab import *    # MATLAB-like functions

sys2tf = tf([1, 0.5], [1, 5]);
sys2ss = tf2ss(sys2tf);
print sys2tf
print sys2ss
```

```
 ./bdalg-matlab_2.py 

s + 0.5
-------
 s + 5

A = [[-5.]]
B = [[ 1.]]
C = [[-4.5]]
D = [[ 1.]]
```

###状態方程式の加算
PythonControlでは、状態方程式の加算を行うことができます。

./bdalg-matlab_3.py

```
#!/usr/bin/env python
from control.matlab import *    # MATLAB-like functions

# System matrices
A1 = [[0, 1.], [-4, -1]]
B1 = [[0], [1.]]
C1 = [[1., 0]]
sys1ss = ss(A1, B1, C1, 0)
sys1tf = ss2tf(sys1ss)

sys2tf = tf([1, 0.5], [1, 5]);
sys2ss = tf2ss(sys2tf);

# Series composition
series1 = sys1ss + sys2ss;
print series1
```

```
$ ./bdalg-matlab_3.py

A = [[ 0.  1.  0.]
 [-4. -1.  0.]
 [ 0.  0. -5.]]

B = [[ 0.]
 [ 1.]
 [ 1.]]

C = [[ 1.   0.  -4.5]]

D = [[ 1.]]

```

###サンプルコード
サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

###参考
[PythonControlをインストールする](https://qiita.com/nnn112358/items/ada16e29ef8282498bb7)
[PythonControlで1自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3b400598e74f8414b1e1)
[PythonControlで2自由度系の伝達関数を求める。](https://qiita.com/nnn112358/items/3604156086351a07e860)