Simulink Control Design

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

ブロックのバリアントをもつモデルの複数の線形化をより効率的に計算

この例では、コマンド LINLFT を使用して、Simulink モデルのクラスの線形化を高速化する方法を説明します。ここでは、一連のブロック パラメーターが複数の線形化で変化します。

はじめに

この例では、コマンド LINLFT を使用して、Simulink モデルのクラスの線形化を高速化する方法を説明します。ここでは、一連のブロック パラメーターが複数の線形化で変化します。パラメーターは、FOR または数値最適化ループ内のいずれかで変化します。この方法は、多数のブロックの線形化が変化する大きなモデルに最も適切に機能します。全体的な線形化時間が最も改善するのは、モデルの更新時間が長いモデルの場合です。この例を実行するには、Aerospace Blockset が必要です。

LINEARIZE を使用した完全な Simulink モデルの線形化 (20 回)

この例では、高度およびピッチ コントローラーのゲインを +/- 10% ずつ変化させながら、軽量飛行機のモデルを線形化します。軽量飛行機の Simulink モデルを開きます。このモデルの詳細は、Aerospace Blockset の例にある「軽量飛行機の設計」を参照してください。

mdl = 'scdskyhogg';
open_system(mdl);
io = getlinio(mdl);
op = operpoint(mdl);

MATLAB ワークスペース パラメーター k1 および k2 を使用して変化させるコントローラーのゲインを初期化します。

open_system('scdskyhogg/Vehicle System Model/Avionics/Autopilot')
blks = {'scdskyhogg/Vehicle System Model/Avionics/Autopilot/Alt Controller';...
        'scdskyhogg/Vehicle System Model/Avionics/Autopilot/Theta Controller'};
set_param(blks{1},'Gain','0.0337283240400683*k1')
set_param(blks{2},'Gain','-261.8699347622*k2')

20 回の線形化を計算します。

t = cputime;
for ct = 20:-1:1
    k1 = 1+(ct-10)/100;
    k2 = 1+(ct-10)/100;
    sys_full(:,:,ct) = linearize(mdl,op,io);
end

合計時間を表示して、20 回の線形化を秒数で計算します。

dt_full = cputime - t
dt_full =

   38.2514

この時間に影響を与えるファクターは、ブロックのマスクをコンパイルして評価し、ワークスペース パラメーターを解決するのに要する合計時間です。MATLAB プロファイラーは、このコンパイル処理のボトルネックの同定に使用できる推奨ツールです。

LINLFT を使用した Simulink モデルの線形化 (20 回)

このモデルでは、変化するコントローラー ブロックは 2 つだけです。コマンド LINLFT を使用すると、コントローラー ブロックが削除されている Simulink モデルを線形化できます。モデルのこの部分を 1 回線形化する必要があります。

t = cputime;
sys_fixed = linlft(mdl,io,blks);
k1_0 = 0.0337283240400683;
k2_0 = -261.8699347622;
Alt = zpk([0.998853192323097;0.977076159863424],...
             [1;0.920841826994512],k1_0,1/60);
Theta = zpk(0.999268009521977,1,k2_0,1/60);
BlockSubs(1) = struct('Name',blks{1},...
                    'Value', Alt);
BlockSubs(2) = struct('Name',blks{2},...
                    'Value', Theta);

コマンド LINLFTFOLD を使用して、変化したブロック線形化を結合できます。20回 の線形化を計算します。

for ct = 20:-1:1
    % Specify new values for the blocks
    BlockSubs(1).Value.k = k1_0*(1+(ct-10)/100);
    BlockSubs(2).Value.k = k2_0*(1+(ct-10)/100);
    sys_by_parts(:,:,ct) = linlftfold(sys_fixed,BlockSubs);
end

合計時間を表示し、LINLFT コマンドを使用して 20 回の線形化を秒数で計算します。

dt_by_parts = cputime - t
dt_by_parts =

    4.9452

結果の比較

この例では、コントローラーのゲインは、Simulink モデルの操作点に対して何の影響も与えません。両方の方法を使用した線形化は等価です。

bode(sys_full(:,:,1),sys_by_parts(:,:,1))
legend('Linearization of Full Model','Linearization using LINLFT')

結果の時間改善比を計算します。

ratio = dt_full/dt_by_parts
ratio =

    7.7350

Simulink モデルを閉じます。

bdclose(mdl);