MATLABはシミュレーションソフトとして最もポピュラーな存在です. 制御系の学生であれば,使ったことはなくてもその名前ぐらいは知っていると思います. ここでは制御系のシミュレーションをやるためにMATLAB Simulinkを使用します. まったく使ったことがなかった人間が初めてMATLABでシミュレーションを行った体験をもとに解説しています. 入門編として参考にされてください.


(公開:2004年05月29日)

コトの発端

某月某日,講義でこんな課題が出た.

下図に示すようなモータの運動方程式を導出し,シミュレーションによってステップ応答を求めよ.


「ただしMATLAB Simulink を使ってシミュレーションすること」

「えぇええー (制御専攻なのに)MATLAB 使ったことないです!

というわけで,人から教えてもらった過程そのままに,初心者に優しいMATLAB入門をはじめたいと思います.



※これは大学院の授業での話(しかも初回).通常,制御系の研究室に所属していれば, 学部生の段階でMatlabを使って卒論をやったりするわけだけど, 当方,画像処理の研究室に所属していたので,このときまでMatlabには完全ノータッチだった. あ,ちなみに最近は高専でも普通に授業でMatlabを使ったりしてるらしい.

1.まずは運動方程式を導こう

シミュレーションをやるためには,まず最初にシステムの運動方程式をたてなければいけません. モータの運動方程式は制御工学の入門でよく例題としてでてきますね.導出は以下のとおりです.

モータの軸の角速度をωとすると,モータ逆起電力Vmは次式で表わされます.

 (1)

またモータが発生するトルクτ は次のようになります.

 (2)

(2)式より,

 (3)

一方,電機子回路において次式が成り立ちます.

 (4)

(4)式に(1)式と(3)式を代入して整理すると,次の運動方程式が得られます.

 (5)

係数を次のように置き換えてまとめます.

 (6)

するとこんな感じでまとまります.3次のシステムですね.

 (7)

これで式の導出はおしまいです.

2.ブロック線図を考える

MATLAB Simulinkでは,ブロック線図を描くだけで簡単にシミュレーションを行うことができます. 導出した式からブロック線図を構成してみましょう(紙の上で). 現実問題として微分器は使えないので,積分器を用いて表現します.



こんな感じかな〜

さて,以上でシミュレーションをやるための前準備は整いました. 次はいざMATLABを起動してみましょう.

3.MATLABを触ってみよう

【1】
 まずはMATLABを起動しましょう.

【2】
 MATLABを起動すると,「しばらくお待ちください...」と表示されるのでしばらく待ってあげてください.

「ようこそMATLABへ.初めての方はメニューから"MATLAB ヘルプ"を選択してください.」 と出たら作業開始です.

▲起動画面
【3】
 まずはSimulinkを起動します.起動ボタンを押したら 「Simulink Library Browser」というウィンドウが表示されます.

▲Simulinkの起動ボタン


▲これがSimulink
【4】
 このSimulink Library Browserには,これからブロック線図を構成していくためのパーツ がおさめられています.

 ウィンドウ左にある「Continuous」をクリックしてください. Continuousというのは「連続時間系で使用するパーツ」という意味です. 試しに「Integrator」をクリックしてみると, 上に説明が表示されます.言わずもがな積分器ですね.

 今回の課題では積分器,ゲイン,加算点,ステップ信号,スコープの5種類を使います. それぞれどこに入っているか確認してください.スコープは信号のグラフを表示するための パーツです.これについては後ほど詳しく説明します.

▲Simulink Library Browserを操作してみよう

▼ちなみに今回使うパーツは以下の通り.
パーツの形
パーツ名
分類
積分器
Continuous
ゲイン
Math
加算点
Math
ステップ信号
Sources
スコープ
Sinks
【5】
 ここで,このウィンドウの左上にある「新規モデルの作成」ボタンをクリックします. 出てきたウィンドウ上にこれからブロック線図を描いていきます.

▲新規モデルの作成ボタン.これを押せ!


▲モデルを描くためのウィンドウが表示されます
【6】
 Simulink Library Browserからパーツをドラッグ&ドロップすることで モデル作成ウィンドウにパーツを貼り付けることができます.また, マウスを使ってパーツ間を線でつなげていくことができます.この要領で ブロック線図を作成していきます.

 ゲインを左向きにしたければ,パーツをクリックして, 「書式」メニューの「ブロックの反転」をすれば向きを左右逆にすることができます.


▲ドラッグ&ドロップでパーツを貼り付けていきます

【7】
 各パーツは,ダブルクリックすることでその設定項目を開くことができます.

 まずは「sum」の説明から.アイコン形状はround(丸型)とrectangular(長方形) が選べます.符号のリストにはデフォルトで「|++」となっています. 「|」はポートの区切りを意味します. 「+|--」とか「+-|-」とかにして,その違いを確かめてください. とりあえずここでは「+--」と設定してください.


▲sumの設定をこのように変更します


▲こんな感じになります
【8】
 さて次はゲインの設定をします.設定項目の「ゲイン」を変更します. デフォルトでは「1」になっていますが,これを「a1」 と書き換えます.これでゲインa1の出来上がりです. a2bについても同様のことをします.

▲gainの設定をこのように変更します


▲これでゲインa1ができました
【9】
 ステップの設定をしましょう.「ステップ時間」と書いてあるところが ステップの開始時間です.デフォルトで1になっていますが, 開始0秒からステップを立ち上がらせたいので,0に変更します.
 ちなみにステップの大きさを変えたければ「最終値」 のところを変更すればOKです.(ここではデフォルトのまま1とします.)

▲ステップ入力の設定
【10】
 結線と設定を行い,右図のようなモデルができたら完成です.

 「ファイル」メニューの「名前を付けて保存」で,「motor_system.mdl」という 名前で保存します.命名は自由ですが,日本語名は避けたほうが良いようです. また,パスに日本語やスペースの入った場所に保存するのも避けたほうが良い との話.

▲これでモデルができました
【11】
 さて,モデルができたところで,ちょっくら実行ボタンを押してみましょう.動くかな?

…やってみると,何かおかしい.エラーのウィンドウが表示されます.

ブロック'motor_system/Gain1'内のパラメータ'Gain'の評価にエラーがあります: 'a1' は未定義の関数,または変数です

そうです,それもそのはず.a1,a2,bというゲインは未定義のままです. それでは次はその定義の仕方について説明しましょう.

▲シミュレーションの開始ボタン


▲エラーメッセージ.怒られちゃいました.
【12】
 モデルの作成はSimulinkのほうで作業しましたが,ここで一端MATLAB本体のほうに戻ります.
 MATLABにおいて,変数の定義や数式による演算の部分はM-Fileと呼ばれるファイルに記述します. MATLABのウィンドウの左上にある「新規M-File」ボタンを クリックしてください.するとM-Fileの編集ウィンドウが起動します.


▲新規M-Fileの作成ボタン.これを押せ!


▲するとM-Fileの編集ウィンドウが表示される
【13】
 さて,M-File編集ウィンドウが開いたところで,右のように記述します. MATLABでは%がコメントアウトの記号です. %から行の終りまでがコメントとみなされます.

 記述様式はC言語と同じです.導出した式どおりに記述すればOKです.

 書き終わったら保存します.M-Fileの名前は先ほど作成したモデルのファイルとは 違う名前にしてください.同じ名前にすると実行の際に不具合がでたりします. (←経験済み)

 ここでは「motor_variable.m」という名前で保存することにします.
▼M-Fileの記述内容.導出した式を元に記述します.
clear;              %クリア

Ra=0.92;            %電機子抵抗
La=0.0009;          %電機子インダクタンス
J=2.8*10^(-5);      %慣性モーメント
B=0.65*10^(-3);     %粘性抵抗
Kb=0.081;           %逆起電力定数
Kt=0.081;           %トルク定数

a1=(J*Ra+B*La)/(J*La);
a2=(B*Ra+Kb*Kt)/(J*La);
b=Kt/(J*La);
【14】
 以上で「何かを作る」作業はすべて終わりました.あとはシミュレーションを行うだけです. 実行順序は次の通りです.

(1)
 まずM-Fileの内容を実行します.実行はM-Fileの編集ウィンドウにある実行ボタンからできます. M-Fileを実行することで,変数の中身が有効になります.

(2)
 次にSimulinkのモデル編集ウィンドウの「シミュレーション」メニューから 「シミュレーションパラメータ」 を開きます.

 まず,シミュレーションの終了時刻を「0.1」にします. (このシステムが非常に速い応答を返すからです)
 最大ステップサイズはシミュレーションを行う時間刻みの最大値のことです. 0.01くらいが妥当でしょう.
 相対誤差と絶対許容誤差値は,シミュレーションの精度にかかわるパラメータです. 小さいほど精度は上がりますが,そのぶんシミュレーションの実行時間がかかります. 標準で10の-6乗程度で良いでしょう. (1e-6あるいは10^(-6)と記述します.)

(3)
 最後にSimulinkにおいてモデルのシミュレーションを実行します.今度は変数が定義されているので エラーメッセージは表示されないはずです.

▲M-Fileの実行ボタン.つべこべ言わず押せ!


▲シミュレーションパラメータの設定を開くのです


▲モータは応答が速いので,シミュレーション終了時刻を0.1秒に設定します


▲シミュレーションの開始ボタン.今度は変数の定義をしたから大丈夫なハズ.
【15】
 実行したけれども,画面にはなんの反応もありません. 失敗? いえいえこれで良いんです.

 モデルにあるScopeをダブルクリックしてみてください. グラフが表示されたでしょう.グラフ上で右クリックして「オートスケール」を選択してください. 見やすく表示されたと思います. マウスで範囲選択してグラフの一部分を拡大して表示したりもできます.

 これで無事にシミュレーション結果を得ることができました.

 グラフを見ると,角速度は11.3[rad/s]付近に収束し,一方で角度はランプ状に増加していることが分かります. ただ単にモータに一定電圧をかけているだけですから当然の結果ではあるんですが.


▲角速度のグラフ


▲角度のグラフ

というわけで

無事にレポートを提出することができましたとさ.以上でこの解説は終りです.