【入門】状態空間モデルで微分解決(Python)【数値計算】

【入門】状態空間モデルで微分解決(Python)【数値計算】 数値計算
【入門】状態空間モデルで微分解決(Python)【数値計算】

MATLAB、Python、Scilab、Julia比較ページはこちら
https://www.simulationroom999.com/blog/comparison-of-matlab-python-scilab/

はじめに

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

を書き直したもの。

ニュートンの運動方程式を状態空間モデルを離散化したものをPythonでシミュレーションする。

微分解決済みの状態空間モデル

以下がニュートンの運動方程式を状態空間モデルを離散化したもの。
これをPythonで表現する。

状態方程式
\(\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コード

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と同一。
内積の演算子が「@」な点に注意が必要。

シミュレーション結果

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

まとめ

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

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

コメント

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