Simulink Control Design

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

システム同定を使用したモデル コンポーネントの線形化の指定

この例では、System Identification Toolbox を使用して、適切に線形化されていないモデル コンポーネントの線形システムを同定し、同定したシステムを使用して線形化を指定する方法を説明します。この例を実行するには、System Identification Toolbox に加え、SimPowerSystems が必要ですので注意してください。

ハード ドライブ モデルの線形化

ハード ドライブ用の Simulink モデルを開きます。

model = 'scdpwmharddrive';
open_system(model);

このモデルでは、ハード ドライブ プラントは電流源で駆動されています。電流源は、出力がデューティ比で調整できるようパルス幅変調 (PWM) 信号で駆動される回路で実装されています。ハード ドライブ モデルの詳細は、Control System Toolbox™ の例にある「ハードディスク ドライブのデジタル サーボ制御」を参照してください。

PWM 駆動の回路には通常、このモデル内の MOSFET トランジスタなどのように、平均的動作が十分に定義されていない高周波数スイッチング コンポーネントがあります。したがって、このタイプの回路の正確な線形化には問題があります。デューティ比入力から位置誤差までのモデルを線形化すると、その結果はゼロになります。

io(1) = linio('scdpwmharddrive/Duty cycle',1,'input');
io(2) = linio('scdpwmharddrive/Hard Disk Model',1,'output');
sys = linearize(model,io)
sys =
 
  d = 
                 Duty cycle
   position err           0
 
Static gain.

PWM コンポーネントの線形モデルの特定

周波数応答推定を使用して、PWM 駆動の電流源の周波数応答を取得し、その結果を線形モデルの同定に使用できます。電流の信号は 1e-7 の離散サンプル時間をもちます。したがって、固定サンプル時間の sinestream 信号を使用する必要があります。2K ~ 200K rad/s の周波数をもつ信号を作成します。

idinput = frest.createFixedTsSinestream(Ts,{2000,200000});
idinput.Amplitude = 0.1;

次に、PWM で駆動される回路の入出力ポイントを定義し、sinestream 信号で周波数応答推定を実行できます。

pwm_io(1) = linio('scdpwmharddrive/Duty cycle',1,'input');
pwm_io(2) = linio('scdpwmharddrive/PWM driven converter',1,'openoutput');
sysfrd = frestimate(model,pwm_io,idinput);

System Identification Toolbox の N4SID コマンドを使用すると、周波数応答データにより 2 次モデルを同定できます。次に、同定したモデルを元の周波数応答データと比べます。

sysid = ss(tfest(idfrd(sysfrd),2));
bode(sysid,sysfrd,'r*');

この例では、周波数 2K ~ 200K rad/s での周波数応答データを使用しました。同定されたモデルは、2K 未満の周波数に対して平坦な振幅応答を見せます。ただし、ここでの推定にはこれらの周波数は含まれていません。20 ~ 200 rad/s の周波数応答をチェックして、応答が平坦であること確認する場合を仮定します。これを行うには、こうした周波数を含む、別の入力信号を作成します。

lowfreq = [20 200];
inputlow = frest.createFixedTsSinestream(Ts,lowfreq)
 
The sinestream input signal:
 
      Frequency           : [20 200] (rad/s)
      Amplitude           : 1e-05
      SamplesPerPeriod    : [3141593 314159]
      NumPeriods          : 4
      RampPeriods         : 0
      FreqUnits (rad/s,Hz): rad/s
      SettlingPeriods     : 1
      ApplyFilteringInFRESTIMATE (on/off)    : on
      SimulationOrder (Sequential/OneAtATime): Sequential
 

入力信号パラメーターでは、20 ~ 200 rad/s の周波数に対し非常に速いサンプル レート 1e-7 秒 (10 MHz サンプリング周波数) を使用すると、3141593 と 314159 という高い SamplesPerPeriod 値が発生することがわかります。各周波数が 4 周期あることを考慮すると、周波数応答推定は約 1400 万サンプルの出力データを記録するとことになります。これには多くのメモリを必要とし、推定の実行に際してメモリの問題が発生する可能性が高くなります。

明らかに、20 ~ 200 rad/s の周波数を解析するためにそのような高サンプリング レートは必要ありません。メモリの問題を避けるために、より低いサンプリング レートを使用するとよいでしょう。

Tslow = 1e-4;
wslow = 2*pi/Tslow;
inputlow = frest.createFixedTsSinestream(Tslow,wslow./round(wslow./lowfreq));
inputlow.Amplitude = 0.1;

モデルを低いサンプリング レートに対応させるには、以下の修正モデルのように、レート変換ブロックを使用して出力データ ポイントをリサンプリングします。

modellow = 'scdpwmharddrive_lowfreq';
open_system(modellow);

これで、低周波数の解析を実行して、同定結果と比較できます。

load scdpwmharddrive_lowfreqresults.mat
% sysfrdlow = frestimate(modellow,getlinio(modellow),inputlow);
bode(sysid,sysfrdlow,'r*');
bdclose(modellow);

PWM コンポーネントの線形化の指定

周波数応答推定を使用して確認したように、PWM 駆動コンポーネントの低周波数ダイナミクスは同定されたシステムでうまく捉えられます。これで線形化処理において、このシステムを PWM 駆動コンポーネントの線形化として使用できます。これを行うには、サブシステムのブロック線形化を以下のように指定します。

pwmblock = 'scdpwmharddrive/PWM driven converter';
set_param(pwmblock,'SCDEnableBlockLinearizationSpecification','on');
rep = struct('Specification','sysid',...
             'Type','Expression',...
             'ParameterNames','',...
             'ParameterValues','');
set_param(pwmblock,'SCDBlockLinearizationSpecification',rep);
set_param('scdpwmharddrive/Duty cycle','SampleTime','Ts_plant');

PWM コンポーネントの線形化を指定した後にモデルを線形化すると、ゼロ以外の結果となります。

sys = linearize(model,io);

この線形化の結果を、周波数応答推定を使用してさらに検証することもできます。これを以下のように実行することで、ここでの線形化の結果が正確であり、すべての共振がモデルの実際のダイナミクスに存在することを確認できます。

valinput = frest.Sinestream(sys);
valinput = fselect(valinput,3e3,1e5);
valinput.Amplitude = 0.1;
sysval = frestimate(model,io,valinput);
bodemag(sys,sysval,'r*');

モデルを閉じます。

bdclose('scdpwmharddrive');