iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

Simulinkによる順次シミュレーションを作る

今回のブログ担当のシロハです。
今回のテーマは、私が業務で使用することのあるMATLAB/Simulinkというツールについてです。

初めに

今回の記事で扱う内容は、mファイルを用いたSimulinkの順次シミュレーションの実行についてです。
また、MATLAB/Simulinkの基礎(mスクリプトの扱い方、Simulinkでのモデル作成やシミュレーションの実行方法)を知らないと理解が難しい内容が含まれます。

順次シミュレーションとは

初めに、順次シミュレーションとは、事前に複数パターンのシミュレーションの仕込みをしておいて、シミュレーションを1度実行すれば、全てのシミュレーションを終わらせてくれる、というものです。

順次シミュレーションの目的

1Dシミュレーションでは一般的に、3Dシミュレーションよりも1回のシミュレーションに時間が短いですが、その分複数パターンの検証が必要になることが多い、ということを何度か経験しました。
ただし3Dよりは早いといっても、モデルと検証条件によっては1パターンで1時間以上かかることもよくあります。
ということで今回の目標は、
順次シミュレーションを用いることで、帰宅前や金曜日の帰り際にシミュレーションを実行する⇒次の出勤時にシミュレーション結果が確認できる、というものを目指します。

順次シミュレーションの流れ

まず、順次シミュレーションを行う為にMATLAB/Simulinkにどのような作業をして欲しいのか、について考えます。

  1. 複数パターンのシミュレーションをコンピュータに順次行ってもらうために、mスクリプトからシミュレーションを実行する必要があります。また、実行したいパターン数だけシミュレーションを繰り返す必要があります。
  2. 全く同じシミュレーションを繰り返しても意味はないので、シミュレーションのたびにブロックの配置や結線・パラメータなどを書き換える必要があります。
  3. シミュレーションを実行した後で結果が残っていないのでは意味がありません。シミュレーション結果を保存して、外部にエクスポートする必要があります。

では、これらの作業をmファイルに書き込んでみましょう。

  1. matlabスクリプトSimulinkのシミュレーションを実行する場合は、sim関数を用います。
    使い方:sim('シミュレーションしたいSimulinkのモデル名')
    また、複数のパターンをシミュレーションする必要があるため、sim関数や、この後説明する要素をfor文の中に記述する必要があります。

  2. スクリプトからブロックの配置や結線・パラメータ書き換えを実行します。ブロックを配置・パラメータ変更するためにはブロックの持つパラメータ名を知っておく必要があります。
    知っておく必要のある関数について
    ブロックパラメータの変更:set_param
    ブロックパラメータの取得:get_param
    ブロックの配置:add_block
    ブロックの結線:add_line
    説明すると長くなるため、関数の詳細はヘルプを参照してください。

  3. :ブロックパラメータ名の調べ方
    その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列目に書いてあるのが目的のパラメータ名となります。

  4. シミュレーション結果を保存する方法はいくつかありますが、今回は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文の中に必要に応じて関数を追加すれば順次シミュレーションの完成です。

まとめ

MATLABは検索すると大体のことは知ることが出来るため、あえて今回は初心者向けではない内容にしております。MATLABの基本について知りたい方は「MATLAB 使い方」で検索すると良いと思います。

また、今回はあえてMATAB/Simulinkを連携させる形で順次シミュレーションを行っていますが、一般的にシミュレーションに掛かる時間を減らす場合は、シミュレーションの高速化や動的システムの並列シミュレーションを用いるようです。
尤も私がよく知らないために書けないのですが。