【Pythonで制御工学】Python-controlを試してみた

はじめに

こんにちは、がんがんです。高専に所属していたときは制御系の学科にいました。
そのため、Pythonで制御工学を実行するPython-controlが少し気になりました。

今回は環境の導入を行い、実際に動かした際の備忘録になります。

追記【2019.04.29】

GitHubのリンクを追加しました。
github.com

追記【2019.01.15】

ありがたいことに
鹿児島大学生 Advent Calendar 2018の20日目に参加させて頂きました。
コメント、ミスなどあれば指摘のほどよろしくお願いします。

環境

環境は以下の通りです。OSによりインストール方法が異なるようなので注意が必要です。

・Windows10(64bit)
・Python 3.6.4

Python-controlのインストール

Windowsなので、こちらの記事を参考にインストールしていきます。
algorithm.joho.info

一応Linuxの参考記事も貼っておきます。
qiita.com

まずはslycotのwhlファイルを以下のサイトよりダウンロードします。
Python Extension Packages for Windows - Christoph Gohlke

ダウンロードしたら、ファイルを展開してあげます。

pip install slycot-0.3.3-cp36-cp36m-win_amd64.whl

controlの方はpipコマンドで簡単にインストール可能です。

pip install control

これで環境のセットは完了です。

ボード線図の作成

まずは以下を参考にボード線図を作成します。
algorithm.joho.info

コード

from control.matlab import *
import matplotlib.pyplot as plt

#  伝達関数のパラメータ
num = [2, 5, 1]    #  分子の係数
den = [1, 2, 3]    #  分母の係数
sys = tf(num, den) #  伝達関数モデルの作成
bode(sys)          #  ボード線図のプロット

plt.show()

結果

f:id:gangannikki:20181227072551p:plain
ボード線図

ナイキスト線図の作成

次はナイキスト線図を作成します。
algorithm.joho.info

コード

from control.matlab import *
import matplotlib.pyplot as plt

#  伝達関数のパラメータ
num = [2, 5, 1]    #  分子の係数
den = [1, 2, 3]    #  分母の係数
sys = tf(num, den) #  伝達関数モデルの作成
nyquist(sys)          #  ボード線図のプロット

plt.show()

結果

f:id:gangannikki:20181227072627p:plain
ナイキスト線図

PID制御

以下を参考にPID制御を実行してみたいと思います。
algorithm.joho.info

コード

from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np

def main():
	#  パラメータ
	Kp = 0.6   #  比例
	Ki = 0.03  #  積分
	Kd = 0.03  #  微分

	num = [Kd, Kp, Ki]
	den = [1, 0]
	K = tf(num, den)

	#  制御対象
	Kt = 1
	J = 0.01
	C = 0.1
	num = [Kt]
	den = [J, C, 0]
	G = tf(num, den)

	#  フィードバックループ
	sys = feedback(K*G, 1)
	t = np.linspace(0, 3, 1000)
	y, T = step(sys, t)
	plt.plot(T, y)
	plt.grid()
	plt.axhline(1, color="b", linestyle="--")
	plt.xlim(0, 3)
	
	plt.show()

if __name__ == '__main__':
	main()

結果

参考記事通りにしているため、1に収束していきます。

f:id:gangannikki:20181227073955p:plain
PID制御

まとめ

今回はPythonで制御工学を行えるPython-Controlを試してみました。
自分が勉強したものをこういう形でいじったりできるのは、個人的にすごく楽しいです。

PID制御のほかにも、P制御やPD制御などいろいろ実験してみようと思います。