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

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

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

はじめに

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

今回は、これのScilab版

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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)\)

太郎くん
太郎くん

太郎くん:
まぁScilabはMATLABと似てるから、ほぼ問題出なそうだね。

Scilabコード

function [x,y] = statespacemodel(A, B, C, D, u, dt, x)
    // 様態方程式
    x = x + (A*x + B*u) * dt;
    
    // 出力方程式
    y = C*x + D*u;
endfunction

m=1;

A=[0,0 ; 1,0];
B=[1/m ; 0];
C=[1,0;0,1];
D=[0;0];
dt=0.001;

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

for i = 1:length(t)
    [x,y(:,i)] = statespacemodel(A,B,C,D,u(i),dt,x);
end

plot(t',y','linewidth',3);
plot(t',u','--b','linewidth',3);
p=gca();p.tight_limits(:)="on";p.data_bounds(:,2)=[-1;14];
xgrid();
太郎くん
太郎くん

コードとしてはMATLABと一緒かな。

フクさん
フクさん

演算部分に関しては全く一緒だな。
グラフ表示の部分で差異があるだけだ。

シミュレーション結果

フクさん
フクさん

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

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

案の定ではあるけど、想定通りだねー。

フクさん
フクさん

ベクトル、行列演算に限ればMATLABと差異はないからねー。
コピペで行けるレベルだ。

まとめ

フクさん
フクさん

まとめだよ。

  • Scilabでベクトル、行列演算による状態空間モデルの演算実施。
  • MATLABと同一。
    • グラフ表示の部分に差異があるだけ。
  • シミュレーション結果も想定通り。

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

コメント

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