Simulinkによる順次シミュレーションを作る
今回のブログ担当のシロハです。
今回のテーマは、私が業務で使用することのあるMATLAB/Simulinkというツールについてです。
初めに
今回の記事で扱う内容は、mファイルを用いたSimulinkの順次シミュレーションの実行についてです。
また、MATLAB/Simulinkの基礎(mスクリプトの扱い方、Simulinkでのモデル作成やシミュレーションの実行方法)を知らないと理解が難しい内容が含まれます。
順次シミュレーションとは
初めに、順次シミュレーションとは、事前に複数パターンのシミュレーションの仕込みをしておいて、シミュレーションを1度実行すれば、全てのシミュレーションを終わらせてくれる、というものです。
順次シミュレーションの目的
1Dシミュレーションでは一般的に、3Dシミュレーションよりも1回のシミュレーションに時間が短いですが、その分複数パターンの検証が必要になることが多い、ということを何度か経験しました。
ただし3Dよりは早いといっても、モデルと検証条件によっては1パターンで1時間以上かかることもよくあります。
ということで今回の目標は、
順次シミュレーションを用いることで、帰宅前や金曜日の帰り際にシミュレーションを実行する⇒次の出勤時にシミュレーション結果が確認できる、というものを目指します。
順次シミュレーションの流れ
まず、順次シミュレーションを行う為にMATLAB/Simulinkにどのような作業をして欲しいのか、について考えます。
- 複数パターンのシミュレーションをコンピュータに順次行ってもらうために、mスクリプトからシミュレーションを実行する必要があります。また、実行したいパターン数だけシミュレーションを繰り返す必要があります。
- 全く同じシミュレーションを繰り返しても意味はないので、シミュレーションのたびにブロックの配置や結線・パラメータなどを書き換える必要があります。
- シミュレーションを実行した後で結果が残っていないのでは意味がありません。シミュレーション結果を保存して、外部にエクスポートする必要があります。
では、これらの作業をmファイルに書き込んでみましょう。
- matlabのスクリプトでSimulinkのシミュレーションを実行する場合は、sim関数を用います。
使い方:sim('シミュレーションしたいSimulinkのモデル名')
また、複数のパターンをシミュレーションする必要があるため、sim関数や、この後説明する要素をfor文の中に記述する必要があります。 - スクリプトからブロックの配置や結線・パラメータ書き換えを実行します。ブロックを配置・パラメータ変更するためにはブロックの持つパラメータ名を知っておく必要があります。
知っておく必要のある関数について
ブロックパラメータの変更:set_param
ブロックパラメータの取得:get_param
ブロックの配置:add_block
ブロックの結線:add_line
説明すると長くなるため、関数の詳細はヘルプを参照してください。 - :ブロックパラメータ名の調べ方
その1:以下のページでブロックパラメータ名を調べることが出来ます。
https://jp.mathworks.com/help/simulink/slref/block-specific-parameters.html
その2:get_param関数を用いてブロックパラメータ名を調べます。
ブロックパラメータは、関数add_blockでブロックを配置したり、set_paramでブロックパラメータを変更する際に必要になります。
a:パラメータ名を調べたいブロックをダブルクリックして、調べたいパラメータの値を適当な値(11111111など)にします。
b:パラメータ名を調べたいブロックをクリックします。
(手順b~cまでの間に他のブロックをクリックしないこと。分かる方向けにいうとgcbを用いているため)
c:次のコードをエディタ、またはコマンドウィンドウで実行します。
DATA=get_param(gcb,’ObjectParameters’);
PARAM=fieldnames(DATA);
for i=1:length(PARAM)
PARAM{i,2} = get_param(gcb,PARAM{i,1});
end
d:実行した結果がワークスペースのセル配列'PARAM'に保存されています。
PARAMの1列目がパラメータ名、2列目が1列目に対応したデータとなっています。
セル配列 PARAM の中に、先ほど設定した適当な値があるので、その隣の1列目に書いてあるのが目的のパラメータ名となります。 - シミュレーション結果を保存する方法はいくつかありますが、今回はSimulinkに「To Workspace」ブロックを配置してから、xlswriteでエクスポートすることでデータを保存します。
ちなみに、単純にデータを保存するだけならばSimulinkに「To File」ブロックを置くのが一番簡単です。ただ、Simulinkとの連携に限らず、xlswriteでデータをエクスポートするという手法が便利であること、またWorkSpaceに一度データを残すことで、WorkSpace上のデータを処理してからエクスポートすることが可能になるなど応用が利くため、今回はxlswriteを用います。
基本的な骨組み
先ほどの1~3を組み合わせて、順次シミュレーションの骨組みを作ると以下のようになります。
S = シミュレーションのパターン数;
for i=1:S %S回シミュレーションを実行する
switch i %case文の中にパラメータやソルバなどの、シミュレーション毎に変更する点を記述する
case 1
set_param(~)
add_block(~)
add_line(~)
case 2
set_param(~)
add_block(~)
add_line(~)
case 3
・・・
otherwise
end
sim(‘モデル名’) %シミュレーションを実行
xlswrite(~) %データをエクスポートする
end
この骨組みを基本として、Switch文の中に必要に応じて関数を追加すれば順次シミュレーションの完成です。