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

Parsim を使ったラピッド アクセラレータ シミュレーション

この例では、入力値とパラメーター値の範囲で並列シミュレーションの実行を必要とするアプリケーションでラピッド アクセラレータを使用する方法を示します。

エンジンのアイドル回転数のモデルを使用して、エンジンのアイドル回転数をシミュレーションします。このモデルの入力はバイパス エア バルブの電圧、出力はアイドル回転数です。

2 セットのバルブ電圧とともに parsim を使用し、2 つの値の範囲で伝達関数の 3 つのゲイン パラメーターのうち 2 つを独立して変化させることによって、並列シミュレーションを実行します。次の表に、実行する 8 つのシミュレーションをパラメーター値と共に示します。inpSets はこの後の手順 2 で作成する外部入力で、gain2gain3 は 2 つのゲイン パラメーターに対応する変数です。

実行ExternalInputgain2gain3
1inpSets(1)2520
2inpSets(1)2530
3inpSets(1)3520
4inpSets(1)3530
5inpSets(2)2520
6inpSets(2)2530
7inpSets(2)3520
8inpSets(2)3530

この例の作成に使用されたスクリプト ファイルを変更することにより、この例を簡単に独自のアプリケーション用にカスタマイズできます。スクリプト ファイルを編集するには、このページの左上隅のリンクをクリックします。MATLAB® からこの例を実行するには、右上隅のリンクをクリックしてください。

手順 1: 準備

まず、シミュレーション モードがラピッド アクセラレータに設定されているモデルを開きます。既定の入力データと必須パラメーターは、ベース ワークスペースに事前に読み込まれています。

次のようにしてモデルを開きます。

mdl = 'sldemo_raccel_engine_idle_speed';
open_system(mdl);

手順 2: 入力セットの作成

ここでは、既定の入力値ベクトルに摂動を与え、新しい入力値ベクトルを取得します。

inpSets(1) = timeseries(inpData, time);
rndPertb = 0.5 + rand(length(time), 1);
inpSets(2) = timeseries(inpData.*rndPertb, time);
numInpSets  = length(inpSets);

手順 3: パラメーター セットの作成

パラメーター gain2 および gain3 のさまざまな値に対してアイドル回転数がどのように変化するか調べます。Simulink.SimulationInput オブジェクトの配列を作成し、各シミュレーションに異なるパラメーター値と外部入力を指定します。SimulationInput オブジェクトの配列は、パフォーマンスを改善するために事前割り当てされます。また、外部入力は、モデル パラメーターを使用するのではなく、SimulationInput オブジェクトに直接指定できる点に注目してください。

gain2_vals = 25:10:35;
gain3_vals = 20:10:30;

num_gain2_vals = length(gain2_vals);
num_gain3_vals = length(gain3_vals);

numSims = num_gain2_vals*num_gain3_vals*numInpSets;
in(1:numSims) = Simulink.SimulationInput(mdl);

idx = 1;
for iG2 = 1:num_gain2_vals
    for iG3 = 1:num_gain3_vals
        for inpSetsIdx = 1:numInpSets
            in(idx) = in(idx).setModelParameter('SimulationMode', 'rapid', ...
                'RapidAcceleratorUpToDateCheck', 'off', ...
                'SaveTime', 'on', ...
                'SaveOutput', 'on');
            % Use setVariable to specify a new value for a variable during
            % simulations
            in(idx) = in(idx).setVariable('gain2', gain2_vals(iG2));
            in(idx) = in(idx).setVariable('gain3', gain3_vals(iG3));
            in(idx).ExternalInput = inpSets(inpSetsIdx);
            idx = idx + 1;
        end
    end
end

ラピッド アクセラレータ モードでシミュレーションを実行してログを有効にするように、SimulationInput オブジェクトの setModelParameter メソッドを使用してモデル パラメーターの設定も行っている点に注目してください。ラピッド アクセラレータ ターゲットのビルドには SetupFcn を使用しています。ラピッド アクセラレータ ターゲットを 1 回ビルドし、モデルのコンパイルにかかる時間を短縮するために以降のすべてのシミュレーションで使用します。SetupFcn のコードは次のとおりです。

function sldemo_parallel_rapid_accel_sims_script_setup(mdl)
    % Temporarily change the current folder on the workers to an empty
    % folder so that any existing slprj folder on the client does not
    % interfere in the build process.
    currentFolder = pwd;
    tempDir = tempname;
    mkdir(tempDir);
    cd (tempDir);
    oc = onCleanup(@() cd (currentFolder));
    Simulink.BlockDiagram.buildRapidAcceleratorTarget(mdl);
end

手順 4: シミュレーションの実行

関数 parsim を使用してシミュレーションを並列実行します。最後の手順で作成された SimulationInput オブジェクトの配列 in は、最初の引数として関数 parsim に渡されます。シミュレーション出力データを、値が Simulink.SimulationOutput オブジェクトの配列である変数 out に保存します。各 SimulationOutput オブジェクトには、ログ信号に加え、SimulationMetadata が含まれています。parsim を使用して複数のシミュレーションを実行すると、後続のシミュレーションを継続して実行できるようにエラーがキャプチャされます。エラーがあれば SimulationOutput オブジェクトの ErrorMessage プロパティに表示されます。

out = parsim(in, 'ShowProgress', 'on', ...
    'SetupFcn', @() sldemo_parallel_rapid_accel_sims_script_setup(mdl));
[16-Oct-2018 15:54:39] Checking for availability of parallel pool...
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).
[16-Oct-2018 15:55:37] Starting Simulink on parallel workers...
Analyzing and transferring files to the workers ...done.
[16-Oct-2018 15:55:38] Configuring simulation cache folder on parallel workers...
[16-Oct-2018 15:55:38] Running SetupFcn on parallel workers...
[16-Oct-2018 15:56:28] Loading model on parallel workers...
[16-Oct-2018 15:56:29] Running simulations...
[16-Oct-2018 15:56:34] Completed 1 of 8 simulation runs
[16-Oct-2018 15:56:34] Completed 2 of 8 simulation runs
[16-Oct-2018 15:56:34] Completed 3 of 8 simulation runs
[16-Oct-2018 15:56:34] Completed 4 of 8 simulation runs
[16-Oct-2018 15:56:34] Completed 5 of 8 simulation runs
[16-Oct-2018 15:56:34] Completed 6 of 8 simulation runs
[16-Oct-2018 15:56:38] Completed 7 of 8 simulation runs
[16-Oct-2018 15:56:38] Completed 8 of 8 simulation runs
[16-Oct-2018 15:56:38] Cleaning up parallel workers...

手順 5: 結果のプロット

さまざまなパラメーター値と入力で、時間に対するエンジンのアイドル回転数をプロットします。出力は配列形式に記録され、SimulationOuput オブジェクトからアクセスできます。

for i = 1:numSims
    simOut = out(i);
    t = simOut.tout;
    y = simOut.yout;
    plot(t, y)
    hold all
end

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

delete(gcp('nocreate'))
Parallel pool using the 'local' profile is shutting down.