Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

状態空間モデルを最大精度にスケーリング

この例では、状態空間モデルを正しくスケーリングすることが精度を確保するうえで重要であることを示すとともに、自動および手動の再スケーリング ツールの概要を示します。

スケーリングが重要な理由

行列 A、B、C のエントリの大きさが均一であり、モデル特性が (ノルムとの比較において) A、B、C の小さな摂動の影響を受けない場合、状態空間モデルは正しくスケーリングされています。逆に A,B,C に大小両方のエントリがあり、モデル特性が小さいエントリの影響を受ける場合、モデルは正しくスケーリングされていません。

種類の異なる時間スケールや単位スケールを混ぜると、正しくスケーリングされていないモデルを生成する原因となります。これらのモデルを使用すると、精度が大きく損なわれ、不可解な結果が得られかねません。こうした問題を防ぐため、状態ベクトルを再スケーリングすること、つまり、各状態に何らかのスケーリング係数を掛け合わせて、モデルの数値範囲を縮小し、感度を下げることが往々にして必要になります。

スケーリングが正しくないと、大半の周波数領域計算の精度に影響することがあります。最先端のアルゴリズムは直交の状態座標変換に大きく依存しており、この変換では A、B、C のノルムを eps (マシン精度) 倍にした次数の誤差が生じます。これらの誤差は通常無視できますが、A、B、C が正しくスケーリングされていないと大きな影響を与えかねません。この現象を確認するには、次の例を読み込みます。

load numdemo anil

anil モデルは、大半のダイナミクスが 1e3 ~ 1e5 rad/s の範囲に収まっている 20 次の伝達関数の状態空間実現です。A 行列の係数は、振幅が 1 ~ 1e80 の範囲に収まっています。このモデルに適用される直交変換の影響をシミュレートするには、ランダムな直交行列 U を生成し、ss2ss を使用して対応する状態座標の変更を実行します。

[U,junk] = qr(randn(20));
anil2 = ss2ss(anil,U);   % perform state coordinate transformation U

数学的には、anilanil2 の周波数応答は同じです。ただし、数値的に見た場合、anilanil2 のボード線図は大きく異なっています。

bode(anil,'b',anil2,'r--')
legend('Original','After Orthogonal Transformation','Location','southwest')
Warning: The frequency response has poor relative accuracy. This may be because
the response is nearly zero or infinite at all frequencies, or because the
state-space realization is ill conditioned. Use the "prescale" command to
investigate further. 

この例は、モデルが正しくスケーリングされていないと、直交変換でさえも安全でなく、精度を下げる可能性があることを示しています。

感度最小化スケーリング

物理学から派生した簡単なモデルの場合は、大小の係数間の広がりを縮小するように慎重に単位を選択することによって、スケーリングに関連した問題を防ぐことができます。ただし、より複雑なモデルの場合、正しいスケーリングを見つけることは困難です。A 行列のバランス化 (balance を参照) などのその場しのぎのスキームは、多くの場合有益ですが、害になることもあります。

Control System Toolbox™ ソフトウェアには、最新のスケーリング アルゴリズムが用意されているため、ノルムに比例した A,B,C の小さな摂動に対するモデルの感度を最小限に抑えることができます。これにより、周波数応答や ZPK 表現などの計算値の精度を最大限に高めることが可能となります。prescale コマンドは、これらのスケーリング アルゴリズムへのゲートウェイとなります。たとえば、prescale を使用すると、上で使用した anil モデルをスケーリングできます。

Scaled_anil = prescale(anil);

A 行列の係数の範囲は、1 ~ 1e80 から 1e3 ~ 3e7 に変更されました。スケーリングされたモデルに直交変換 U を適用して、ボード線図を比較します。

Scaled_anil2 = ss2ss(Scaled_anil,U);
bode(Scaled_anil,'b',Scaled_anil2,'r--')
legend('Scaled Model','After Orthogonal Transformation','Location','southwest')

ボード応答が厳密に一致するようになりました。スケーリングを行ったことによって直交変換が再び安全になり、スケーリングされたこのモデルを使った計算から精度の高い結果を得られるようになりました。

自動スケーリング

Control System Toolbox ソフトウェアに用意されている大半のアルゴリズムでは、状態空間モデルを自動的に再スケーリングすることによって、精度が著しく低下するのを防いでいます。そのため、スケーリングに関連した問題はほとんど発生しません。たとえば、bode コマンドは、直交変換を安全に実行して周波数応答の計算を加速化できるように、入力モデルを自動的にスケーリングします。したがって、ボード線図の計算値の相対的な精度について詳細な情報が必要でない限り、bode の前に prescale を使用する必要はありません。

手動スケーリング

Control System Toolbox のスケーリング アルゴリズムでは、ユーザーの介入なしに大半のモデルを処理できます。ただし、周波数範囲全体にわたって高い精度を達成できないため、ある周波数帯域で精度を犠牲にして別の帯域で高い精度を確保しなければならないことがまれにあります。このような場合は、不正確性の可能性を知らせる警告が表示されます。この動作を説明するには、次の例を読み込んで、そのボード応答をプロットします。

load numdemo warnsys
bode(warnsys,{1e-3,1e6}), grid on

bode コマンドによって発行される警告に注意してください。この 17 次モデルには、0.01 rad/sec の近傍と 1e3 ~ 1e6 rad/sec の範囲に、300dB のゲイン減衰で区切られたダイナミクスがあります。対象とする周波数範囲を [10,1e6] rad/sec などに絞り込むことによって、警告を除去できます。

bode(warnsys,{10,1e6}), grid on

これにより、間隔 [10,1e6] で精度を最大化するようにアルゴリズムに指示できます。また、次のように入力して、基本的な精度のトレードオフを調べることもできます。

>> prescale(warnsys)

このコマンドにより、下図に示す対話型のスケーリング ツールが開きます。周波数軸の範囲を 1e-2 ~ 1e6 に設定します。上部プロットには周波数応答の振幅が示され、下部プロットには以下の項目が示されます。

  • スケーリングなしの応答の計算値の相対的な精度 (赤)

  • スケーリングありの応答の計算値の相対的な精度 (青)

  • 各周波数で独立したスケーリングを使用した場合に達成可能な最良の精度 (茶色)

1 より大きい相対精度値は、精度が低いことを意味します。

この例は、相対精度プロットに、スケーリング アルゴリズムが [1e3,1e6] 周波数帯域で高い精度を達成し、それより低い周波数では精度が低くなっていることを示しています。周波数帯域 [1e-3,1] のみが重要な場合は、この既定の範囲選択をオーバーライドして、精度を最大化する周波数帯域を手動で指定できます。たとえば、[周波数帯域内の最大精度] の横にある編集ボックスに「[1e-3,1]」と入力します。

このアクションによって下部プロットが更新され、スケーリングされたモデルの相対精度 (青い曲線) が 1e-2 rad/sec の近傍で最も高くなる一方で、[1e3,1e6] 帯域で著しく低くなります。

状態空間モデルの Scaled プロパティ

状態空間 (@ss) オブジェクトには、モデルが既にスケーリングされていることを示す Scaled というプロパティがあります。既定値は false です。prescale コマンドは、このプロパティを true に設定します。

sys = prescale(anil);
sys.Scaled
ans =

  logical

   1

Scaled=true の指定されたモデルはスケーリング アルゴリズムによってスキップされるため、モデルが正しくスケーリングされていてスケーリングに関連する小さなオーバーヘッドの解消が望まれる場合は、Scaled プロパティを true に手動で設定できます。精度を最大化する箇所を綿密に制御するには、モデルを使用する前に明示的にスケーリングすることもできます。

sys = prescale(warnsys,{10,1e6});
bode(sys)

ここで、warnsys は周波数範囲 [10,1e6] に重きを置いてスケーリングされ、bode が結果のモデル sys の再スケーリングを試みることはありません (警告はなくなる)。

まとめ

状態空間モデルを正しくスケーリングすることは、正確な結果を得るうえで重要となります。Control System Toolbox の大半のコマンドでは、スケーリングが自動的に実行されます。精度が低下すると警告が表示されるため、対象とする周波数帯域を指定することによって問題を容易に修正できます。