Main Content

trim

動的システムの平衡点の検出

構文

[x,u,y,dx] = trim('sys')
[x,u,y,dx] = trim('sys',x0,u0,y0)
[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy)
[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx)
[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options)
[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options,t)

説明

メモ

trim では基本的な平衡化機能のみが提供されています。完全な平衡化機能については、Simulink® Control Design™ ソフトウェアを使用してください。詳細については、定常状態の操作点の計算 (Simulink Control Design)を参照してください。

平衡点とは動的システムのパラメーター空間内の点であり、システムはこの点で定常状態となります。たとえば、航空機の平衡点は航空機がまっすぐ水平に飛行するよう制御する設定のことをいいます。数学的には、平衡点はシステムの状態の導関数がゼロである点のことをいいます。trim は初期点から始めて、二次計画法を使って直近の平衡点が見つかるまで検索を行います。暗黙的または明示的に初期点を指定しなければなりません。trim は平衡点を見つけることができない場合、検索で検出した点を返します。この場合、状態導関数は最小最大の観点からゼロに最も近くなります。つまり、導関数のゼロからの最大偏差を最小にする点を返します。trim は、特定の入力、出力または状態条件に一致する平衡点を見つけることができます。また、システムが指定された様式で変化している点 (システムの状態導関数が特定のゼロ以外の値である点) を見つけることができます。

[x,u,y,dx] = trim('sys') は、システムの初期状態 x0 に最も近い、モデル 'sys' の平衡点を見つけます。特に、trim[x-x0,u,y] の最大絶対値を最小にする平衡点を見つけます。システムの初期状態に近い平衡点を見つけることができない場合、trim はシステムが最も平衡に近い点を返します。特に、dx がシステムの導関数を表す場合は、abs(dx) を最小にする点を返します。次のコマンドを使って x0 を取得できます。

[sizes,x0,xstr] = sys([],[],[],0)

[x,u,y,dx] = trim('sys',x0,u0,y0) は、x0u0y0 に最も近い平衡点 (以下の最大値を最小にする点) を返します。

abs([x-x0; u-u0; y-y0])

[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy) は指定された状態、入力、出力条件の設定を満たす x0u0y0 に最も近い平衡点を返します。整数ベクトル ixiu、および iy は、満たすべき x0u0y0 の値を選択します。trim は、指定された条件セットを正確に満たす平衡点を見つけることができない場合、その条件、つまり以下を満たす最も近い点を返します。

abs([x(ix)-x0(ix); u(iu)-u0(iu); y(iy)-y0(iy)])

[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx) を使用して、特定の非平衡点 (システムの状態導関数が一部の指定されたゼロ以外の値をもつ点) を見つけます。ここで、dx0 は検索の始点における状態導関数の値を指定し、idx は検索が確実に満たさなければならない dx0 の値を選択します。

[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options) は、trim が平衡点を見つけるために使う最適化関数に渡す最適化パラメーターの配列を指定します。最適化関数は、この配列を順次使用して最適化プロセスを制御し、プロセスに関する情報を返します。trim は、検索プロセスの最後に options 配列を返します。この方法で元の最適化プロセスを公開することで、trim は平衡点の検索の監視と微調整を可能にします。

次の表で、平衡点の検索に各要素がどのように影響を及ぼすかを説明します。配列要素1、2、3、4、10 は、平衡点の検索に特に役立ちます。

番号既定の設定説明
10表示オプションを指定します。0 は表示なし、1 は表形式の出力、-1 は警告メッセージの抑制をそれぞれ指定します。
210–4検索された平衡点が検索を終了するために達成しなければならない精度。
310–4平衡検索ゴール関数が検索を終了するために達成しなければならない精度。
410–6状態導関数が検索を終了するために達成しなければならない精度。
5N/A使用しません。
6N/A使用しません。
7N/A内部で使用。
8N/A平衡検索ゴール関数 (ゴール達成では λ) の値を返します。
9N/A使用しません。
10N/A平衡点の検索に使用する反復回数を返します。
11N/A関数の勾配評価回数を返します。
120使用しません。
130等式制約条件の数。
14100*(変数の数)平衡点を見つけるために使用する関数評価の最大回数。
15N/A使用しません。
1610–8内部で使用。
170.1内部で使用。
18N/Aステップ長を返します。

[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options,t) は、システムが時間依存の場合は、時間に t を設定します。

メモ

状態、入力値または出力値のいずれかを固定する場合、trim は未指定の自由変数を使用して、これらの制約を満たすソリューションを導出します。

状態安定点を見つける

Simulink の trim 関数はモデルを使用して、指定した入力、出力、および状態を満たす動的システムの状態安定点を決定します。たとえば、次の ex_lmod というモデルを考えてみます。

関数 trim は、両方の出力を 1 に設定する入力と状態の値を見つけるために使用できます。最初に、状態変数 (x) と入力値 (u) を推定してから、出力 (y) の希望値を設定します。

x = [0; 0; 0];
u = 0;
y = [1; 1];

インデックス変数を使用して、どの変数が固定で、どの変数が可変であるかを示します。

ix = [];      % Don't fix any of the states
iu = [];      % Don't fix the input
iy = [1;2];   % Fix both output 1 and output 2

trim を呼び出すと、解が返されます。丸め誤差のため、異なる結果になる場合もあります。

[x,u,y,dx] = trim('lmod',x,u,y,ix,iu,iy)

x =
   0.0000
   1.0000
   1.0000
u =
   2
y =
   1.0000
   1.0000
dx =
   1.0e-015 *
    -0.2220
    -0.0227
     0.3331

平衡点の問題の解はないことに注意してください。その場合は、trim はまず導関数をゼロに設定しようとしてから、望ましい結果との最大偏差が最小になるような解を返します。trim の構文については、「trim」を参照してください。

平衡点の検出

State-Space ブロックを使用してモデルが作成された線形状態空間システムがあるとします。

x˙=Ax+Buy=Cx+Du

コマンド ラインまたはブロック パラメーター ダイアログで入力する ABC、および D の各行列は次のとおりです。

A = [-0.09 -0.01;  1   0];
B = [ 0    -7;     0  -2];
C = [ 0     2;     1  -5];
D = [-3     0;     1   0];
例 1

sys と呼ばれるこのモデルで平衡点を見つけるには、次の構文を使用します。

[x,u,y,dx,options] = trim('sys')
x =
   0
   0
u =
   0
   0
y =
   0
   0
dx =
   0
   0

取得される反復回数は次のとおりです。

options(10)
ans =
      7
例 2

x = [1;1], u = [1;1] に近い平衡点を検索するには、次のように入力します。

x0 = [1;1];
u0 = [1;1];
[x,u,y,dx,options] = trim('sys', x0, u0);
x =
    1.0e-13 *
   -0.5160
   -0.5169
u =
    0.3333
    0.0000
y =
   -1.0000
    0.3333
dx =
    1.0e-12 *
    0.1979
    0.0035

取得される反復回数は次のとおりです。

options(10)
ans = 
      25
例 3

出力を 1 に固定して平衡点を検索するには、次の構文を使用します。

y = [1;1];
iy = [1;2];
[x,u,y,dx] = trim('sys', [], [], y, [], [], iy)
x =
    0.0009
   -0.3075
u =
   -0.5383
    0.0004
y =
    1.0000
    1.0000
dx =
    1.0e-15 *
   -0.0170
    0.1483
例 4

出力を 1 に固定し、導関数を 0 と 1 に設定して平衡点を検索するには、次の構文を使用します。

y = [1;1];
iy = [1;2];
dx = [0;1];
idx = [1;2];
[x,u,y,dx,options] = trim('sys',[],[],y,[],[],iy,dx,idx)
x =
    0.9752
   -0.0827
u =
   -0.3884
   -0.0124
y =
    1.0000
    1.0000
dx =
    0.0000
    1.0000

取得される反復回数は次のとおりです。

options(10)
ans = 
      13

制限

指定された初期点から開始された関数 trim により見つかった平衡点は、ローカルな値だけです。より適切な平衡点が他に存在する可能性があります。つまり、特定の用途に最も適した平衡点を見つけたい場合は、複数の xuy の初期推測値を試すことが重要です。

アルゴリズム

関数 trim は二次計画法を使って平衡点を検索します。このアルゴリズムの詳細は、逐次二次計画法 (SQP) (Optimization Toolbox)を参照してください。

バージョン履歴

R2006a より前に導入

参考

(Simulink Control Design)

トピック