MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/
はじめに
の、
MATLAB,Python,Scilab,Julia比較 その50【状態空間モデル⑧】
を書き直したもの。
Pythonで状態空間モデル
Pythonも状態空間モデルを動かせる機能がある。
controlライブラリの中のmatlabというモジュールを使用する。
どうやら、MATLABのControl System Toolboxの仕様に合わせたモジュールがPythonライブラリとして存在している。
MATLABとの差別化が気になるところだが、
MATLABの方がシミュレーションは早いだろうし、
MATLAB CoderがあればCコード生成も出来る。
Simulinkから部品として呼び出すこともできる。
という優位性があるから、Pythonのmatlabモジュールの存在でシェアを大きく奪われることはないだろう。
むしろ、Pythonで慣らしてMATLABで生かすという発想の方が多いかもしれない。
そもそものツール、言語の位置づけが違うので気にしなくてOKそう。
状態空間モデルを動かすには
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()
シミュレーション結果
まとめ
- Pythonで状態空間モデルを扱うには、controlライブラリのmatlabモジュールが必要。
- 仕様的にはMATLABのControl System Toolboxを踏襲している。
- ss関数に各行列を渡し、システムオブジェクトを取得。
- lsimに入力のstep信号をシステムオブジェクトを渡してシミュレーション。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント