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);
}