MATLABを使って​、Simulinkの​モデルを実行する方法

MATLABを使って、Simulinkのモデルを実行したいです。具体的には、Simulinkのモデル内のゲインの値をワークスペースで定義するのではなく、MATLABのプログラム内でランダムな値に定義してモデルを実行したいと考えています。
sim('model',G1,G2,G3,G4);----①
Simulinkのモデル"model"内にあるゲインG1,G2,G3,G4の値について、任意の値をMATLABのプログラム内で設定してsimを使ってモデルを実行したいです。
上のanswerを参考に説明すると、for G=1:8の部分をGの値をランダムな値にして実行したいです。
①を使って実行すると、以下のようなエラーが表示されます。
"OPTIONS" パラメーターは、SIMSET によって作成された構造体でなければなりません
エラーの表示をなくしたいです。また、正しく実行できるようにしたいです。
ご対応をよろしくお願いします。

1 Comment

Atsushi Ueno
Atsushi Ueno on 23 Jun 2021
なぜゲインの値をワークスペースで定義したくないのか、疑問です。
sim('model',G1,G2,G3,G4);という形で実行したかったという事は、1つの結果を出力するシミュレーションを4回繰り返すのではなく「4つの結果をまとめて1回のシミュレーションで出力したい」のかなと思いました。もしこの想定通りであれば、プログラム内でG1,G2,G3,G4をワークスペース内に定義しても良いのでしょうか?それとも何かワークスペースを使いたくない理由があるのでしょうか?

Sign in to comment.

 Accepted Answer

Atsushi Ueno
Atsushi Ueno on 23 Jun 2021
Edited: Atsushi Ueno on 24 Jun 2021
%G1=2; G2=4; G3=6; G4=8; % 値は適当
%sim('mysample',G1,G2,G3,G4);
%"OPTIONS" パラメーターは、SIMSET によって作成された構造体でなければなりません
sim関数に単独のスカラ値を受け取る構文はありません。シミュレーションの入出力は既定のデータ型(オブジェクト)経由でやり取りする必要があります。下記事例のようにするとエラーが出なくなります。詳細は下記ドキュメントを参照願います。
%in = Simulink.SimulationInput('mysample'); % inにシミュレーション対象モデル名を設定
%in = in.setVariable('G', [2 4 6 8]); % 値は適当
%out = sim(in);
%plot(out.tout, out.simout) % 処理結果の出力
(追記) はじめは「何かワークスペースを使いたくない理由があるのかな?」と勘違いしてSimulationInputオブジェクトを使う例を回答しましたが、その後のやり取りでワークスペースを使いたくない理由が無い事が判ったので、一旦上記回答は忘れましょう。
質問文のリンク先Q&A(103578)の回答と同じ方法で動かしてみました。
これで良ければ、コメントのエラー「SimulationOutput から double に変換できません」は回避できます。
figure
for ind = 1:10
x = rand(1,4);
Kp11 = x(1); % mysample.mdlのPI制御器のPゲインをKp11*Kp33としました
Ki11 = x(2); % mysample.mdlのPI制御器のIゲインをKi11*Ki33としました
Kp33 = x(3);
Ki33 = x(4);
sim('mysample'); %SIMコマンドによるモデルの実行
hold on
plot(tout,simout) %処理結果の出力
drawnow
end
hold off

4 Comments

Hirokazu Ishibashi
Hirokazu Ishibashi on 24 Jun 2021
ご対応ありがとうございます。
前記の質問につきましてもこちらで返答させていただきます。
ワークスペースで定義したくない理由につきましては、matlabのrand関数を使って、ゲインの値を不規則に変えた場合の反応を実験したいと考えているからです。また、ゲインというのもPI制御器のゲインであり、2個のPI制御器のゲインについて検討したいと考えているため、4個のゲインになります。
回答を参考に次のようにプログラムを設計しました。
in = Simulink.SimulationInput('model'); % inにシミュレーション対象モデル名を設定
in = in.setVariable('Kp11', x(1)); % 値は適当
in = in.setVariable('Ki11', x(2)); % 値は適当
in = in.setVariable('Kp33', x(3)); % 値は適当
in = in.setVariable('Ki33', x(4)); % 値は適当
simout1 = sim(in);
simout2 = sim(in);
Kp11などは'model'内にあるPI制御器のゲインを表しており、x(1)~x(4)にはrand関数で求めた値が入ります。これを使って実行したところ、以下のエラーが表示されました。
Simulink.SimulationOutput から double への変換中に、以下のエラーが発生しました:
Simulink.SimulationOutput から double に変換できません。
おそらく、rand関数で作成した値が整数でないことが原因として考えられます。送っていただいたURLを参考に考えたのですが、解決方法がわかりませんでした。
長文になってしまい、すみません。ご対応をよろしくお願いします。
Atsushi Ueno
Atsushi Ueno on 24 Jun 2021
SimulationInput オブジェクト in を使用してシミュレーションの変数を設定するのは、ワークスペース上の変数に対して行っています。(スコープがどうなってるのかは私もちょっと疑問が残っています)
Simulink.SimulationOutput から double に変換できません」と言うエラーは単純に、simout1.tout, simout2.simoutのようにシミュレーションの出力が一つのオブジェクトの中に入っている為、そのままdoubleのスカラ値を必要とするところに使おうとすると、変換出来ない旨のエラーが出ているのだと思います。後ほど回答を付け加えます。
あっ、バイトの時間だ!
Hirokazu Ishibashi
Hirokazu Ishibashi on 24 Jun 2021
お忙しい中、ご対応していただきありがとうございます。
やはり、double型の件に関しては、まだ解決できないのでご指導をよろしくお願いします。
Hirokazu Ishibashi
Hirokazu Ishibashi on 25 Jun 2021
setVariableを使って、モデルを実行することが出来ました。
ご指導していただき、ありがとうございます。
追記の件に関しましても、理解しました。
助かりました。また、機会があればよろしくお願いします。

Sign in to comment.

More Answers (0)

Categories

Find more on 一般分野への適用 in Help Center and File Exchange

Products

Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!