MATLAB,Python,Scilab,Julia比較 その50【状態空間モデル⑧】

MATLAB,Python,Scilab,Julia比較 その50【状態空間モデル⑧】 数値計算

バックナンバーはこちら。
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関数をつかってるみたいだね。

シミュレーション結果

フクさん
フクさん

そして結果はこんな感じだ。

Pythonで状態空間モデル(運動方程式)、力F、速度v、距離s
太郎くん
太郎くん

前回のMATLAB/Simulinkと同じ挙動だね。

フクさん
フクさん

まぁ同じモデルだしね。

まとめ

フクさん
フクさん

まとめだよ。

  • Pythonで状態空間モデルを扱うには、controlライブラリのmatlabモジュールが必要。
    • 仕様的にはMATLABのControl System Toolboxを踏襲している。
  • ss関数に各行列を渡し、システムオブジェクトを取得。
  • lsimに入力のstep信号をシステムオブジェクトを渡してシミュレーション。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました