Main Content

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

この例では、Parallel Computing Toolbox™ を使用して、モンテカルロ法のシミュレーションを複数並列して実行する方法を示します。並列実行はホスト マシンの複数のコアを活用して多くのシミュレーションの実行を高速化します。これらのシミュレーションは、MATLAB Parallel Server™ を使用し、コンピューター クラスターで並列に実行することもできます。この例は Parallel Computing Toolbox™ または MATLAB Parallel Server™ が利用できない場合でも機能しますが、シミュレーションは逐次実行されます。

モデル例の確認

モデル 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);

ラピッド アクセラレータ ターゲットのビルドの設定

モデル用のラピッド アクセラレータ実行可能ファイルは、関数Simulink.BlockDiagram.buildRapidAcceleratorTargetを使用して SetupFcn の呼び出しでビルドされます。関数 buildRapidAcceleratorTarget から既定の実行時パラメーター セットが返されます。これは、SetupFcn でグローバル変数 RTP に代入され、パラメーター値を変更する次の手順で使われます。エディターで sldemo_parsim_paramsweep_suspn_raccel_setup を開き、コードを検証します。ビルド ファイルが既に存在していてモデルおよびマシン アーキテクチャに対応している場合は、早く返されるようにビルド プロセスが最適化されていることに注意してください。

SimulationInput オブジェクトを使った複数のシミュレーションの設定

ベース ワークスペースで変数 Mb_sweep にスイープ値を保存します。

Mb_sweep = Mb*(0.5:5:45.5);

実行するシミュレーション回数を決定します。これは、スイープ値の数と同じです。この数を変数 numSims に保存します。

numSims = length(Mb_sweep);

for ループを使用して、次を行います。

  1. モデルの Simulink.SimulationInput オブジェクトを作成します。シミュレーションにつき 1 つのオブジェクトを作成します。オブジェクトを配列として変数 in に保存します。

  2. SimulationInput オブジェクトでモデル パラメーターを指定します。

for i = numSims:-1:1
    in(i) = Simulink.SimulationInput(mdl);
    in(i) = in(i).setModelParameter('SimulationMode', 'rapid', ...
        'RapidAcceleratorUpToDateCheck', 'off');
    in(i).PreSimFcn = @(x) sldemo_parsim_paramsweep_suspn_raccel_presim(x, Mb_sweep(i));
end

SimulationInput オブジェクトを使用してモデル パラメーターを変更します。'SimulationMode' はラピッド アクセラレータを使用するように設定され、'RapidAcceleratorUpToDateCheck' モデル パラメーターは最新チェックをスキップするように 'off' に設定されます。これは、シミュレーション間でモデルに構造的な変更が加えられず、同じビルド ファイルを使用できるためです。モデル パラメーターを SimulationInput オブジェクトに指定しても、直ちにモデルに適用されるわけではないことに注意してください。指定した値はシミュレーション中に適用され、シミュレーションの終了後、可能な場合は元の値に戻されます。PreSimFcn、sldemo_parsim_paramsweep_suspn_raccel_presim でコードを検証します。Simulink.BlockDiagram から modifyTunableParameters を使用して、車両の質量に対応するパラメーターを変更します。PreSimFcn への最初の引数は常に SimulationInput オブジェクトであり、Simulink® によって関数に渡されます。PreSimFunction は別のモデル パラメーターを SimulationInput オブジェクトに追加し、シミュレーションで使用するためにそれを返します。

Parsim を使ったシミュレーションの並列実行

関数 parsim を使用してシミュレーションを並列実行します。最後の手順で作成された SimulationInput オブジェクトの配列 in は、最初の引数として関数 parsim に渡されます。parsim コマンドからの出力は、変数 out に保存される Simulink.SimulationOutput オブジェクトの配列です。'ShowProgress' オプションを 'on' に設定し、シミュレーションの進行状況を MATLAB コマンド ウィンドウに出力します。前述のとおり、SetupFcn はパラメーターとして parsim コマンドに渡され、必要に応じてラピッド アクセラレータ ターゲットをワーカー上に作成します。

out = parsim(in, 'ShowProgress', 'on', ...
    'SetupFcn', @() sldemo_parsim_paramsweep_suspn_raccel_setup(mdl));
[15-Aug-2023 11:58:44] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.
[15-Aug-2023 11:59:57] Starting Simulink on parallel workers...
Analyzing and transferring files to the workers ...done.
[15-Aug-2023 12:00:50] Configuring simulation cache folder on parallel workers...
[15-Aug-2023 12:00:51] Running SetupFcn on parallel workers...
[15-Aug-2023 12:02:27] Loading model on parallel workers...
[15-Aug-2023 12:02:36] Running simulations...
[15-Aug-2023 12:03:20] Completed 1 of 10 simulation runs
[15-Aug-2023 12:03:20] Completed 2 of 10 simulation runs
[15-Aug-2023 12:03:20] Completed 3 of 10 simulation runs
[15-Aug-2023 12:03:20] Completed 4 of 10 simulation runs
[15-Aug-2023 12:03:20] Completed 5 of 10 simulation runs
[15-Aug-2023 12:03:20] Completed 6 of 10 simulation runs
[15-Aug-2023 12:03:44] Completed 7 of 10 simulation runs
[15-Aug-2023 12:03:44] Completed 8 of 10 simulation runs
[15-Aug-2023 12:03:44] Completed 9 of 10 simulation runs
[15-Aug-2023 12:03:44] Completed 10 of 10 simulation runs
[15-Aug-2023 12:03:44] Cleaning up parallel workers...

各 SimulationOutput オブジェクトには、ログ信号に加え、SimulationMetadata が含まれています。parsim を使用して複数のシミュレーションを実行すると、後続のシミュレーションを継続して実行できるようにエラーがキャプチャされます。エラーがあれば SimulationOutput オブジェクトの ErrorMessage プロパティに表示されます。

結果のプロット

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

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

参考

| |

関連するトピック