機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【pyton】【scipy】ボード線図とインパルス&ステップ応答

pythonで制御工学に触れてみる

■はじめに

お久しぶりです。

今回はpythonで制御工学に触れてみようと思います。

ある伝達関数を定義し、その伝達関数において、

1.ゲインと位相

2.インパルス応答

3.ステップ応答

を計算してみたいと思います。

 

■コード

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

#伝達関数の設定
num=[1]
den=[1,0.1,1]
G=signal.lti(num,den)

#ゲインと位相の計算
w, bode, phase=signal.bode(G)
f=w/(2.0*np.pi)
#インパルス応答の計算
T_im,yout_im=signal.impulse(G)
#ステップ応答の計算
T_sig,yout_sig=signal.step(G)


#軸表示の設定(今回は2つ左右に並べる)
fig = plt.figure(figsize=(10,8))
ax1=plt.subplot2grid((3,2),(0,0))
ax2=plt.subplot2grid((3,2),(0,1))
ax3=plt.subplot2grid((3,2),(1,0))
ax4=plt.subplot2grid((3,2),(1,1))

#左上のグラフ=ゲイン
ax1.semilogx(f,bode,label="Gain")
ax1.set_ylabel('Gain [dB]')
ax1.set_xlabel('f [Hz]')
ax1.grid()

#右上のグラフ=位相
ax2.semilogx(f,phase)
ax2.set_ylabel('phase [deg]')
ax2.set_xlabel('f [Hz]')
ax2.grid()

#左下のグラフ=インパルス応答
ax3.plot(T_im,yout_im)


#右下のグラフ=ステップ応答
ax4.plot(T_sig,yout_sig)

 

 

なお実行すると以下の画面がでてきます。

f:id:stjun:20191007004158p:plain

左上:ゲインと周波数、右上:位相と周波数、左下:インパルス応答と時間、右下:ステップ応答と時間

になります。

 

■買って良かったもの紹介

今回はipadです。動画視聴や動画編集(Lumafusion)を使用しています。

 

■説明

 num,denは伝達関数における分子、分母の係数を表しています。

つまり、

num=[1]

den=[1, 0.1, 1]

G=signal.lti(num,den)はG(s)=1/(s^2+0.1s+1)の伝達関数になります。

後は、

ボード線図を求めたければ signal.bode(G)

インパルス応答を求めたければ signal.impulse(G)

ステップ応答を求めたければ signal.step(G)

とすれば良いです。

 

■最後に

MATLABをやったことがある人にとっては当たり前の内容だったと思います。

なおpythonにはpython-contorolというMATLAB風なモジュールがあるため個人的にはscipyよりそちらがおすすめです。