10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MATLAB/SimulinkAdvent Calendar 2019

Day 22

Simulinkで分散を求める(副題:Simulink.Signalの使い方)

Last updated at Posted at 2019-12-21

はじめに

分散共分散など、統計の基本的な処理はMATLAB標準で供えられおり、すぐに使うことが出来ます。初学者にとって非常に優しいですね。

これに対しSimulinkは、制御のためのブロックは豊富ですが統計のためのブロックはあまり見当たりません。(DSP System Toolboxにならあるかも?)

これは単純に、Simulinkで統計的処理を行うことが一般的でないことが原因と思いますがどうしてもやりたい!というケースもあるとは思います。著者のケースとして、Simulink連携を利用して統計的処理をarduinoに実装するときに悩みました。

本記事では分散をSimulinkにて求める方法を紹介します、完成イメージは下記になります。
共分散については省略しますがやることはほぼ同じです。
image.png

下記、MATLABのバージョンは2018bを使用します。

Todo1.信号属性を指定する(最最重ポイント)

Simulinkの機能の一つにSimulink.Signalによる信号属性の指定があります。信号属性の指定は、Simlinkでよくやる単純な制御系シミュレーションのような場合はあまり使う必要がありません。

じゃあいつ使うかというと、ハードウェア実装を意識したシミュレーション、あるいは自動コード生成を利用する場合に使います。

指定できる信号属性としては、型の指定や上下限値の設定、そして次元の設定が出来ます。
image.png

次元は[1 N]で要素Nのベクトルを、[M N]でM×Nの行列を指定できます。
今回は信号属性をベクトルに指定、ベクトルに複数データを格納することで分散の導出を可能にします。

で、どうやって信号属性を指定するか

①信号に名前を付ける

名前を付けたい信号をダブルクリックして任意の名前を付けましょう。

②信号をSimulink.Signalに関連付ける

正攻法として、該当する信号を右クリック→プロパティを選択→信号名を~ で可能です。
image.png

が、個人的なオススメは違います。モデルデータエディタを使うのです。
[モデルデータエディターを使用したデータプロパティの設定]
(https://jp.mathworks.com/help/simulink/ug/inspect-and-configure-design-attributes-of-model-data.html) 概ね2017以降からの追加機能のようです。

起動はSimulinkのメニュー画面より行います。

これの「信号」タブで、モデル内の各信号の設定を見ることが出来ます。
Simulink.Signalへの関連付けは右端の「Resolve」にチェックを入れることで行います。
image.png
なおデータエディタでは選択した信号がハイライトされます。非常に分かり易くてよいですね!
この画面から信号名を付けることももちろん可能です。

またSimulink.Signalへの関連付けが有効な信号にはフォークのような印が付きます。
image.png

③Simulink.Signalを作成する

色々なやり方がありますが、今回はモデルエクスプローラ経由での方法を書きます。
起動はSimulinkのメニュー画面より行います。
image.png

信号っぽいアイコンをクリックすることでSimulink.Signalを作成できます。
image.png

名前は先程付けた信号名と一致させる必要があります。作成する場所はベースワークスペースとモデルワークスペースのどちらでも構いません。自分が分かり易いところにしておきましょう。
image.png

データエディタに戻り更新ボタンを押すか、シミュレーションを実行することでSimulink.Signalの設定内容が対象信号の属性に反映されます。
image.png

信号属性の設定は以上になります。なお②と③は逆でも構いません。
設定方法は一度やれば理解できるものではありますが、やったことがないとちょっとしんどいので丁寧に書きました。(著者は何もない状態から始めたので結構手間取った)

Todo2.ベクトルにデータを格納する

image.png
Simulink.Signalを用いて、上図xoutを1×200のベクトルに設定しました。データの格納はTriggerd Subsystem内にて行います。

トリガの立ち上がりごとに、ベクトルの末尾に新しいデータを追加するものとします。イメージは下記。
image.png

実装はSelectorとVector Concatenateを使います。後者はMuxでもOKかと思いきやエラーが出ました、マッピングできないとのこと。信号属性がベクトルであるが故のエラーですね。
image.png

Selectorの設定は下記です。上図のイメージ通りの処理となっています。
image.png

微妙に注意すべき点として、ベクトルに対して「外部信号を遅延して入力をラッチ」の設定を有効にする必要があります。input2のポートにLoと書いてあるのはこの設定が有効なためです。
設定はinput2のポートのプロパティにて行います。
image.png

なおラッチの代わりにUnit delayを使用したところエラーとなりました。

Todo3. MATLAB functionにて分散を求める

function y = fcn(x)
y = var(x);

以上! 超簡単ですね。

動作確認

Random Numberブロックを入力とし、分散を変化させてみます。

分散1
image.png

分散2
image.png

問題なさそうですね。

おわりに

この記事の内容は「分かってしまえば何ともないが、分かるまでが大変」なもので、これはMATLABにはよくある事だと思います。

記事を読んですぐに試そうという方は多くはないかと思いますが、心に留めておいて頂き「いざ!」というときに役立てて頂ければ幸いです。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?