バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/
はじめに
前回は、MATLAB/Simulinkによる状態空間モデルをシミュレーションを実施。
とりあえず、動作確認はできた状況。
引き続き同じことをPythonで行う。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
Pythonで状態空間モデル
次はPythonだけど、
Pythonも状態空間モデルを動かせる機能があると思って良いのかな?
controlライブラリというものがあって、
その中にmatlabというモジュールがある。
matlabモジュール???
どうやら、MATLABのControl System Toolboxの仕様に合わせたモジュールがPythonライブラリとして存在しているってことだな。
そんなことされたらMATLABの立場は・・・。
まぁMATLABの方がシミュレーションは早いだろうし、
MATLAB CoderがあればCコード生成も出来る。
Simulinkから部品として呼び出すこともできる。
という優位性があるから、Pythonのmatlabモジュールの存在でシェアを大きく奪われるかは疑問だな。
むしろ、Pythonで慣らしてMATLABで生かすという発想の方が多いんじゃないかな?
確かに言われてみるとそもそものツール、言語の位置づけが違うもんね。
で、状態空間モデルを動かすにはどうするの?
ss関数、恐らくStateSpace(状態空間)の略だと思うが、
この関数に各行列を渡す。
\(
\boldsymbol{A}=
\begin{bmatrix}
0 && 0 \\
1 && 0
\end{bmatrix}
\)
\(
\boldsymbol{B}=
\begin{bmatrix}
1/m \\
1
\end{bmatrix}
\)
\(
\boldsymbol{C}=
\begin{bmatrix}
1 && 0 \\
0 && 1
\end{bmatrix}
\)
\(
\boldsymbol{D}=
\begin{bmatrix}
0 \\
0
\end{bmatrix}
\)
入力波形、今回はstep信号を作って、
lsim関数に先ほどのss関数の戻りのシステムモジュールを渡すことでシミュレーションができる。
恐らくこの流れは、MATLABのControl System Toolboxと同じだろう。
うーん、これは実際に見た方が早そうなパターンだな。
コード
じゃ、コードを見てみよう。
from control import matlab
import numpy as np
import matplotlib.pyplot as plt
m=1
A=np.array([[0,0],[1,0]])
B=np.array([[1/m],[0]])
C=np.array([[1,0],[0,1]])
D=np.array([[0],[0]])
sys = matlab.ss(A, B, C, D) # 状態空間モデル生成
t = np.linspace(0, 10, 10000) # 時間(横)軸
u = np.zeros(10000); # 入力信号生成
u[5000:10000]=1 # 5秒後に0から1へ
y, T,x = matlab.lsim(sys, u, t) # step応答
plt.plot(T,y)
plt.plot(T,u, "--b")
plt.grid();
plt.show()
なんか思ったよりかは短いコードかな。
たしかにss関数と、lsim関数をつかってるみたいだね。
シミュレーション結果
そして結果はこんな感じだ。
前回のMATLAB/Simulinkと同じ挙動だね。
まぁ同じモデルだしね。
まとめ
まとめだよ。
- Pythonで状態空間モデルを扱うには、controlライブラリのmatlabモジュールが必要。
- 仕様的にはMATLABのControl System Toolboxを踏襲している。
- ss関数に各行列を渡し、システムオブジェクトを取得。
- lsimに入力のstep信号をシステムオブジェクトを渡してシミュレーション。
バックナンバーはこちら。
コメント