→ゲインと位相
(→ゲインと位相) |
|||
(同じ利用者による、間の35版が非表示) | |||
3行目: | 3行目: | ||
=== ゲインと位相 === | === ゲインと位相 === | ||
安定な線形なシステムに正弦波入力を加えると,定常状態では出力も正弦波となる.出力の正弦波の周波数は入力と同じになるが,振幅の変化や位相差が発生する. | |||
入力の正弦波を<math>u(t)</math>,定常状態での出力を<math>y(t)</math>とし,それぞれ次式で表されるとする. | 入力の正弦波を<math>u(t)</math>,定常状態での出力を<math>y(t)</math>とし,それぞれ次式で表されるとする. | ||
15行目: | 15行目: | ||
このとき,入力に対する出力の振幅比をゲイン<math>g = \displaystyle \frac{A_o}{A_i}</math>,<math>\phi</math>を位相(位相差)と呼ぶ.ゲインと位相は入力の周波数に応じて変化する. | このとき,入力に対する出力の振幅比をゲイン<math>g = \displaystyle \frac{A_o}{A_i}</math>,<math>\phi</math>を位相(位相差)と呼ぶ.ゲインと位相は入力の周波数に応じて変化する. | ||
図1は,伝達関数<math>\displaystyle \frac{1}{s^2 + 0.5s + 1}</math>に<math>\omega=</math>0.1, 1, 10 [rad/s]の3種類の正弦波を入力した時の応答をMATLAB(Octave)の<tt>lsim</tt>関数で計算した結果である(リストsample2_1). | |||
グラフから,過渡状態はおおよそ開始から10秒強で,その後は定常状態となっていることがわかる.定常状態でのゲインと位相は周波数によって変化していることがわかる. | グラフから,過渡状態はおおよそ開始から10秒強で,その後は定常状態となっていることがわかる.定常状態でのゲインと位相は周波数によって変化していることがわかる. | ||
[[ファイル:sins.png|thumb|図1 二次遅れ系の正弦波応答]] | |||
sins. | |||
リストsample2_1 二次遅れ系の正弦波応答比較スクリプト | リストsample2_1 二次遅れ系の正弦波応答比較スクリプト | ||
67行目: | 61行目: | ||
legend('u', 'y'); | legend('u', 'y'); | ||
grid( 'on'); | grid( 'on'); | ||
=== 周波数応答関数 === | === 周波数応答関数 === | ||
システムのゲインと位相は,上記のように実際に正弦波信号を入力して調べなくても,システムの周波数応答関数(周波数伝達関数)から求めることができる.周波数応答関数とは,伝達関数のラプラス演算子<math>s</math>を<math>j \omega</math> | システムのゲインと位相は,上記のように実際に正弦波信号を入力して調べなくても,システムの周波数応答関数(周波数伝達関数)から求めることができる.周波数応答関数とは,伝達関数のラプラス演算子<math>s</math>を<math>j \omega</math>に置き換えたものである.周波数応答関数は角周波数<math>\omega</math>を含んだ複素関数であり,その絶対値と偏角がそれぞれゲインと位相に対応する. | ||
<math> | <math> | ||
93行目: | 86行目: | ||
=== MATLAB(Octave)での複素数の取扱い === | === MATLAB(Octave)での複素数の取扱い === | ||
MATLAB(Octave)では複素数は以下のように入力し,そのまま実数と同じように扱える.なお,入力する際は,虚数単位は<tt>i</tt> | MATLAB(Octave)では複素数は以下のように入力し,そのまま実数と同じように扱える.なお,入力する際は,虚数単位は<tt>i</tt>でも<tt>j</tt>でもよい. | ||
1 + 2i | 1 + 2i | ||
103行目: | 96行目: | ||
と出力される. | と出力される. | ||
しかし,変数として | しかし,変数として<tt>i</tt>や<tt>j</tt>を使っていると,虚数単位と混同するので,複素数を表す関数<tt>complex()</tt>を使用した方が間違いがない.また,絶対値は関数<tt>abs()</tt>,偏角は関数<tt>angle()</tt>で求められる(単位はラジアン).以下のこれらの使用例を示す. | ||
> z = complex(1, -1) | > z = complex(1, -1) | ||
114行目: | 107行目: | ||
=== MATLAB(Octave)での有理式の取扱い === | === MATLAB(Octave)での有理式の取扱い === | ||
伝達関数は一般に有理式(分子・分母が多項式)で表される(むだ時間など一部除く).MATLAB(Octave)では多項式を係数を降べきの順に並べたベクトルで表し,有理式は分子・分母それぞれの係数ベクトルのペアで表現する.例えば,伝達関数<math>\displaystyle G(s) = \frac{s + 2}{s^2 + 3s + 2} </math>は,次のように二つのベクトル | 伝達関数は一般に有理式(分子・分母が多項式)で表される(むだ時間など一部除く).MATLAB(Octave)では多項式を係数を降べきの順に並べたベクトルで表し,有理式は分子・分母それぞれの係数ベクトルのペアで表現する.例えば,伝達関数<math>\displaystyle G(s) = \frac{s + 2}{s^2 + 3s + 2} </math>は,次のように二つのベクトル<tt>num</tt>と<tt>den</tt>のペアで表す. | ||
> num = [1 2]; | > num = [1 2]; | ||
> den = [1 3 2]; | > den = [1 3 2]; | ||
また,MATLAB(Octave)では,多項式の変数に値を代入して計算した結果を返してくれる関数 | また,MATLAB(Octave)では,多項式の変数に値を代入して計算した結果を返してくれる関数<tt>polyval()</tt>が用意されている.使用例を以下に示す.このように複素数にも対応するので,周波数応答の計算に利用できる. | ||
> f = [1 2 1]; | > f = [1 2 1]; | ||
132行目: | 125行目: | ||
ここではMATLAB(Octave)によるボード線図のプロットについて,以下の二つの方法を紹介する. | ここではMATLAB(Octave)によるボード線図のプロットについて,以下の二つの方法を紹介する. | ||
* | * <tt>polyval</tt>関数を利用して原理に基づいて計算する方法 | ||
* Control System Toolboxの | * Control System Toolboxの<tt>bode</tt>関数を利用する方法 | ||
==== <tt>polyval</tt>関数を利用した方法 ==== | |||
リストsample2_2に<tt>polyval</tt>関数を利用してボード線図をプロットするスクリプト例を示す. | |||
変数<tt>minp</tt>と<tt>maxp</tt>にそれぞれ周波数軸の下限と上限を10のベキ数で指定する.この例では<math>10^{-2}=0.01</math>[rad/s]から<math>10^2=100</math>[rad/s]までを指定している. | |||
グラフ表示のウィンドウを<tt>subplot</tt>命令で2行1列に分割し,上側にゲイン線図,下側に位相線図をそれぞれ横軸対数表示である<tt>semilogx</tt>関数を使ってプロットしている.図2に実行結果のグラフを示す. | |||
[[ファイル:Bode_2_2.png|thumb|図2 <math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>polyval</tt>関数利用)]] | |||
sample2_2 | sample2_2 <tt>polyval</tt>関数を利用したボード線図の描画スクリプト} | ||
num = [1]; %伝達関数の分子 | num = [1]; %伝達関数の分子 | ||
den = [1 0.5 1]; %伝達関数の分母 | den = [1 0.5 1]; %伝達関数の分母 | ||
173行目: | 168行目: | ||
ylabel('Phase (deg)'); | ylabel('Phase (deg)'); | ||
grid('on'); | grid('on'); | ||
リストsample2_3は,MATLAB(Octave)固有の要素ごとの演算を利用して | リストsample2_3は,MATLAB(Octave)固有の要素ごとの演算を利用して<tt>for</tt>ループを用いないスクリプト例である.ここで,<tt>logspace</tt>関数は等比数列を出力する関数である. | ||
sample2_3 | sample2_3 <tt>polyval</tt>関数を利用したボード線図の描画スクリプト(forループ無しバージョン) | ||
num = [1]; %伝達関数の分子 | num = [1]; %伝達関数の分子 | ||
den = [1 0.5 1]; %伝達関数の分母 | den = [1 0.5 1]; %伝達関数の分母 | ||
206行目: | 198行目: | ||
grid('on'); | grid('on'); | ||
==== | ==== <tt>bode</tt>関数を利用した方法 ==== | ||
MATLABのControl System Toolboxに含まれる<tt>bode</tt>関数を利用すると,簡単にボード線図を描画できる.リストsample2_4にスクリプト例を,図3に実行結果のグラフを示す.なお,この例では変数<tt>omega</tt>で周波数ベクトルを指定しているが,省略することもできる.その場合は<tt>bode</tt>関数が自動的に周波数範囲を設定して描画する. | |||
[[ファイル:Bode_2_4.png|thumb|図3 <math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>bode</tt>関数利用)]] | |||
sample2_4 | sample2_4 <tt>bode</tt>関数を利用したボード線図の描画スクリプト | ||
num = [1]; %伝達関数の分子 | num = [1]; %伝達関数の分子 | ||
den = [1 1 1]; %伝達関数の分母 | den = [1 1 1]; %伝達関数の分母 | ||
223行目: | 217行目: | ||
リストsample2_4の例のように<tt>bode</tt>関数単体でグラフまで描画するが,ゲイン線図だけを描画したい時や,実験結果と重ねてグラフ化したい時などは,次のように,<tt>bode</tt>関数の左辺に変数をおくと,グラフ表示は行わず周波数応答の計算結果だけが得られる(ゲインは絶対値,位相は度の単位). | |||
< | |||
[gain phase omega] = bode(sys, omega); | |||
これを利用したスクリプト例をリストsample2_5に示す.これはボード線図のゲイン線図だけをプロットする例である.実行結果を図4に示す. | |||
なお,<tt>bode</tt>関数が多入出力に対応しているため,MATLABの場合左辺の変数<tt>gain</tt>と<tt>phase</tt>は3次元の行列として出力される(対象システム1入力1出力であっても).よって,<tt>plot</tt>関数で使用する前にこのスクリプト例のように<tt>squeeze</tt>関数で1次元ベクトルに変換する必要があるので注意する. | |||
[[ファイル:Bode_2_5.png|thumb|図4 <math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>bode</tt>関数利用,ゲイン線図のみ)]] | |||
sample2_5 | sample2_5 <tt>bode</tt>関数を利用したゲイン線図のスクリプト | ||
num = [1]; %伝達関数の分子 | num = [1]; %伝達関数の分子 | ||
den = [1 0.5 1]; %伝達関数の分母 | den = [1 0.5 1]; %伝達関数の分母 | ||
254行目: | 247行目: | ||
grid( 'on'); | grid( 'on'); | ||
=== 周波数応答(ベクトル軌跡)のプロット === | |||
ベクトル軌跡は周波数応答関数を<math>\omega = 0 \sim \infty</math>の範囲で複素平面上にそのままプロットしたものである.MATLAB(Octave)では複素数ベクトルを<tt>plot</tt>関数でプロットすると複素平面上で表されるので,それをそのまま利用できる.リストsample2_6がスクリプトの例であり,実行結果は図vector_loci_2_6である.なお,MATLAB(Octave)には<tt>nyquist</tt>関数が用意されており,それを利用してもベクトル軌跡を描くことができる. | |||
<math>\ | |||
[[ファイル:vector_loci_2_6.png|thumb|図5 <math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のベクトル軌跡]] | |||
sample2_6 二次遅れ系のベクトル軌跡を描くスクリプト | sample2_6 二次遅れ系のベクトル軌跡を描くスクリプト | ||
278行目: | 267行目: | ||
axis equal; %グラフの縦横比を1:1に指定 | axis equal; %グラフの縦横比を1:1に指定 | ||
grid('on'); | grid('on'); | ||
== 応用編 == | == 応用編 == | ||
304行目: | 283行目: | ||
</math> | </math> | ||
よって,むだ時間要素のボード線図を描くスクリプト例はリストsample2_7となる.実行結果は図6である. | |||
ここで,関数 | ここで,関数<tt>ones</tt>は指定したサイズで要素がすべて1の行列を生成する関数であり,関数<tt>size</tt>で周波数ベクトルの大きさを取り出して利用している. | ||
[[ファイル:Bode_2_7.png|thumb|図6 むだ時間要素のボード線図(<math>L=1</math>)]] | |||
sample2_7 むだ時間要素のボード線図を描くスクリプト | sample2_7 むだ時間要素のボード線図を描くスクリプト | ||
331行目: | 314行目: | ||
ylabel('Phase (deg)'); | ylabel('Phase (deg)'); | ||
grid('on'); | grid('on'); | ||
=== 実験結果との重ね合わせの例 === | === 実験結果との重ね合わせの例 === | ||
342行目: | 319行目: | ||
実験科目や卒業研究などで,実験装置での実測結果と理論式から求めた理論曲線を比較する場面がよく出てくる.リストsample2_8は実験で求めた周波数応答と理論曲線を重ねて描くスクリプトの例である. | 実験科目や卒業研究などで,実験装置での実測結果と理論式から求めた理論曲線を比較する場面がよく出てくる.リストsample2_8は実験で求めた周波数応答と理論曲線を重ねて描くスクリプトの例である. | ||
実験による測定結果の周波数,ゲイン,位相をそれぞれ | 実験による測定結果の周波数,ゲイン,位相をそれぞれ<tt>omega_e</tt>, <tt>gaindB_e</tt>, <tt>phase_e</tt>という変数に代入しておき,理論曲線と重ねている.この際,実験データの方はマーカーで示すべきであるので,<tt>semilog</tt>関数内で線類を指定している.また,関数<tt>legend</tt>でグラフに凡例を付け加えることができる.実行結果を図7に示す. | ||
[[ファイル:Bode_2_8.png|thumb|図7 実験結果と理論曲線を重ねる例]] | |||
377行目: | 356行目: | ||
grid('on'); | grid('on'); | ||
legend('Theoretical', 'Experimental'); | legend('Theoretical', 'Experimental'); | ||