バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/
はじめに
前回までで、DCモータの状態空間モデルを作成。
作成はしたが、確からしさを確認するにはシミュレーションが必要。
というわけで今回からDCモータ状態空間モデルのシミュレーションの話となる。
まずはMATLABから。
登場人物
博識フクロウのフクさん

イラスト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
【再掲】DCモータ状態空間モデル

太郎くん
今回はDCモータ状態空間モデルのシミュレーションの話に突入かな?

フクさん
そうだね。
まずはDCモータ状態空間モデルを再掲しておこう。
状態方程式
出力方程式

太郎くん
まずはMATLABでシミュレーションだね。
MATLABコード

フクさん
MATLABコードとしては以下になる。
各種係数は割と本物のモータのパラメータを引っ張って来てはいる。
% [statespacemodel.m]
function [x,y] = statespacemodel(A, B, C, D, u, dt, x)
% 様態方程式
x = x + (A*x + B*u) * dt;
% 出力方程式
y = C*x + D*u;
end
% [statespacemodel_motor.m]
K=0.016;
J=0.000000919;
R=1.34;
L=0.00012;
A=[0,1,0 ; 0,0,K/J ; 0,-K/L,-R/L];
B=[0 ; 0; 1/L];
C=[1,0,0;0,1,0;0,0,1];
D=[0;0;0];
dt = 0.0001;
t = linspace(0, 10, 100000); % 時間(横)軸
u = zeros(1,100000); % 入力信号生成
u(1,50000:100000)=1; % 5秒後に0から1へ
y = zeros(3,numel(t));
x = zeros(3,1);
for i = 1:numel(t)
[x,y(:,i)] = statespacemodel(A,B,C,D,u(:,i),dt,x);
end
subplot(3,1,1);
plot(t,u);
ylim([-0.05,1.1]);
xlim([4.95,5.25]);
subplot(3,1,2);
plot(t,y(1:2,:));
xlim([4.95,5.25]);
subplot(3,1,3);
plot(t,y(3,:));
xlim([4.95,5.25]);

太郎くん
状態空間モデルを計算する関数は以前と変わらないね。

フクさん
渡す行列の大きさや内容は変わってるが、ベクトル、行列という観点に於いては差異はないからな。

太郎くん
状態空間モデルの良いところだねー。
シミュレーション

フクさん
そしてシミュレーション結果


太郎くん
それっぽい動きになっているのはわかるけど・・・。

フクさん
まぁ挙動としてはあってるだろう。

太郎くん
じゃーOKってことだね。
まとめ

フクさん
まとめだよ。
- DCモータ状態空間モデルをMATLABでシミュレーション。
- 状態空間モデルを演算する関数自体はそのまま使い回し。
- シミュレーションとしては想定通りの結果。
バックナンバーはこちら。
コメント