2009年3月24日火曜日

MATLABでフィードバック系のシミュレーション

たまにうっかり忘れるのでメモ.

MATLABでプラントPと制御器Kが構成するフィードバック系のシミュレーションをするとき,
>> s=tf('s');
>> P=1/s;
>> K=1/(1+s);
>> step(P*K/(1+P*K))
とかやるのはNG.正しくは
>> step(feedback(P*K,1))
とする.一見結果は同じなのだけど
>> P*K/(1+P*K)

Transfer function:
s^2 + s
-----------------------
s^4 + 2 s^3 + 2 s^2 + s

>> feedback(P*K,1)

Transfer function:
1
-----------
s^2 + s + 1

>>
という違いがあり,高次のシステムを使うときになって初めて問題が顕在化したりしてよろしくない.
システムの割り算はMATLABでは逆システムの計算と直列接続で計算されるので,この場合P*Kと1+P*Kが共通の極を持っているにも関わらず,これらが相殺されないことによって問題が起こる.
ちなみにseriesとparallelを*と+で書くのは,少なくともSISOの場合には問題ない(中でやってる処理は同じ).MIMOの場合は未確認.

MATLABに限らないけど,強力なツールを使うのは楽なようで難しい・・・
ソースを全部追うのは大変だし・・・

0 件のコメント: