GAでのモデルの出力値の最適化

2 ビュー (過去 30 日間)
fumito ito
fumito ito 2017 年 1 月 30 日
コメント済み: mizuki 2017 年 2 月 2 日
optimtoolのGAによってsimulink(simmechanics)によって作成したモデルの出力値が最小になるように最適化を行いたいです. 現在のコマンドが以下の通りになります.
function trqfuka=GArensyu01(x,ScopeData2)
y1=[0 x(1)]
y2=[0 x(2)]
open('GArensyu2')
sim('GArensyu2')
trq=ScopeData2(:,2)
trq_int=(trq*0.022222).^2
trqfuka=sum(trq_int)
GArensyu2というのはモデルの名前です. y1,y2はモデルの入力値でScopeData2がモデルの出力値です. ワークスペースに何もない状態でこのコマンドのGAを実行すると,エラーで
「パラメーター 'VariableName' に対する 'GArensyu2/Subsystem3/From Workspace' 内の設定が無効です。」
と表示されます.これの解決策は何かないでしょうか. また,仮の値をy1,y2に与えてGAを実行するとエラーは出ないんですが,モデルが永遠に回り続け,全くGAの計算がされません.この解決策も教えて頂きたいです.よろしくお願いします.
  13 件のコメント
michio
michio 2017 年 2 月 1 日
編集済み: michio 2017 年 2 月 1 日
GArensyu01 関数内では ScopeData2 は確かに定義されていないですね。入力引数として与えられているだけです。
画像から判断するに GArensyu2 が実行された結果は 2 つのToWorkspace ブロックから simout1, simout2 という変数で出力されていそうですよ?
ブロックの挙動はこちらを確認してみてください。 https://jp.mathworks.com/help/simulink/slref/toworkspace.html
fumito ito
fumito ito 2017 年 2 月 1 日
scopeブロックの設定で,「データをワークスペースに保存」にチェックを入れているため,GArensyu2を実行するとベースワークスペースにScopeData2が出力されます.
ベースワークスペースの変数を使うやり方は以前教えて頂いたやり方でできていたので,GAを実行する際に
sim('GArensyu2')
が実行されていないということなんでしょうか. 何度も質問申し訳ないです.

サインインしてコメントする。

採用された回答

michio
michio 2017 年 2 月 1 日
編集済み: michio 2017 年 2 月 1 日
まとめます。
まず Simulink モデルで参照しているワークスペースがデフォルトでは、”ベースワークスペース” であるため、関数ワークスペース(simコマンドの呼び出し元)で定義されている変数 y1,y2 にアクセスできず、エラーが生じていました。
ワークスペースについての参照ページ: ベース ワークスペースと関数ワークスペース
解決方法として、sim 関数実行時に、SrcWorkspace プロパティを 'current' に 設定し、モデルが参照するワークスペースを呼び出し元のワークスペース(GArensyu01関数内)に設定すること紹介しました。
sim('GArensyu2','SrcWorkspace','current');
この時、スコープから出力されるはずの変数 ScopeData2 は sim 関数から出力される構造体に保存され、ScopeData2 という変数は単体としては、関数ワークスペース、ベースワークスペースどちらにも保存されません。詳細は下記 URL を確認ください。
上記のURLで説明されている通り、sim コマンドの出力変数を
simOut = sim('GArensyu2','SrcWorkspace','current');
と simOut で受けた上で、simOut 構造体内の ScopeData2 の値を
trq= simOut.ScopeData2(:,2)
という様に使用できるのではと考えています。
また、
[X,Y]=ga(@(x) GArensyu01(x, ScopeData2), 2)
との実行をされた場合(ベースワークスペースでの実行と想定)、この実行時に ScopeData2 変数が定義されていない場合エラーが発生します。
既に上述の様に ScopeData2 は simOut という構造体の一部として sim 関数の呼び出し元で定義されベースワークスペースには登場しないので、実際は
[X,Y]=ga(@(x) GArensyu01(x), 2)
との実行で十分だと考えられます。
  12 件のコメント
michio
michio 2017 年 2 月 2 日
Good luck :)
mizuki
mizuki 2017 年 2 月 2 日
System Error の方は、頻繁に出るようであれば Technical Support にお問い合わせください。MATLAB が強制終了されてしまう状況であれば、全てではありませんが可能な限りのヘルプは Technical Support でできるということでした。計算結果が正常に得られるといいですね。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangePrepare Model Inputs and Outputs についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by