LoginSignup
8
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-30

目的

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

事前準備

PythonControlをインストールする

状態方程式とは

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

\dot{x}(t)=Ax(t)+Bu(t) \\
y(t)=Cx(t)+Du(t)

uがシステムへの入力、yがシステムの出力であり、xがシステムの内部状態を示す。

wikipedia:状態方程式

伝達関数とは

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

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:伝達関数

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

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

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自由度系の伝達関数を求める。

8
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
13