matsulibの日記

Ingredients as Code

Python で制御工学

MATLAB ライクなグラフ描写ができる pylab と以下の方法を使って、入力に対するシステムの応答を調べる。

  1. 記号計算のためのライブラリ sympy を使う方法
  2. 制御工学のためのライブラリ python-control を使う方法

今回の入力は単位ステップ関数だが、インパルス関数やそれ以外の任意の関数についても同様に調べることができる。また、伝達関数だけでなく状態空間表現も使える。

1. sympy

sympy で入力と伝達関数を記号を使って定義し、それらをラプラス変換、逆ラプラス変換する。

# -*- coding: utf-8 -*-
from sympy import *
from pylab import *

# 一次遅れ系の一般形の一般形の伝達関数 G(s)=K/(T*s+1), (T>0, K>0)
K,T = symbols('K T', positive=True)
s,t = symbols('s t')
G = Lambda((s, K, T), K/(T*s+1))

# 単位ステップ応答信号 u(t)=1 をラプラス変換すると
U = Lambda(s, laplace_transform(1, t, s)[0]) # U(s)=1/s

# 一次遅れ系の単位ステップ応答 y(t) は
# Y(s)=G(s)*U(s)=K/(s*(T*s+1)) の逆ラプラス変換によって求まる
ilt = inverse_laplace_transform
y = Lambda((t, K, T), ilt(G(s,K,T)*U(s), s, t))

# K=1, T=1 の場合をプロット
trange = arange(0, 50, 0.1)
plot(trange, [y(t,1,1) for t in trange])
title('Step Response')
xlabel('Time (sec.)')
ylabel('y(t)')
grid()
show()

f:id:matsulib:20130427090450p:plain:w400

2. python-control

python-control は control.matlabMATLAB に対応する関数が定義されている(当たり前ながら使い勝手はいちいち違う)。
この中の step() を使えば MATLAB と同様にステップ応答がわかる。
ついでに 伝達関数 G(s) = K/(T*s+1) の定数 T を変えた時の応答の違いも調べる。

# -*- coding: utf-8 -*-
from pylab import *
from control.matlab import *

# tf(num, den) の引数は伝達関数の分子、分母のsの係数リスト
# 一次遅れ G(s) = K/(T*s+1) で K=1, T=1,5,10 のとき
# 1*s^0 / (T*s^1 + 1*s^0) なので num,den=[1],[T,1]
for T in [1, 5, 10]:
    yout, trange = step(tf([1],[T,1]), arange(0, 50, 0.1))
    plot(trange, yout)

legend(('T=1', 'T=5', 'T=10'), 'lower right')
title('Step Response')
xlabel('Time (sec.)')
ylabel('y(t)')
grid()
show()

f:id:matsulib:20130427090454p:plain:w400
定数 T がシステムの速応性に影響していることがわかる。正確には、定数 T は一次遅れ系の単位ステップ応答が最終値の63.2%に達する時間を表している(時定数)。

※pylab, sympy, control は関数の名前が一部重複しているから、import の順番を間違えると上のコードはちゃんと動かない。本当は import * は避けるべきだが、楽なので使っている。
 
※また、G(s)などで与えられるシステムが分かっていれば、そこから上のようなグラフやボード線図、ナイキスト線図などを描くことができるしそれを見て色々なことが分かるが、その逆問題、つまりデータからシステムを同定するような関数(Matlabで言えばSystem Identification Toolboxのpem,arxなど)は用意されてなさそうなのでそういう使い方はできない。

参考サイト&図書

Welcome to SymPy’s documentation! — SymPy 0.7.3 documentation
Python Control User’s Manual — Python Control Systems Library 0.6c documentation

はじめての制御工学 (KS理工学専門書)

はじめての制御工学 (KS理工学専門書)

  • 作者: 佐藤和也,平元和彦,平田研二
  • 出版社/メーカー: 講談社
  • 発売日: 2010/10/13
  • メディア: 単行本(ソフトカバー)
  • 購入: 4人 クリック: 11回
  • この商品を含むブログを見る