Simulink

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Parfor を使った並列シミュレーション:テストケース スイープ

この例では、Parallel Computing Toolbox™ の使用によって、Signal Builder ブロック内のさまざまなテスト ケースに対応する複数の Simulink® シミュレーションを並列して実行する方法を示します。これには、5 つの主要手順があります。

  1. 自分のマシンで MATLAB® ワーカーを起動

  2. 複数シミュレーションに必要なデータを設定

  3. parfor (parallel for) ループで複数のシミュレーションを実行

  4. 複数シミュレーションの結果をプロット

  5. MATLAB ワーカーを閉じる

モデルの概要

以下に示すモデル sldemo_suspn_3dof sldemo_suspn_3dof は、さまざまな路面凹凸に関して、道路/サスペンションの相互作用に基づく車両運動をシミュレーションします。車両運動は、垂直変位、ロール、ピッチの 3 つの自由度でキャプチャされます。左と右のタイヤの路面凹凸は、異なるテスト ケースとして Signal Builder ブロックにインポートされます。Road-Suspension Interaction サブシステムが、道路データと現在の車両状態に基づいて、4 つのタイヤ位置で車両にかかるサスペンションの力を計算します。Body Dynamics サブシステムでは、これらの力とその結果のピッチおよびロールのモーメントを使用して、垂直変位、ロール、ピッチの 3 つの自由度で車両の動きを決定します。

サスペンション モデルは、設計が望ましいパフォーマンス上の目標を達成するかどうか判別するため、さまざまな路面凹凸を使用してシミュレーションされます。下記に示すように、これらの複数のシミュレーションは、Parallel Computing Toolbox の使用によってスピードアップされます。

mdl               = 'sldemo_suspn_3dof';
isModelOpen       = bdIsLoaded(mdl);
open_system(mdl);

手順 1: 自分のマシンで MATLAB ワーカーを起動

まず、MATLAB ワーカーのプールを設定し、起動します。parpool コマンドを使用して、並列プールが開いていることを確認し、マルチコア デスクトップでローカル プールを開きます。これには、Parallel Computing Toolbox が必要です。

apool = gcp;
if isempty(apool)
    apool = parpool;
end
Starting parallel pool (parpool) using the 'local' profile ... connected to 12 workers.

手順 2: 複数シミュレーションに必要なデータを設定

関数 signalbuildersignalbuilder を使用して Signal Builder ブロック内のケースの数を決定します。ケースの数は、手順 3 で実行される反復の数を決定するために使用されます。また、手順 3 でシミュレーション結果の収集に使用される SimulationOutput オブジェクトの配列を Simulink パッケージに事前に割り当てるためにも使用されます。

[~,~,~,cases]     = signalbuilder([mdl '/Road Profiles']);
numCases          = numel(cases);
simout(numCases)  = Simulink.SimulationOutput;

手順 3:parfor (Parallel for) ループで複数のシミュレーションを実行

parfor ループ内のさまざまなテスト ケースに対応する複数のシミュレーションを実行します。関数 signalbuilder はここでも使用されますが、今回は反復ごとにアクティブな信号を設定します。simsim コマンドはすべてのシミュレーション データを Simulink パッケージの SimulationOutput オブジェクトとして返します。Nシミュレーションの結果は、手順 2 で事前に割り当てられた変数 simout 内に収集されることに注意してください。

parfor idx = 1:numCases
    load_system(mdl);
    signalbuilder([mdl '/Road Profiles'],'activegroup',idx);
    simout(idx) = sim(mdl,'SimulationMode','normal');
end

手順 4:複数シミュレーションの結果をプロット

さまざまなシミュレーションから車両の垂直変位をプロットして、さまざまな路面凹凸に対する車両のパフォーマンスを確認します。SimulationOutput オブジェクトの get メソッドを使用して、simout の各要素に含まれている時系列を取得します。時間および信号データは、時系列オブジェクト内に含まれています。

legend_labels = cell(1,numCases);
for i = 1:numCases
        si = simout(i);
        ts = si.get('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');

手順 5: MATLAB ワーカーを閉じる

最後に、並列プールとモデルを閉じます (まだ閉じられていない場合)。

if(~isModelOpen)
    close_system(mdl, 0);
end
delete(apool);