まとめます。
まず 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)
との実行で十分だと考えられます。
Best Answer