【入門】Python状態空間モデル(運動方程式)【数値計算】

【入門】Python状態空間モデル(運動方程式)【数値計算】 数値計算
【入門】Python状態空間モデル(運動方程式)【数値計算】

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で状態空間モデル(運動方程式)、力F、速度v、距離s

まとめ

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

MATLAB、Python、Scilab、Julia比較ページはこちら

コメント

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