最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
この例では、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 を開き、コードを検証します。ビルド ファイルが既に存在していてモデルおよびマシン アーキテクチャに対応している場合は、早く返されるようにビルド プロセスが最適化されていることに注意してください。
ベース ワークスペースで変数 Mb_sweep
にスイープ値を保存します。
Mb_sweep = Mb*(0.5:5:45.5);
実行するシミュレーション回数を決定します。これは、スイープ値の数と同じです。この数を変数 numSims
に保存します。
numSims = length(Mb_sweep);
for
ループを使用して、次を行います。
モデルの Simulink.SimulationInput オブジェクトを作成します。シミュレーションにつき 1 つのオブジェクトを作成します。オブジェクトを配列として変数 in
に保存します。
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 を使用してシミュレーションを並列実行します。最後の手順で作成された 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));
[13-Dec-2018 12:26:56] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). [13-Dec-2018 12:28:03] Starting Simulink on parallel workers... Analyzing and transferring files to the workers ...done. [13-Dec-2018 12:28:03] Configuring simulation cache folder on parallel workers... [13-Dec-2018 12:28:04] Running SetupFcn on parallel workers... [13-Dec-2018 12:29:02] Loading model on parallel workers... [13-Dec-2018 12:29:06] Running simulations... [13-Dec-2018 12:29:13] Completed 1 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 2 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 3 of 10 simulation runs [13-Dec-2018 12:29:14] Completed 4 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 5 of 10 simulation runs [13-Dec-2018 12:29:15] Completed 6 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 7 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 8 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 9 of 10 simulation runs [13-Dec-2018 12:29:17] Completed 10 of 10 simulation runs [13-Dec-2018 12:29:17] 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');
最後に、並列プールとモデルを閉じます (まだ閉じられていない場合)。
if(~isModelOpen) close_system(mdl, 0); end delete(gcp('nocreate'));
Parallel pool using the 'local' profile is shutting down.