シミュレーション マネージャーを使用した結果の解析
シミュレーション マネージャーを使用すると、逐次または並列で複数のシミュレーションとその進捗を監視できます。パラメーター、経過時間、診断といった、すべての実行の詳細を確認できます。シミュレーション マネージャーは、ログに記録された信号の結果をシミュレーション データ インスペクターで解析して比較するオプションを提供します。シミュレーション マネージャーを介して、実行を選択して、その値をモデルに適用できます。parsim
コマンドまたは sim
コマンドを ShowSimulationManager
引数を on
に設定して実行すると、シミュレーション マネージャーが開きます。詳細については、シミュレーション マネージャーを参照してください。
タンクの寸法は、製品の生産の総コストに影響します。この例では、さまざまな値の幅と高さについて TotalCost
の動作を観察します。パラメーターの動作を解析することで、結果として TotalCost
が最も小さくなる A
と h
の組み合わせを探します。この設計の問題を解決するには、パラメーター A
と h
のさまざまな値を使用して複数のシミュレーションを (並列または逐次で) 実行します。
この例では、シミュレーション マネージャーを使用してシミュレーションを解析し、連続攪拌タンク反応器のモデルを使用して設計の問題を解決する方法を示します。反応器とは、製品を作成するためのさまざまな化学物質または化合物の混合に使用する特殊なタンクです。このモデルで使用されている重要な変数を次に示します。
変数
A
はタンク (幅) の断面積を表します。変数
h
は高さを表します。変数
TotalCost
はタンク 1 杯分の製品の生産コストをドル単位で表します。
シミュレーション マネージャーを使用すると、シミュレーションの実行中にシミュレーションの解析を行うことができます。シミュレーションが進行中である場合、シミュレーションの出力を入力パラメーターに対してプロットすることで、モデルのシミュレーション データを可視化できます。シミュレーションのトレンドを、その発生時に可視化することで、シミュレーションの設計空間を理解し、シミュレーションが要件通りに実行されているかどうかを評価できます。進行が想定どおりではない場合、シミュレーションを停止して時間を節約できます。
シミュレーション マネージャーを開く
この例では、Simulink.SimulationInput
オブジェクトを介してモデルに提供される一連のスイープ パラメーターを使用してから、parsim
コマンドを使用してシミュレーションを並列で実行します。
モデルを開きます。
openExample('simulink/OpenTheModelToUseWithSimulationManagerExample'); open_system('simManagerCSTR');
MATLAB スクリプトで次のように関数 PostSimFcn
を作成し、パラメーター スイープで後ほど呼び出します。ファイルに calculateCost.m
という名前を付けます。関数 PostSimFcn
は、変数 A
および h
から TotalCost
を計算します。この計算は、用途によって変化する可能性があります。
function costOutput = calculateCost(out) costOutput.yout = out.yout; coolantOutput = out.yout.get('Coolant').Values.Data; costCoolant = abs(mean(coolantOutput - 294))/30; costOutput.costFromCoolant = costCoolant; concentrationOutput = out.yout.get('Residual Concentration').Values.Data; costConcentration = 10*std(concentrationOutput - 2); costOutput.costFromConcentration = costConcentration; costOutput.TotalCost = costCoolant + costConcentration; end
パラメーター スイープの値のサンプルを作成します。
rangeA = [0.1, 5];
rangeH = [0.1, 5];
rng default;
numSamples = 60;
allAValues = rangeA(1) + (rangeA(2) - rangeA(1)).*rand(numSamples, 1);
allhValues = rangeH(1) + (rangeH(2) - rangeH(1)).*rand(numSamples, 1);
Simulink.SimulationInput
オブジェクトの配列を作成します。この例では、TotalCost
が計算され、PostSimFcn
を使用して返されます。
in(1:numSamples) = Simulink.SimulationInput('simManagerCSTR');
in = in.setPostSimFcn(@(out)calculateCost(out));
シミュレーションを並列で実行し、シミュレーション マネージャーを開きます。
for k = 1:numSamples in(k) = in(k).setVariable('A', allAValues(k), 'Workspace', 'simManagerCSTR'); in(k) = in(k).setVariable('h', allhValues(k), 'Workspace', 'simManagerCSTR'); end out = parsim(in, 'ShowSimulationManager', 'on');
シミュレーション マネージャーの既定のビューには、その X 軸と Y 軸上の 2 つのパラメーターを使用する散布図が表示されます。この場合、変数 A
は X 軸上であり、変数 h
は Y 軸上です。シミュレーションの実行中は、散布図上に点が表示され、シミュレーション状態に応じて色分けされています。完了したシミュレーションは緑、進行中のシミュレーションは青、エラーのあるシミュレーションは赤でマークされます。
右側の [プロット プロパティ] パネルにより、プロットが示すデータを編集および設定できます。X 軸と Y 軸のグリッドを選択すると、プロットにグリッド ラインが表示されます。
特定のパラメーターが時系列である場合、シミュレーション マネージャーは時系列の最後の値のみプロットします。
シミュレーション マネージャーを使用すると、上記のデータを surf プロットで可視化できます。ツールストリップの [結果] セクションで [surf] プロットをクリックします。
プロットの追加と設定
シミュレーション マネージャーの [結果] セクションでは、複数のプロットを追加し、設定できます。プロットを追加するには、[結果] セクションでプロットのタイプをクリックします。この例では、シミュレーション マネージャーのツールストリップの [結果] セクションで、[surf] プロットをクリックします。プロット プロパティを使用して、プロット上に表示するパラメーターを変更します。プロット ラベル、座標軸ラベルなどのプロパティを変更でき、3 番目のパラメーターを示すためにカラーマップを追加できます。また、カラーマップの値の範囲を変更することもできます。
2 番目のプロットと最初のプロットをまとめて、変数 A
と h
の値を決定することで、最適な TotalCost
が得られます。
surf プロットの Z 軸については、[データ] を [TotalCost]
に変更します。surf プロットの観察により、TotalCost
の最低点を検出できます。最低点をクリックすると、X 軸と Y 軸 (それぞれ h
と A
) の値が表示されます。
シミュレーション マネージャーの保存と読み込み
シミュレーション データとすべてのプロット設定を含むセッション情報を保存します。セッションを保存するには、ツールストリップの [保存] ボタンをクリックします。セッションは、.mldatx
ファイルとして保存されます。保存されたセッションを再度開くには、ファイルが保存された場所まで移動して .mldatx
ファイルをダブルクリックします。
シミュレーション マネージャーを使用すると、同様のシミュレーションを異なる値のセットを使用して実行する場合にプロットの設定を再利用できます。プロットの設定を再利用するには、ツールストリップの [ウィンドウの再利用] ボタンをクリックします。[ウィンドウの再利用] を選択すると、同じモデルの次回のシミュレーションで再利用できる、ラベル、軸の向き、どのパラメーターがどちらの軸に表示されるかなどのプロットの設定が保存されます。この機能を別のモデルのシミュレーションの実行中に使用する場合、制限によりシミュレーション エラーが発生します。
参考
Simulink.SimulationInput
| applyToModel
| setExternalInput
| setInitialState
| setVariable
| setModelParameter
| setBlockParameter
| validate
| setPostSimFcn
| setPreSimFcn
| parsim