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 つの自由度ごとに車両の動きを計算します。

このモンテカルロ法では、車両運動に対するフロント サスペンション係数の影響を検査します。複数のシミュレーションを、それぞれ異なる係数値で実行します。

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

モデルで、Road-Suspension Interaction ブロックをダブルクリックします。マスク ダイアログ ボックスが開きます。マスク パラメーターの [Front susp. damping] に減衰係数の値 150 を設定します。

Body Dynamics ブロックでは、Vertical disp 出力端子から出る信号を見つけます。この信号が表す時間経過に沿った車両の垂直変位は、サスペンション減衰係数の影響を受けます。

信号を右クリックし、[プロパティ] を選択します。

[信号プロパティ] ダイアログ ボックスの、[ログとユーザー補助機能] タブでは [信号データのログ] チェック ボックスがオンになっており、信号がログ作成用に構成されていることを示します。シミュレーションの終了後、指定したログ名 vertical_disp を使用して信号を特定し、SimulationOutput オブジェクトからシミュレーション出力データを取得できます。

パラメーター入力の準備

スイープ値は、5% から 95% まで 10% ずつインクリメントする設計値のパーセントの係数として計算します。ベース ワークスペースで変数 Cf_sweep に値を保存します。

Cf_sweep = Cf*(0.05:0.1:0.95);

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

numSims = length(Cf_sweep);

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

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

  2. 各シミュレーションのスイープ値を指定します。基となる名前 Cf でターゲット マスク パラメーターを特定します。

for i = numSims:-1:1
    in(i) = Simulink.SimulationInput(mdl);
    in(i) = setBlockParameter(in(i), [mdl '/Road-Suspension Interaction'], 'Cf', num2str(Cf_sweep(i)));
end

ブロック パラメーターを SimulationInput オブジェクトに指定しても、直ちにモデルに適用されるわけではないことに注意してください。指定した値はシミュレーション中に適用され、シミュレーションの終了後、可能な場合は元の値に戻されます。

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

関数 parsim を使用してシミュレーションを並列実行します。最後の手順で作成された SimulationInput オブジェクトの配列 in は、最初の引数として関数 parsim に渡されます。parsim コマンドからの出力は、変数 out に保存される Simulink.SimulationOutput オブジェクトの配列です。'ShowProgress' オプションを 'on' に設定し、シミュレーションの進行状況を MATLAB コマンド ウィンドウに出力します。

out = parsim(in, 'ShowProgress', 'on');
[20-Feb-2021 23:49:38] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[20-Feb-2021 23:50:23] Starting Simulink on parallel workers...
[20-Feb-2021 23:51:11] Configuring simulation cache folder on parallel workers...
[20-Feb-2021 23:51:13] Loading model on parallel workers...
[20-Feb-2021 23:51:18] Running simulations...
[20-Feb-2021 23:51:31] Completed 1 of 10 simulation runs
[20-Feb-2021 23:51:31] Completed 2 of 10 simulation runs
[20-Feb-2021 23:51:31] Completed 3 of 10 simulation runs
[20-Feb-2021 23:51:31] Completed 4 of 10 simulation runs
[20-Feb-2021 23:51:31] Completed 5 of 10 simulation runs
[20-Feb-2021 23:51:31] Completed 6 of 10 simulation runs
[20-Feb-2021 23:51:33] Completed 7 of 10 simulation runs
[20-Feb-2021 23:51:33] Completed 8 of 10 simulation runs
[20-Feb-2021 23:51:33] Completed 9 of 10 simulation runs
[20-Feb-2021 23:51:34] Completed 10 of 10 simulation runs
[20-Feb-2021 23:51:34] Cleaning up parallel workers...

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

結果のプロット

さまざまなシミュレーションから車両の垂直変位をプロットして、減衰係数の変化が車両運動にどのように影響するかを確認します。信号は SimulationOutput オブジェクトに Dataset 形式で記録されます。get メソッドを使用して、out の各要素からの時間と信号データが含まれる timeseries オブジェクトを取得します。

legend_labels = cell(1,numSims);

for i = numSims:-1:1
        simOut = out(i);
        ts = simOut.logsout.get('vertical_disp').Values;
        % 'ts' is a MATLAB 'timeseries' object that stores the time and
        % data values for the logged 'vertical_disp' signal.
        % Use the 'plot' method of the object to plot the data against the
        % time.
        plot(ts);
        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 'local' profile is shutting down.

参考

| |

関連するトピック