Main Content

並列計算を使用した周波数応答推定の高速化

この例では、並行計算を使用して Simulink® モデルの周波数応答推定を高速化する方法を説明します。一部のシナリオでは、関数 frestimate は、複数の Simulink シミュレーションを実行することで Simulink モデルの周波数応答を推定します。これらのシミュレーションを、Parallel Computing Toolbox™ ソフトウェアを使用して MATLAB® ワーカーのプールに分配することができます。

この例では、Parallel Computing Toolbox ソフトウェアが必要です。オプションで MATLAB Parallel Server™ ソフトウェアを使用して、コンピューター クラスター上でシミュレーションを実行することもできます。この例では、Parallel Computing Toolbox ソフトウェアで使用できるローカル ワーカーの機能を使用します。

frestimate で実行される Simulink シミュレーションの高速化

関数 frestimate を使用して周波数応答を計算する場合、計算時間のほとんどは通常、Simulink シミュレーションに費やされます。シミュレーションの合計時間を短縮するには、次のようにします。

  1. ラピッド アクセラレータ モードを使用する。この方法は frestimate で Simulink シミュレーションを 1 つだけ実行するときに使用します。例については、コマンド ラインを使用した周波数領域における線形化の検証を参照してください。

  2. MATLAB プールのワーカーにシミュレーションを分配する。この方法は、frestimate が複数の Simulink シミュレーションを実行するときに使用します。frestimate は、以下が指定されていると複数の Simulink シミュレーションを実行します。

  • SimulationOrder パラメーターが 'OneAtATime' に設定されている sinestream 入力信号。この場合、sinestream 信号の各周波数は別々にシミュレートされます。

  • 複数の入力ポイントあるいは 1 つの非スカラー入力ポイントをもつ線形解析ポイント。この場合、各線形化入力ポイントまたは非スカラー線形化入力ポイントの各チャネルで、個別の Simulink シミュレーションが行われます。

並列計算での関数 frestimate の使用は、ノーマル モード、アクセラレータ モード、およびラピッド アクセラレータ モードもサポートします。

MATLAB プールの構成

並行計算を使用して周波数応答の推定を高速化するには、関数 frestimate コマンドを実行する前に MATLAB ワーカーのプールを構成して起動します。

MATLAB プールが開いているかどうかをチェックするには、関数 gcp を使用します。開いているプールがない場合は、関数 parpool を使用して開きます。

if isempty(gcp)
   parpool local
end

sinestream の入力における各周波数の Simulink シミュレーションの分配

関数 frestimate で sinestream の入力信号を使用し、SimulationOrder パラメーターを 'OneAtATime' に設定すると、sinestream 信号の各周波数は別個の Simulink シミュレーションでシミュレートされます。並行計算オプションを有効にすると、個々の周波数に対応するシミュレーションが MATLAB プールのワーカー間で配布されます。

モデルを開き、モデルに保存されている線形解析ポイントを取得します。

mdl = 'scdengine';
open_system(mdl)
io = getlinio(mdl);

sinestream の入力信号を 'OneAtATime' のシミュレーション順で作成します。

in = frest.Sinestream('Frequency',logspace(-1,1,50),'Amplitude',1e-3,...
    'SimulationOrder','OneAtATime');

このモデルには、単一の線形化入力ポイントと単一の線形化出力ポイントがあります。sinestream 信号には 50 の周波数があります。SimulationOrder パラメーターが 'OneAtATime' に設定されているため、frestimate コマンドは 50 の別個の Simulink シミュレーションを実行します。

これらのシミュレーションをワーカー間に分配するには、frestimate で並列計算を有効にします。frestimateOptions オブジェクトを作成して、UseParallel オプションを 'on' に設定します。このオブジェクトを frestimate の入力引数として使用します。

opt = frestimateOptions('UseParallel','on');
sysest = frestimate(mdl,io,in,opt);
bode(sysest,'r*')

一般に、frestimate を使用した周波数応答の推定は、並列計算によって著しく高速化されます。実際の処理時間と改善の程度は、使用しているコンピューターの設定と Parallel Computing Toolbox の構成によって決まります。たとえば、改善の程度は、クライアントからワーカーへのデータ転送オーバーヘッドや、ワーカー プロセスと OS プロセス間のリソース競合など、さまざまな要因の影響を受ける可能性があります。

モデルを閉じます。

bdclose(mdl)

入力チャネルの Simulink シミュレーションの分配

線形化入力ポイントの数または線形化入力ポイントのチャネル数が複数の場合、frestimate コマンドは、これらの入力チャネルに対応する個々の Simulink シミュレーションを MATLAB プールのワーカー間に分配します。

モデルを開き、モデルに保存されている線形解析ポイントを取得します。

mdl = 'scdplane';
open_system(mdl)

io(1) = linio('scdplane/Sum1',1,'input');
io(2) = linio('scdplane/Actuator Model',1,'input');
io(3) = linio('scdplane/Gain5',1,'output');

関数 linio を使って、2 つの線形化入力ポイントを指定します。これはどちらもスカラーの Simulink 信号上にあります。frestimate コマンドを実行してこのモデルの周波数応答を推定すると、2 つの Simulink シミュレーションが各入力に対し 1 つずつ実行されます。

モデルを線形化し、線形化の結果を使用して入力信号を作成します。

sys = linearize(mdl,io);
in = frest.Sinestream(sys);

周波数応答を推定する前に、関数 findSources を使用して、線形化出力の信号パスで時変信号を生成するすべてのソース ブロックを検出します。このような時変信号は、線形化出力ポイントでの信号を妨げ、推定結果が不正確になる可能性があります。時変ソース ブロックを無効にするには、frestimateOptions オプション セットを作成して BlocksToHoldConstant オプションを指定します。

srcblks = frest.findSources('scdplane',io);
opt = frestimateOptions('BlocksToHoldConstant',srcblks);

ワーカー間にシミュレーションを分配する UseParallel 推定オプションを使用して、並列計算を有効にします。

opt.UseParallel = 'on';

並列計算を使用して frestimate を実行します。

sysest = frestimate(mdl,io,in,opt);

解析的な線形化に対して推定結果をプロットします。

bodeopts = bodeoptions;
bodeopts.PhaseMatching = 'on';
bodeplot(sys,sysest,'r*',bodeopts);

モデル、開いている Figure、および並列プールを閉じます。

bdclose(mdl)
close(gcf)
delete(gcp)

参考

| | (Parallel Computing Toolbox) | (Parallel Computing Toolbox)

関連するトピック