Main Content

パラメーターが変化する定常状態の操作点のバッチ計算

ブロック パラメーターはいくつかの方法で Simulink® モデルを構成します。たとえば、ブロック パラメーターを使用して、さまざまな係数またはコントローラーのサンプル時間を指定できます。Multiport Switch ブロックへの制御入力のように、離散パラメーターを使用してモデル内のデータ パスを制御することもできます。パラメーターの値を変化させることで、そのパラメーターによるモデルの動作への影響を理解するのに役立ちます。また、制御システム内でプラント モデルのパラメーターを変化させて、プラントの変化に対するコントローラーのロバスト性を調査できます。

findop を使用してモデルを平衡化する場合、モデル平衡化に使用される一連のパラメーター値を指定できます。値の完全なセットは、"パラメーター グリッド" または "パラメーター サンプル" と呼ばれます。findop は、パラメーター グリッドにある値の各組み合わせについて操作点を計算します。複数のパラメーターを変化させることで、パラメーター グリッドの次元を拡張できます。

サンプリング可能なパラメーター

モデル ワークスペース、MATLAB® ワークスペースあるいはデータ ディクショナリ内で変数によって値が与えられる、任意のモデル パラメーターを変化させることができます。変化させるパラメーターがすべて調整可能である場合、findop は、変化するパラメーター値に対して 1 回のモデル コンパイルのみで操作点を見つけることができます。この効率性は、繰り返しコンパイルすると計算量の多くなるモデルには特に有益です。

単一のパラメーターの変化

findop でバッチ平衡化用に単一のパラメーター値を変化させるには、パラメーター グリッドを 2 つのフィールドをもつ構造体として指定します。Name フィールドには、パラメーターを指定するワークスペース変数の名前が含まれます。Value フィールドには、平衡化中にそのパラメーターが取る値のベクトルが含まれます。

たとえば、Watertank モデルには、MATLAB ワークスペース変数として定義されている ab および A の 3 つのパラメーターがあります。次のコマンドでは、単一のパラメーター A のパラメーター グリッドを指定します。

param.Name = 'A';
param.Value = Avals;

ここで、AvalsA のサンプル値を指定する配列です。

次の表は、パラメーター サンプルを指定するいくつかの一般的な方法を挙げています。

パラメーター サンプルの間隔の種類パラメーター サンプルの指定方法
線形的に変化param.Value = linspace(A_min,A_max,num_samples)
対数的に変化param.Value = logspace(A_min,A_max,num_samples)
乱数param.Value = rand(1,num_samples)
カスタムparam.Value = custom_vector

モデルによって使用される変数がスカラー値でない場合は、スカラー数値に関連付けられた表現としてパラメーター名を指定します。たとえば、Kpid は PID ゲインのベクトルであるとします。ベクトルの 1 番目のエントリ Kpid は、モデル内のブロックでゲインの値として使用されます。次のコマンドを使用して、ベクトル Kpvals で与えられた値を使用するゲインを変化させます。

param.Name = 'Kpid(1)';
param.Value = Kpvals;

構造体 param を作成した後、これを findopparam 入力引数として渡します。

多次元パラメーター グリッド

一度に複数のパラメーターを変化させる場合は、より高次元のパラメーター グリッドを生成します。たとえば、2 つのパラメーターを変化させるとパラメーター行列が、3 つのパラメーターを変化させると 3 次元パラメーター グリッドが生成されます。バッチ平衡化に使用される次のパラメーター グリッドについて考えます。

ここでは、3 つのパラメーター a、b および c の値を変化させます。サンプルは 3 x 4 x 5 のグリッドを形成します。op は、対応する平衡化された操作点オブジェクトを含む、同じ次元をもつ配列です。

複数のパラメーターの変化

findop によるバッチ平衡化で複数のパラメーターの値を変化させるには、パラメーター サンプルを構造体配列として指定します。構造体には、値を変化させる各パラメーターのエントリがあります。各パラメーターの構造体は、単一のパラメーターの変化で説明されているものと同じです。パラメーターの Value フィールドには、任意の次元の配列を指定できます。ただし、Value フィールドのサイズはすべてのパラメーターで同じでなければなりません。すべてのパラメーターの対応する配列エントリは "パラメーター グリッド点" とも呼ばれ、指定されたパラメーターの組み合わせにマップされなければなりません。ソフトウェアはモデルの平衡化を行うときに、各グリッド点に対する操作点を計算します。

フル グリッドの指定

モデルに、値を変化させる 2 つのパラメーター a と b があるとします。

a={a1,a2}b={b1,b2}

a と b のそれぞれの組み合わせ ("フル グリッド" とも呼ばれる) でモデルを平衡化します。

{(a1,b1),(a1,b2)(a2,b1),(a2,b2)}

ndgrid を使用して方形のパラメーター グリッドを作成します。

a1 = 1;
a2 = 2;
a = [a1 a2];

b1 = 3;
b2 = 4;
b = [b1 b2];

[A,B] = ndgrid(a,b)
>> A

A =

     1     1
     2     2

>> B

B =

     3     4
     3     4

パラメーター グリッドを指定する構造体配列 params を作成します。

params(1).Name = 'a';
params(1).Value = A;

params(2).Name = 'b';
params(2).Value = B;

一般的に、N パラメーターのフル グリッドを指定するには、ndgrid を使用して N グリッド配列を取得します。

[P1,...,PN] = ndgrid(p1,...,pN);

ここで、p1,...,pN はパラメーター サンプル ベクトルです。

1 行 N 列の構造体配列を作成します。

params(1).Name = 'p1';
params(1).Value = P1;
...
params(N).Name = 'pN';
params(N).Value = PN;

フル グリッドのサブセットの指定

モデルが複素数の場合、あるいは多数のパラメーター値を変化させる場合、フル グリッドのモデルを平衡化すると計算量が多くなる場合があります。この場合、表のようなアプローチを使用してフル グリッドのサブセットを指定できます。フル グリッドの指定の例を使用して、次の a と b の組み合わせでモデルを平衡化するとします。

{(a1,b1),(a1,b2)}

このパラメーター グリッドを指定する構造体配列 params を作成します。

A = [a1 a1];
params(1).Name = 'a';
params(1).Value = A;

B = [b1 b2];
params(2).Name = 'b';
params(2).Value = B;

パラメーターが変化するモデルのバッチ平衡化

以下の例では、パラメーターの値を変化させてモデルの複数の操作点を取得する方法を説明します。平衡化された操作点を使用してモデルをバッチ線形化し、プラントの変化に対するコントローラーのロバスト性を調査できます。

Simulink モデルを開きます。

sys = 'watertank';
open_system(sys)

パラメーター A および b を、そのノミナル値の 10% 以内で変化させます。A に 3 つの値、b に 4 つの値を指定して、各パラメーターに 3 行 4 列の値のグリッドを作成します。

[A_grid,b_grid] = ndgrid(linspace(0.9*A,1.1*A,3),...
                         linspace(0.9*b,1.1*b,4));

パラメーターの構造体配列を作成し、各パラメーターに名前とグリッド点を指定します。

params(1).Name = 'A';
params(1).Value = A_grid;
params(2).Name = 'b';
params(2).Value = b_grid;

モデルに既定の操作点仕様を作成し、モデルの両方の状態が不明であり、平衡化された操作点で定常状態になければならないことを指定します。

opspec = operspec(sys)
 Operating point specification for the Model watertank.
 (Time-Varying Components Evaluated at time t=0)

States: 
----------
(1.) watertank/PID Controller/Integrator/Continuous/Integrator
	 spec:  dx = 0,  initial guess: 0
(2.) watertank/Water-Tank System/H
	 spec:  dx = 0,  initial guess: 1

Inputs: None 
----------

Outputs: None 
----------


既定では、findop はコマンド ウィンドウに、各平衡化操作の操作点探索レポートを表示します。レポートを非表示にするには、平衡化オプション セットを作成して操作点探索レポートの表示をオフに設定します。

opt = findopOptions('DisplayReport','off');

指定した操作点の仕様、パラメーター グリッドおよびオプション セットを使用して、モデルを平衡化します。

[op,opreport] = findop(sys,opspec,params,opt);

findop が、パラメーターの各組み合わせでモデルを平衡化します。ソフトウェアは 1 回のモデル コンパイルのみを使用します。op は、指定されたパラメーター グリッド点に対応する操作点オブジェクトからなる 3 行 4 列の配列です。

op の 1 行目の最初の列の操作点を表示します。

op(1,1)
 Operating point for the Model watertank.
 (Time-Varying Components Evaluated at time t=0)

States: 
----------
(1.) watertank/PID Controller/Integrator/Continuous/Integrator
      x: 1.41         
(2.) watertank/Water-Tank System/H
      x: 10           

Inputs: None 
----------

パラメーター値から派生した既知の状態におけるモデルのバッチ平衡化

以下の例では、指定されたパラメーターの変化が平衡化の既知の状態に影響する場合にモデルのバッチ平衡化を行う方法を示します。

パラメーターが変化するモデルのバッチ平衡化の例では、不明な状態を含む単一の操作点仕様を満たすようにモデルを平衡化します。それ以外のケースでは、平衡化のためのモデルの状態は既知ですが、これは変化するパラメーターの値に依存します。この場合、単一の操作点仕様を使用してモデルをバッチ平衡化することはできません。パラメーター値のグリッドの各点ごとに、個別の仕様を作成しなければなりません。

Simulink モデルを開きます。

sys = 'scdairframeTRIM';
open_system(sys)

このモデルでは、空力は速度 $V$ に、モーメントは入射角 $\alpha$ に依存します。

$V$$\alpha$ の各パラメーターを変化させ、6 行 4 列のパラメーター グリッドを作成します。

nA = 6;    % number of alpha values
nV = 4;    % number of V values
alphaRange = linspace(-20,20,nA)*pi/180;
vRange = linspace(700,1400,nV);
[alphaGrid,vGrid] = ndgrid(alphaRange,vRange);

平衡化における一部の既知の状態値は $V$$\alpha$ の値に依存するため、パラメーターの各組み合わせに対して個別の操作点の仕様オブジェクトを作成しなければなりません。

for i = 1:nA
    for j = 1:nV
        % Set parameter values in model.
        alpha_ini = alphaGrid(i,j);
        v_ini = vGrid(i,j);

        % Create default specifications based on the specified parameters.
        opspec(i,j) = operspec(sys);

        % Specify which states are known and which states are at steady state.
        opspec(i,j).States(1).Known = [1;1];
        opspec(i,j).States(1).SteadyState = [0;0];

        opspec(i,j).States(3).Known = [1;1];
        opspec(i,j).States(3).SteadyState = [0;1];

        opspec(i,j).States(2).Known = 1;
        opspec(i,j).States(2).SteadyState = 0;

        opspec(i,j).States(4).Known = 0;
        opspec(i,j).States(4).SteadyState = 1;
    end
end

バッチ平衡化のためのパラメーター構造体を作成します。各パラメーターに名前と値のグリッドを指定します。

params(1).Name = 'alpha_ini';
params(1).Value = alphaGrid;
params(2).Name = 'v_ini';
params(2).Value = vGrid;

指定したパラメーター グリッドと操作点の仕様を使用して、モデルを平衡化します。操作点仕様の配列および変化するパラメーター値の配列を指定する際、仕様配列の次元はパラメーター グリッドの次元に一致しなければなりません。

opt = findopOptions('DisplayReport','off');
op = findop(sys,opspec,params,opt);

findop は、パラメーターの各組み合わせについてモデルを平衡化します。op は、指定されたパラメーター グリッド点に対応する操作点オブジェクトからなる 6 行 4 列の配列です。

参考

| |

関連するトピック