ドキュメンテーション

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

LTI システムの配列を使用した非線形動作の近似

この例では、システムの非線形動作を、相互接続された LTI モデルの配列として近似する方法を説明します。

この例では、操作条件の範囲における機体のピッチ軸のダイナミクスの線形近似について説明します。これにより取得された線形システムの配列は、ダイナミクスの線形パラメーター変動 (LPV) 表現の作成に使用されます。LPV モデルは、非線形ピッチ ダイナミクスの近似として機能します。

線形パラメーター変動 (LPV) モデルについて

多くの場合、システムの非線形ダイナミクスは、単純な線形システムを使用して近似する必要があります。単一の線形システムを使用すると、非線形システムの操作点の小範囲の近傍に限定された動作の適切なモデルが得られます。非線形動作を操作条件の範囲で近似する必要がある場合、適切な内挿ルールで相互接続された線形モデルの配列を使用できます。そのようなモデルを LPV モデルといいます。

LPV モデルを生成するには、操作点のグリッド上で非線形モデルを平衡化および線形化します。そのためには、動作空間を少数の "スケジューリング パラメーター" でパラメーター化します。これらのパラメーターは、多くの場合、非線形システムの入力、状態および出力変数のサブセットです。LPV モデルの作成において考慮すべき重要なポイントとして、スケジューリング パラメーター セットを特定し、モデルを線形化するパラメーター値の範囲を選択することがあげられます。

このアプローチを使用して、機体のピッチ ダイナミクスを近似する方法を説明します。

機体のピッチ ダイナミクス

機体のピッチ軸ダイナミクスの 3 自由度のモデルについて考えます。状態には、地球座標 、機体座標 、ピッチ角度 、ピッチ レート があります。図 1 では、慣性座標系および機体フレーム、飛行経路の角度 、入射角 、ピッチ角 の関係をまとめています。

図 1: 機体のダイナミクス

機体のダイナミクスは非線形であり、空力は速度 に、モーメントは入射角 に依存します。モデル scdairframeTRIM は、これらのダイナミクスを示しています。

open_system('scdairframeTRIM')

飛行エンベロープ内のバッチ線形化

速度 および入射角 をスケジューリング パラメーターに使用します。つまり、 値と 値のグリッド上で機体モデルを平衡化します。これらは、scdairframeTRIM モデルの 5 つの出力の中の 2 つであることに注意してください。

入射角 は -20 ~ 20 度の範囲で変動し、速度 は 700 ~ 1400 m/s の範囲で変動すると仮定します。スケジューリングに、線形に等間隔な ペアの 15 行 12 列のグリッドを使用します。

nA = 15;   % number of alpha values
nV = 12;   % number of V values
alphaRange = linspace(-20,20,nA)*pi/180;
VRange = linspace(700,1400,nV);
[alpha,V] = ndgrid(alphaRange, VRange);

各飛行条件 に対して、平衡点における機体のダイナミクスを線形化します (法線加速度およびピッチのモーメントを 0 にします)。そのためには、 および が定常値となる昇降舵の偏差 およびピッチ レート を計算する必要があります。

operspec を使用して平衡化条件を指定し、findop を使用して および の平衡値を計算して、その結果得られた操作点での機体のダイナミクスを線形化します。詳細は、「機体の平衡化と線形化」の例を参照してください。

機体座標 は、平衡化のための既知の状態です。したがって、これらに適切な値を指定しなければなりません。値は明示的に指定できます。しかし、この例では、モデルが の各ペアに基づいてこれらの既知の値を求めます。各飛行条件 につき、モデル内の値を更新して操作点の仕様を作成します。以上の手順を、180 の飛行条件すべてについて繰り返します。

clear op report
for ct = 1:nA*nV
   alpha_ini = alpha(ct);      % Incidence [rad]
   v_ini = V(ct);              % Speed [m/s]

   % Specify trim condition
   opspec(ct) = operspec('scdairframeTRIM');

   % Xe,Ze: known, not steady.
   opspec(ct).States(1).Known = [1;1];
   opspec(ct).States(1).SteadyState = [0;0];

   % u,w: known, w steady
   opspec(ct).States(3).Known = [1 1];
   opspec(ct).States(3).SteadyState = [0 1];

   % theta: known, not steady
   opspec(ct).States(2).Known = 1;
   opspec(ct).States(2).SteadyState = 0;

   % q: unknown, steady
   opspec(ct).States(4).Known = 0;
   opspec(ct).States(4).SteadyState = 1;

end
opspec = reshape(opspec, [nA nV]);

指定されたすべての操作点仕様でモデルを平衡化します。

Options = findopOptions('DisplayReport','off', ...
	'OptimizerType','lsqnonlin');
Options.OptimizationOptions.Algorithm = 'trust-region-reflective';
[op, report] = findop('scdairframeTRIM',opspec,Options);

配列 op には、線形化に使用される findop で検出された操作点が含まれます。配列 report には、それぞれの点における入力、出力および状態値の記録が含まれます。

線形化の入力および出力を指定します。

io = [linio('scdairframeTRIM/delta',1,'in');...        % delta
   linio('scdairframeTRIM/Airframe Model',1,'out');... % alpha
   linio('scdairframeTRIM/Airframe Model',2,'out');... % V
   linio('scdairframeTRIM/Airframe Model',3,'out');... % q
   linio('scdairframeTRIM/Airframe Model',4,'out');... % az
   linio('scdairframeTRIM/Airframe Model',5,'out')];   % gamma

これらの平衡化条件でモデルをバッチ線形化します。線形化のオフセット情報を構造体 info に保存します。

[G,~,info] = linearize('scdairframeTRIM',op,io, ...
	linearizeOptions('StoreOffsets',true));
G = reshape(G,[nA nV]);
G.u = 'delta';
G.y = {'alpha','V','q','az','gamma'};
G.SamplingGrid = struct('alpha',alpha,'V',V);

G は、180 の飛行条件 における線形化されたプラント モデルの 15 行 12 列の配列です。プラントのダイナミクスは、ローカル ダイナミクスが不安定となるスケジューリングの位置を含め、飛行エンベロープ内で大きく変動します。

bodemag(G(3:5,:,:,:))
title('Variations in airframe dynamics')

LPV System ブロック

Control System Toolbox™ ブロック ライブラリの LPV System ブロックを使用すると、線形パラメーター変動システムのシミュレーションを容易に実行できます。ブロックで必要なプライマリ データは、バッチ線形化で生成された状態空間システム配列 G です。構造体 info からの入力/出力、状態および状態微分オフセットに関する情報を使用してこれを拡張します。

オフセット情報を抽出します。

offsets = getOffsetsForLPV(info);
xOffset = offsets.x;
yOffset = offsets.y;
uOffset = offsets.u;
dxOffset = offsets.dx;

LPV モデルのシミュレーション

線形システム配列 G およびさまざまなオフセットに基づいて構成された LPV System ブロックが含まれるシステム scdairframeLPV を開きます。

open_system('scdairframeLPV')

入力信号は、目的の機体の軌跡に基づいて準備されています。この信号 u と対応する時間ベクトル t は、scdairframeLPVsimdata.mat ファイルに保存されています。シミュレーションの初期条件を指定します。

alpha_ini = 0;
v_ini = 700;
x0 = [0; 700; 0; 0];
sim('scdairframeLPV')

このシミュレーションでは、LPV システムによる機体の応答の最適なエミュレーションが示されます。ここでは、大量 (180) の線形モデルが導出される、最適なスケジューリング空間のグリッドを選択しました。配列のサイズが大きくなると、実装コストが増加します。一方で、LPV 表現には、以下に基づいてスケジューリング グリッド (さらには、配列の線形システムの個数) を調整できるという利点があります。

  • 予測された軌跡の範囲内にあるスケジューリング部分空間

  • アプリケーション内で望まれる精度レベル

前の情報は、スケジューリング変数の範囲の削減に役立ちます。後の情報は、スケジューリング空間のサンプルの最適な分解能 (間隔) の選択に役立ちます。

グリッド化されたスケジューリング空間の背景に対して、前のシミュレーションのスケジューリング変数の実際の軌跡をプロットしてみましょう。 出力はそのスコープを通してログに記録されています (scdairframeLPV の Compare Responses ブロック内に含まれます)。

Stable = false(nA,nV);
for ct = 1:nA*nV
   Stable(ct ) = isstable(G(:,:,ct));
end
alpha_trajectory = Alpha_V_Data.signals(1).values(:,1);
V_trajectory = Alpha_V_Data.signals(2).values(:,1);

plot(alpha(Stable)*180/pi,V(Stable),'g.',...
   alpha(~Stable)*180/pi,V(~Stable),'k.',...
   alpha_trajectory,V_trajectory,'r.')
title('Trajectory of scheduling variables')
xlabel('\alpha'); ylabel('V')
legend('Stable locations','Unstable locations','Actual trajectory')

シミュレーション中に追跡された軌跡は、赤で表示されます。これにより、スケジューリング空間の安定および不安定な領域を調べます。最小限のメモリを使用して、前述のシミュレーションで使用されたものと同様の入力プロファイルのターゲット ハードウェア上でこのモデルを実装する必要があるとします。このシミュレーションからは、速度の軌跡が主に 890 ~ 1200 m/s、入射角が主に -15 ~ 12 度の範囲にあることがわかります。さらに、サンプリング点の間隔を拡大して検証することもできます。 次元に沿って 2 つおきのサンプルと、 次元に沿って 1 つおきのサンプルのみを使用するとします。これらの制約を満たす低次元化されたシステム配列は、次のように G から抽出できます。

I1 = find(alphaRange>=-15*pi/180 & alphaRange<=12*pi/180);
I2 = find(VRange>=890 & VRange<=1200);
I1 = I1(1:2:end);
I2 = I2(1:3:end);

Gr = G(:,:,I1,I2);
size(Gr)
5x2 array of state-space models.
Each model has 5 outputs, 1 inputs, and 4 states.

新しいサンプリング グリッド Gr は、5 行 2 列のよりコンパクトなサイズになります。低次元化されたモデルのシミュレーションを実行し、元の動作を再現する際の忠実度を確認します。

モデルを再コンパイルする必要があるので、書き込み可能なディレクトリに移動します。

cwd = pwd;
cd(tempdir)
lpvblk = 'scdairframeLPV/LPV System';
set_param(lpvblk,...
   'sys','Gr',...
   'uOffset','uOffset(:,:,I1,I2)',...
   'yOffset','yOffset(:,:,I1,I2)',...
   'xOffset','xOffset(:,:,I1,I2)',...
   'dxOffset','dxOffset(:,:,I1,I2)')
sim('scdairframeLPV')
cd(cwd)

元のモデルの応答とその LPV プロキシとの間のオーバーラップで大きな削減はありません。

LPV モデルは、高速なシミュレーションが必要な状況で、元のシステムの代わりとして機能できます。LPV モデルで使用された線形システムは、システム同定の手法により取得することもできます (配列内で状態の一貫性を維持するには、一層の注意が必要です)。LPV モデルは、Simulink Design Optimization の問題を初期化し、高速なハードウェアインザループのシミュレーションを実行するための代理として最適です。

この情報は役に立ちましたか?