Parsim を使った並列シミュレーション: テストケース スイープ
この例では、SimulationInput オブジェクトと parsim コマンドの使用によって、Signal Editor ブロック内のさまざまなテスト ケースに対応する複数の Simulink® シミュレーションを実行する方法を示します。parsim コマンドは、Parallel Computing Toolbox™ が利用できる場合はこれを使用してシミュレーションを並列実行します。使用できない場合、シミュレーションは逐次実行されます。
モデルの概要
以下に示すモデル sldemo_suspn_3dof は、さまざまな路面凹凸に関して、道路/サスペンションの相互作用に基づく車両運動をシミュレーションします。車両運動は、垂直変位、ロール、ピッチの 3 つの自由度で取得されます。左と右のタイヤの路面凹凸データは、異なるテスト ケースとして Signal Editor ブロックにインポートされます。Road-Suspension Interaction サブシステムが、道路データと現在の車両状態に基づいて、4 つのタイヤ位置で車両にかかるサスペンションの力を計算します。Body Dynamics サブシステムでは、これらの力とその結果のピッチおよびロールのモーメントを使用して、垂直変位、ロール、ピッチの 3 つの自由度で車両の動きを決定します。
サスペンション モデルは、設計が望ましいパフォーマンス上の目標を達成するかどうか判別するため、さまざまな路面凹凸を使用してシミュレーションされます。下記に示すように、これらの複数のシミュレーションは、Parallel Computing Toolbox の使用によってスピードアップされます。
mdl = 'sldemo_suspn_3dof';
isModelOpen = bdIsLoaded(mdl);
open_system(mdl);

複数シミュレーションに必要なデータを設定
Signal Editor ブロックの NumberOfScenarios パラメーターを使用して Signal Editor ブロックのケースの数を決定します。ケースの数は、手順 3 で実行される反復の数を決定するために使用されます。
sigEditBlk = [mdl '/Road Profiles']; numCases = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
Simulink.SimulationInput オブジェクトの配列を作成し、実行するシミュレーションのセットを定義します。各 SimulationInput オブジェクトは 1 つのシミュレーションに対応し、変数 in に配列として保存されます。マスク パラメーター ActiveScenario では、Signal Editor ブロック シナリオのスイープ値を指定します。シミュレーションごとにアクティブなシナリオが設定されます。
for idx = numCases:-1:1 in(idx) = Simulink.SimulationInput(mdl); in(idx) = setBlockParameter(in(idx), sigEditBlk, 'ActiveScenario', idx); end
モデル パラメーターを SimulationInput オブジェクトに指定しても、直ちにモデルに適用されるわけではないことに注意してください。指定した値はシミュレーション中に適用され、シミュレーションの終了後、可能な場合は元の値に戻されます。
Parsim を使ったシミュレーションの並列実行
関数 parsim を使用してシミュレーションを並列実行します。最後の手順で作成された SimulationInput オブジェクトの配列 in は、最初の引数として関数 parsim に渡されます。parsim コマンドからの出力は、変数 out に保存される Simulink.SimulationOutput オブジェクトの配列です。'ShowProgress' オプションを 'on' に設定し、シミュレーションの進行状況を MATLAB コマンド ウィンドウに出力します。
out = parsim(in, 'ShowProgress', 'on');
[07-Aug-2024 10:25:37] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'Processes' profile ... 07-Aug-2024 10:26:44: Job Running. Waiting for parallel pool workers to connect ... Connected to parallel pool with 4 workers. [07-Aug-2024 10:27:02] Starting Simulink on parallel workers... [07-Aug-2024 10:27:49] Configuring simulation cache folder on parallel workers... [07-Aug-2024 10:27:51] Loading model on parallel workers... [07-Aug-2024 10:28:04] Running simulations... [07-Aug-2024 10:28:22] Completed 1 of 20 simulation runs [07-Aug-2024 10:28:22] Received simulation output (size: 3.06 MB) for run 1 from parallel worker. [07-Aug-2024 10:28:22] Completed 2 of 20 simulation runs [07-Aug-2024 10:28:22] Received simulation output (size: 3.06 MB) for run 2 from parallel worker. [07-Aug-2024 10:28:22] Completed 3 of 20 simulation runs [07-Aug-2024 10:28:22] Received simulation output (size: 3.06 MB) for run 3 from parallel worker. [07-Aug-2024 10:28:22] Completed 4 of 20 simulation runs [07-Aug-2024 10:28:22] Received simulation output (size: 3.06 MB) for run 4 from parallel worker. [07-Aug-2024 10:28:24] Completed 5 of 20 simulation runs [07-Aug-2024 10:28:24] Received simulation output (size: 3.06 MB) for run 5 from parallel worker. [07-Aug-2024 10:28:24] Completed 6 of 20 simulation runs [07-Aug-2024 10:28:24] Received simulation output (size: 3.06 MB) for run 6 from parallel worker. [07-Aug-2024 10:28:28] Completed 7 of 20 simulation runs [07-Aug-2024 10:28:28] Received simulation output (size: 3.06 MB) for run 7 from parallel worker. [07-Aug-2024 10:28:28] Completed 8 of 20 simulation runs [07-Aug-2024 10:28:28] Received simulation output (size: 3.06 MB) for run 8 from parallel worker. [07-Aug-2024 10:28:28] Completed 9 of 20 simulation runs [07-Aug-2024 10:28:28] Received simulation output (size: 3.06 MB) for run 9 from parallel worker. [07-Aug-2024 10:28:28] Completed 10 of 20 simulation runs [07-Aug-2024 10:28:28] Received simulation output (size: 3.06 MB) for run 10 from parallel worker. [07-Aug-2024 10:28:28] Completed 11 of 20 simulation runs [07-Aug-2024 10:28:28] Received simulation output (size: 3.06 MB) for run 11 from parallel worker. [07-Aug-2024 10:28:29] Completed 12 of 20 simulation runs [07-Aug-2024 10:28:29] Received simulation output (size: 3.06 MB) for run 12 from parallel worker. [07-Aug-2024 10:28:29] Completed 13 of 20 simulation runs [07-Aug-2024 10:28:29] Received simulation output (size: 3.06 MB) for run 13 from parallel worker. [07-Aug-2024 10:28:29] Completed 14 of 20 simulation runs [07-Aug-2024 10:28:29] Received simulation output (size: 3.06 MB) for run 14 from parallel worker. [07-Aug-2024 10:28:30] Completed 15 of 20 simulation runs [07-Aug-2024 10:28:30] Received simulation output (size: 3.06 MB) for run 15 from parallel worker. [07-Aug-2024 10:28:31] Completed 16 of 20 simulation runs [07-Aug-2024 10:28:31] Received simulation output (size: 3.06 MB) for run 16 from parallel worker. [07-Aug-2024 10:28:31] Completed 17 of 20 simulation runs [07-Aug-2024 10:28:31] Received simulation output (size: 3.06 MB) for run 17 from parallel worker. [07-Aug-2024 10:28:31] Completed 18 of 20 simulation runs [07-Aug-2024 10:28:31] Received simulation output (size: 3.06 MB) for run 18 from parallel worker. [07-Aug-2024 10:28:32] Completed 19 of 20 simulation runs [07-Aug-2024 10:28:32] Received simulation output (size: 3.06 MB) for run 19 from parallel worker. [07-Aug-2024 10:28:33] Completed 20 of 20 simulation runs [07-Aug-2024 10:28:33] Received simulation output (size: 3.06 MB) for run 20 from parallel worker. [07-Aug-2024 10:28:33] Cleaning up parallel workers...
各 SimulationOutput オブジェクトには、ログ信号に加え、SimulationMetadata が含まれています。parsim を使用して複数のシミュレーションを実行すると、後続のシミュレーションを継続して実行できるようにエラーがキャプチャされます。エラーがあれば SimulationOutput オブジェクトの ErrorMessage プロパティに表示されます。
結果のプロット
さまざまなシミュレーションから車両の垂直変位をプロットして、さまざまな路面凹凸に対する車両のパフォーマンスを確認します。信号は SimulationOutput オブジェクトに Dataset 形式で記録されます。get メソッドを使用して、out の各要素からの時間と信号データが含まれる timeseries オブジェクトを取得します。
legend_labels = cell(1,numCases); for i = 1:numCases simOut = out(i); ts = simOut.logsout.get('vertical_disp').Values; ts.plot; legend_labels{i} = ['Run ' num2str(i)]; hold all end title('Response of a 3-DoF Suspension Model') xlabel('Time (s)'); ylabel('Vehicle vertical displacement (m)'); legend(legend_labels,'Location','NorthEastOutside');

MATLAB ワーカーを閉じる
最後に、並列プールとモデルを閉じます (まだ閉じられていない場合)。
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
Parallel pool using the 'Processes' profile is shutting down.
参考
parsim | Simulink.SimulationInput | Simulink.Simulation.Variable