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(Numpy)でベクトル、行列演算による状態空間モデルの演算実施。
- 流れとしてはMATLABと同一。
- 内積の演算子が「@」な点に注意。
- シミュレーション結果も想定通り。
MATLAB、Python、Scilab、Julia比較ページはこちら
コメント