このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
並列計算を使用した周波数応答推定の高速化
この例では、並行計算を使用して Simulink® モデルの周波数応答推定を高速化する方法を説明します。一部のシナリオでは、関数 frestimate
は、複数の Simulink シミュレーションを実行することで Simulink モデルの周波数応答を推定します。これらのシミュレーションを、Parallel Computing Toolbox™ ソフトウェアを使用して MATLAB® ワーカーのプールに分配することができます。
この例では、Parallel Computing Toolbox ソフトウェアが必要です。オプションで MATLAB Parallel Server™ ソフトウェアを使用して、コンピューター クラスター上でシミュレーションを実行することもできます。この例では、Parallel Computing Toolbox ソフトウェアで使用できるローカル ワーカーの機能を使用します。
frestimate
で実行される Simulink シミュレーションの高速化
関数 frestimate
を使用して周波数応答を計算する場合、計算時間のほとんどは通常、Simulink シミュレーションに費やされます。シミュレーションの合計時間を短縮するには、次のようにします。
ラピッド アクセラレータ モードを使用する。この方法は
frestimate
で Simulink シミュレーションを 1 つだけ実行するときに使用します。例については、コマンド ラインを使用した周波数領域における線形化の検証を参照してください。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)
参考
frestimate
| frestimateOptions
| parpool
(Parallel Computing Toolbox) | gcp
(Parallel Computing Toolbox)