ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

Parfor を使った並列シミュレーション:ラピッド アクセラレータ モードでのパラメーター スイープ

この例では、Parallel Computing Toolbox™ を ラピッド アクセラレータと併用することによって、モンテカルロ法の Simulink シミュレーションを複数並列して実行する方法を示します。これには、6 つの主要手順があります。

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

  2. ラピッド アクセラレータ ターゲットを作成

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

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

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

  6. 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 ワーカーのプールを設定し、起動します。matlabpool コマンドを使用して、MATLAB プールが開いていることを確認し、マルチコア デスクトップでローカル プールを開きます。これには、Parallel Computing Toolbox が必要です。

numWorkers   = matlabpool('size');
isPoolOpen   = (numWorkers > 0);
if(~isPoolOpen)
    matlabpool;
end
Starting matlabpool using the 'LocalProfile1' profile ... connected to 6 workers.

手順 2: ラピッド アクセラレータ ターゲットを 1 回作成

ラピッド アクセラレータ ターゲットを作成する前に、現在のディレクトリ パスを保存し、現在のディレクトリを一時ディレクトリに変更し、モデルを開きます。次に、Simulink.BlockDiagram パッケージから関数 buildRapidAcceleratorTargetbuildRapidAcceleratorTarget を使用してモデルのラピッド アクセラレータの実行可能ファイルを作成します。関数 buildRapidAcceleratorTarget から既定の実行時パラメーター セットが返ります。このセットは、手順 3 で複数データセットの作成に使用されます。

curDir       = pwd;
cd(tempdir);
open_system(mdl);
rtp          = Simulink.BlockDiagram.buildRapidAcceleratorTarget(mdl);

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

手順 2 からの既定の実行時パラメーター構造体を使用することにより、さまざまな車両の質量に対する実行時パラメーター構造体のベクトルを作成します。Simulink.BlockDiagram パッケージから関数 modifyTunableParametersmodifyTunableParameters を使用して、車両の質量に対応するパラメーターを変更します。ここでは、変更するパラメーターが 1 つしかないので、parfor ループの代わりに for ループを使用すべきです。また、手順 4 でシミュレーション結果の収集に使用される SimulationOutput オブジェクトの配列を Simulink パッケージに事前に割り当てます。

Mb_sweep            = Mb*(0.5:5:45.5);
iterations          = length(Mb_sweep);
for i = iterations:-1:1
    parameterSet(i) = Simulink.BlockDiagram.modifyTunableParameters(rtp, ...
                                                      'Mb',Mb_sweep(i));
end
simout(iterations)  = Simulink.SimulationOutput;

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

parfor ループ内のさまざまなパラメーター セットに対応する複数のシミュレーションを実行します。simsim コマンドはすべてのシミュレーション データを Simulink パッケージの SimulationOutput オブジェクトとして返します。シミュレーションの結果は、手順 3 で事前に割り当てられた変数 simout 内に収集されることに注意してください。sim コマンドを parfor ループ内からラピッド アクセラレータ モードで実行するには、sim コマンドの引数 'RapidAcceleratorUpToDateCheck' を 'off' に設定するのが最も簡単です。パラメーター構造体を渡すには、引数 'RapidAcceleratorParameterSets' を使用します。

parfor idx = 1:iterations
    simout(idx) = sim(mdl,'SimulationMode','rapid',...
                      'RapidAcceleratorUpToDateCheck','off', ...
                      'RapidAcceleratorParameterSets',parameterSet(idx));
end

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

さまざまなシミュレーションから車両の垂直変位をプロットして、車両の質量の変化が車両運動にどのように影響したかを確認します。SimulationOutput オブジェクトの get メソッドを使用して、simout の各要素に含まれている時間と信号のデータを取得します。

legend_labels = cell(1,iterations);
for i = 1:iterations
        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');

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

最後に、現在のディレクトリを当初のディレクトリに戻します。MATLAB プールとモデルを閉じます (まだ閉じられていない場合)。

cd(curDir);
if(~isModelOpen)
    close_system(mdl, 0);
end
if(~isPoolOpen)
    matlabpool close
end
Parallel pool using the 'LocalProfile1' profile is shutting down.
この情報は役に立ちましたか?