margin
|
ゲイン余裕,位相余裕,交差周波数を求める
|
<書式> {gm,pm,wgc,wpc} = margin(Mg,Ph,w) Real gm,pm,wgc,wpc; //ゲイン余裕,位相余裕,ゲイン交差周波数,位相交差周波数 Array Mg,Ph,w; //ゲイン,位相,周波数 | |
備考1:bode_tfnなどボード線図の値を出力する関数との組み合わせで使いましょう. 備考2:位相の単位は[deg],角周波数wの単位は[rad/s]です. logspaceを使うと簡単に対数間隔のベクトルがつくれます. 備考3:この関数で出力されるgmは絶対値です.また,gmはデシベル値では ないので,20*log10(gm)で [dB] に直す必要があります. | |
<プログラム例> /* 一巡伝達関数G(s)H(s)が 1 G(s)H(s)=--------------- s(s+1)(s+2) となっている直結フィードバックシステムの周波数応答(ボード線図)に おいて,ゲイン余裕,位相余裕,ゲイン交差周波数,位相交差周波数を求める. */ Func void main() { Real gm,pm; //ゲイン余裕,位相余裕, Real wgc,wpc; //ゲイン交差周波数,位相交差周波数 Array Mg,Ph,w; //ゲイン,位相,周波数 Rational g; //伝達関数 Polynomial s; //ラプラス演算子 s=Polynomial("s"); //sを変数宣言 g=1/(s*(s+1)*(s+2)); //伝達関数の定義 w = logspace(-2.0, 3.0); //周波数 0.01〜1000[rad/s] の対数ベクトルを生成 {Mg,Ph,w} = bode_tfn(g,w); //ゲインと位相を求める {gm,pm,wgc,wpc} = margin(Mg,Ph,w); printf("ゲイン余裕 :%2.2f [dB] \n",20*log10(gm)); printf("位相余裕 :%2.2f [deg] \n",pm); printf("ゲイン交差周波数:%2.2f [rad/s] \n",wgc); printf("位相交差周波数 :%2.2f [rad/s] \n",wpc); } |