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

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

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

はじめに

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

を書き直したもの。

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

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

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

状態方程式
\(\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)\)

Juliaコード

using PyPlot

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

function statespacemodel_test()
	m=1;
	A=[0 0; 1 0];
	B=[1/m; 0];
	C=[1 0; 0 1];
	D=[0; 0];
	dt=0.001;

	t=range(0,10,length=10000); # 時間(横)軸
	u=zeros(1,10000);	# 入力信号生成
	u[5000:10000].=1.0;	# 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');
	plot(t',u', "--b");
	grid();
end

statespacemodel_test()

MATLABコードと全く一緒。
厳密差異としては以下がある。

配列の添え字が丸カッコか角カッコか。
ドット演算子を使用している。

u[5000:10000].=1.0

ここまで差異が無いと、自宅での実験はJuliaでも良いかも?

シミュレーション結果

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

まとめ

  • Juliaでベクトル、行列演算による状態空間モデルの演算実施。
  • MATLABとほぼ同一。
    • 添え字、ドット演算子に違いあり。
  • シミュレーション結果も想定通り。

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

コメント

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