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

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

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/

はじめに

前回は状態空間モデルの演算をベクトル行列で行ったものをMATLABで実施。

今回は、これの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

【再掲】微分解決済みの状態空間モデル

フクさん
フクさん

まずは、微分解決済みの状態空間モデルの再掲。

状態方程式
\(\boldsymbol{x}(t+\Delta t)=\boldsymbol{x}(t)+\{A\boldsymbol{x}(t)+B\boldsymbol{u}(t)\}\Delta t \)

出力方程式
\(\boldsymbol{y}(t+\Delta T)=C\boldsymbol{x}(t+\Delta t)+D\boldsymbol{u}(t)\)

太郎くん
太郎くん

ベクトル、行列の演算だけでいけるのは分かったから、Python(Numpy)でも似た感じでいけそうだね。

Pythonコード

フクさん
フクさん

そしてコード。

import numpy as np
import matplotlib.pyplot as plt

def statespacemodel(A,B,C,D,u,dt,x):
  # 状態方程式
  x = x + (A@x + B@u) * dt
  
  # 出力方程式
  y = C@x + D@u
  return x,y


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]])
dt=0.001

t = np.linspace(0, 10, 10000) # 時間(横)軸
u = np.zeros((1,10000));	# 入力信号生成
u[0][5000:10000]=1	# 5秒後に0から1へ
y=np.zeros((2,len(t)))
x=np.zeros((2,1))

for i in range(0, len(t)):
  x,y[:,[i]] = statespacemodel(A,B,C,D,u[:,[i]],dt,x)

plt.plot(t.T,y.T)
plt.plot(t.T,u.T, "--b")
plt.grid();

plt.show()
太郎くん
太郎くん

これも演算としてはMATLABと一緒だね。

フクさん
フクさん

以前もいったが、Numpyの場合、内積は「@」になるんで、そこは注意が必要だな。

シミュレーション結果

フクさん
フクさん

そしてシミュレーション結果

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

これも想定通りだねー。

まとめ

フクさん
フクさん

まとめだよ。

  • Python(Numpy)でベクトル、行列演算による状態空間モデルの演算実施。
  • 流れとしてはMATLABと同一。
  • 内積の演算子が「@」な点に注意。
  • シミュレーション結果も想定通り。

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

コメント

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