Pythonで学ぶ制御工学 第6弾:伝達関数モデルと状態空間モデル


#Pythonで学ぶ制御工学< 伝達関数モデルと状態空間モデル >

はじめに

基本的な制御工学をPythonで実装し,復習も兼ねて制御工学への理解をより深めることが目的である.
その第6弾として伝達関数モデルと状態空間モデルを扱う.

状態空間モデルと伝達関数モデルの関係性

状態空間モデルは一意の伝達関数モデルに変換することができる.次にその過程を示す.

しかしながら,逆は定まらない.

実装

先ほどの変換をPythonで実装してみる.以下にソースコードとそのときの出力を示す.

ソースコード
"""
2021/02/23
@Yuya Shimizu

状態空間モデルと伝達関数モデル
"""

from control import tf, tf2ss, ss2tf, canonical_form

#適当な伝達関数モデルを準備
numerator = [0, 1]
denominator = [1, 1, 1]
P = tf(numerator, denominator)



#伝達関数モデル → 状態空間モデル
Pss = tf2ss(P)
print(f"<伝達関数モデル → 状態空間モデル>\n{P}\n ↓\n\n{Pss}\n")

#状態空間モデル → 伝達関数モデル
Ptf = ss2tf(Pss)
print(f"\n<状態空間モデル → 伝達関数モデル>\n{Pss}\n ↓\n{Ptf}")



#可制御正準形への変換
Pr, T = canonical_form(Pss, form = 'reachable')
print(f"\n<可制御正準形への変換>\n{Pss}\n ↓\n\n{Pr}")

#可観測正準形への変換
Pr, T = canonical_form(Pss, form = 'observable')
print(f"\n<可観測正準形への変換>\n{Pss}\n ↓\n\n{Pr}")
出力
<伝達関数モデル → 状態空間モデル>

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

 ↓

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

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

C = [[ 0. -1.]]

D = [[0.]]



<状態空間モデル → 伝達関数モデル>
A = [[-1. -1.]
 [ 1.  0.]]

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

C = [[ 0. -1.]]

D = [[0.]]

 ↓

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


<可制御正準形への変換>
A = [[-1. -1.]
 [ 1.  0.]]

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

C = [[ 0. -1.]]

D = [[0.]]

 ↓

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

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

C = [[-0.  1.]]

D = [[0.]]


<可観測正準形への変換>
A = [[-1. -1.]
 [ 1.  0.]]

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

C = [[ 0. -1.]]

D = [[0.]]

 ↓

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

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

C = [[1. 0.]]

D = [[0.]]

ここでプログラムに関して補足しておく.controlライブラリのtf2ssで状態空間モデルに変換しているわけだが,はじめの説明でもあったように一意に定まらないということで,可制御・可観測正準形になっているとは限らない.そこで,controlライブラリのcanonical_formという関数でさらに変換している.また,可制御正準形の変換時にreachable(可到達)と指定しているが,これは連続時間の線形システムにおいては,可到達性と可制御性が同じ意味となるためである.

プロパー性

最後にシステムの設計時に必要になるプロパー性についてまとめておく.

感想

伝達関数モデルと状態空間モデルの関係性について触れた.また,可制御性や可観測性の話も出てきた.久しぶりに触れ,思い出すよい機会となった.また,プロパー性については,いまいち理解できていなかったんだと気づいた.特にプロパー性の意義について.システムの設計で非常に重要となる概念であることを理解した.

参考文献

Pyhtonによる制御工学入門  南 祐樹 著  オーム社