概要
MATLABやScilabなどのソフトウエアを使うと,制御シミュレーションを行うことができますが,
実はPythonでも「Python-control」というライブラリを使えば似たようなことができます.
今回はPython-controlの機能をまとめていこうと思います.
動作環境
- Windows10(64bit)
- Python 3.7.2
- control 0.8.2
伝達関数の定義
まずは,(古典)制御で核となる伝達関数を定義します.
使う関数はtf()です.
伝達関数は以下のようにします.
\frac{80}{s^3+8s^2+17s+10}
"""伝達関数モデルの作成を行うプログラム"""
from control.matlab import *
num = [80] # 分子(numurator)の係数 80
den = [1, 8, 17, 10] # 分母(denominator)の係数 s^3+8s^2+17s+10
sys = tf(num, den) # 伝達関数(transfer function)モデルの作成
print(sys)
実行結果は以下のようになります.
80
-----------------------
s^3 + 8 s^2 + 17 s + 10
ボード線図
続いて,制御に限らず何かと頻出のボード線図を描いてみましょう.
bode()を使います.
"""ボード線図を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
num = [80] # 分子の係数
den = [1, 8, 17, 10] # 分母の係数
sys = tf(num, den) # 伝達関数モデルの作成
bode(sys) # ボード線図のプロット
plt.show()
実行結果は以下のようになります.
ナイキスト線図
続いて,ゲイン余裕や位相余裕を調べるときに使ったりするナイキスト線図を描いてみましょう.
nyquist()を使います.
"""ナイキスト線図を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
num = [80] # 分子の係数
den = [1, 8, 17, 10] # 分母の係数
sys = tf(num, den) # 伝達関数モデルの作成
nyquist(sys) # ナイキスト線図のプロット
plt.show()
実行結果は以下のようになります.
根軌跡
続いて,根軌跡も描いてみましょう.根軌跡とは一巡伝達関数について,そのゲイン定数を$0$から$\infty$に変化したときに特性根が複素平面を描く軌跡です.
"""根軌跡を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
num = [80] # 分子の係数
den = [1, 8, 17, 10] # 分母の係数
sys = tf(num, den) # 伝達関数モデルの作成
rlocus(sys) # 根軌跡(root locus)のプロット
plt.show()
実行結果は以下のようになります.
ゲイン余裕・位相余裕
続いて、安定余裕を求めてみます.
margin()を使います.
"""ゲイン余裕・位相余裕を求めるプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
num = [80] # 分子の係数
den = [1, 8, 17, 10] # 分母の係数
sys = tf(num, den) # 伝達関数モデルの作成
gm, pm, wg, wp = margin(sys) # ゲイン余裕・位相余裕の計算
print('gm = ' + str(gm)) # ゲイン余裕
print('pm = ' + str(pm)) # 位相余裕
print('wg = ' + str(wg)) # ゲイン交差周波数
print('wp = ' + str(wp)) # 位相交差周波数
実行結果は以下のようになります.
gm = 1.5750000000000002
pm = 14.527122056875015
wg = 4.123105625617661
wp = 3.306098924309049
ゲイン余裕が3.95dB程度になるはずなので何かがおかしい気がします.
わかり次第追記します.
まとめ
いかがだったでしょうか?Python-controlを使うだけでも制御シミュレーションの色々なことができました.
ナイキスト線図などは人間が描くのは難しいですが,Pythonを使えば,比較的簡単に系の挙動を把握することができますね.
コードに関してなにか建設的なフィードバックなどあればコメントいただけると助かります.