###目的
Python Controlで、伝達関数と状態方程式を変換する
###事前準備
PythonControlをインストールする
###状態方程式とは
線形時不変システム(LPIシステム)において、状態方程式は以下の式によって表される。
\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)
uがシステムへの入力、yがシステムの出力であり、xがシステムの内部状態を示す。
###伝達関数とは
伝達関数とは、システムへの入力を出力に変換する関数のことをいう。以下の式によって表される。
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}...
###状態方程式と伝達関数との関係
状態方程式をラプラス変換すると、
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)は
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
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
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をインストールする
PythonControlで1自由度系の伝達関数を求める。
PythonControlで2自由度系の伝達関数を求める。