「周波数応答」の版間の差分

 
(同じ利用者による、間の30版が非表示)
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).
図\ref{sin_res_2nd}は,伝達関数<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.png|frame|50px]]
二次遅れ系<math>\displaystyle \frac{1}{s^2 + 0.5s + 1}</math>の正弦波応答
 
 


リストsample2_1 二次遅れ系の正弦波応答比較スクリプト
リストsample2_1 二次遅れ系の正弦波応答比較スクリプト
70行目: 64行目:
=== 周波数応答関数 ===
=== 周波数応答関数 ===


システムのゲインと位相は,上記のように実際に正弦波信号を入力して調べなくても,システムの周波数応答関数(周波数伝達関数)から求めることができる.周波数応答関数とは,伝達関数のラプラス演算子<math>s</math>を<math>j \omega</math>に置き換えたものである.周波数応答関数は各周波数<math>\omega</math>を含んだ複素関数であり,その絶対値と偏角がそれぞれゲインと位相に対応する.
システムのゲインと位相は,上記のように実際に正弦波信号を入力して調べなくても,システムの周波数応答関数(周波数伝達関数)から求めることができる.周波数応答関数とは,伝達関数のラプラス演算子<math>s</math>を<math>j \omega</math>に置き換えたものである.周波数応答関数は角周波数<math>\omega</math>を含んだ複素関数であり,その絶対値と偏角がそれぞれゲインと位相に対応する.


<math>
<math>
141行目: 135行目:
変数<tt>minp</tt>と<tt>maxp</tt>にそれぞれ周波数軸の下限と上限を10のベキ数で指定する.この例では<math>10^{-2}=0.01</math>[rad/s]から<math>10^2=100</math>[rad/s]までを指定している.
変数<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>関数を使ってプロットしている.図Bode_2_2に実行結果のグラフを示す.
グラフ表示のウィンドウを<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 <tt>polyval</tt>関数を利用したボード線図の描画スクリプト}
sample2_2 <tt>polyval</tt>関数を利用したボード線図の描画スクリプト}
172行目: 168行目:
  ylabel('Phase (deg)');
  ylabel('Phase (deg)');
  grid('on');
  grid('on');
Bode_2_2.pdf
<math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>polyval</tt>関数利用)




207行目: 200行目:
==== <tt>bode</tt>関数を利用した方法 ====
==== <tt>bode</tt>関数を利用した方法 ====


MATLABのControl System Toolboxに含まれる<tt>bode</tt>関数を利用すると,簡単にボード線図を描画できる.リストsample2_4にスクリプト例を,図Bode_2_4に実行結果のグラフを示す.なお,この例では変数<tt>omega</tt>で周波数ベクトルを指定しているが,省略することもできる.その場合は<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 <tt>bode</tt>関数を利用したボード線図の描画スクリプト
sample2_4 <tt>bode</tt>関数を利用したボード線図の描画スクリプト
221行目: 216行目:
  bode(sys, omega);
  bode(sys, omega);


Bode_2_4.pdf
<math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>bode</tt>関数利用)


リストsample2_4の例のように<tt>bode</tt>関数単体でグラフまで描画するが,ゲイン線図だけを描画したい時や,実験結果と重ねてグラフ化したい時などは,次のように,<tt>bode</tt>関数の左辺に変数をおくと,グラフ表示は行わず周波数応答の計算結果だけが得られる(ゲインは絶対値,位相は度の単位).
リストsample2_4の例のように<tt>bode</tt>関数単体でグラフまで描画するが,ゲイン線図だけを描画したい時や,実験結果と重ねてグラフ化したい時などは,次のように,<tt>bode</tt>関数の左辺に変数をおくと,グラフ表示は行わず周波数応答の計算結果だけが得られる(ゲインは絶対値,位相は度の単位).
230行目: 222行目:




これを利用したスクリプト例をリストsample2_5に示す.これはボード線図のゲイン線図だけをプロットする例である.実行結果を図Bode_2_5に示す.
これを利用したスクリプト例をリストsample2_5に示す.これはボード線図のゲイン線図だけをプロットする例である.実行結果を図4に示す.


なお,<tt>bode</tt>関数が多入出力に対応しているため,MATLABの場合左辺の変数<tt>gain</tt>と<tt>phase</tt>は3次元の行列として出力される(対象システム1入力1出力であっても).よって,<tt>plot</tt>関数で使用する前にこのスクリプト例のように<tt>squeeze</tt>関数で1次元ベクトルに変換する必要があるので注意する.
なお,<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 <tt>bode</tt>関数を利用したゲイン線図のスクリプト
sample2_5 <tt>bode</tt>関数を利用したゲイン線図のスクリプト
252行目: 246行目:
  ylabel('Gain (dB)');
  ylabel('Gain (dB)');
  grid( 'on');
  grid( 'on');
Bode_2_5.pdf
<math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のBode線図(<tt>bode</tt>関数利用,ゲイン線図のみ)


=== 周波数応答(ベクトル軌跡)のプロット ===
=== 周波数応答(ベクトル軌跡)のプロット ===


ベクトル軌跡は周波数応答関数を<math>\omega = 0 \sim \infty</math>の範囲で複素平面上にそのままプロットしたものである.MATLAB(Octave)では複素数ベクトルを<tt>plot</tt>関数でプロットすると複素平面上で表されるので,それをそのまま利用できる.リストsample2_6がスクリプトの例であり,実行結果は図vector_loci_2_6である.なお,MATLAB(Octave)には<tt>nyquist</tt>関数が用意されており,それを利用してもベクトル軌跡を描くことができる.
ベクトル軌跡は周波数応答関数を<math>\omega = 0 \sim \infty</math>の範囲で複素平面上にそのままプロットしたものである.MATLAB(Octave)では複素数ベクトルを<tt>plot</tt>関数でプロットすると複素平面上で表されるので,それをそのまま利用できる.リストsample2_6がスクリプトの例であり,実行結果は図vector_loci_2_6である.なお,MATLAB(Octave)には<tt>nyquist</tt>関数が用意されており,それを利用してもベクトル軌跡を描くことができる.
[[ファイル:vector_loci_2_6.png|thumb|図5 <math>\displaystyle \frac{1}{s^2 + 0.5s+ 1}</math>のベクトル軌跡]]


sample2_6 二次遅れ系のベクトル軌跡を描くスクリプト
sample2_6 二次遅れ系のベクトル軌跡を描くスクリプト
277行目: 267行目:
  axis equal; %グラフの縦横比を1:1に指定
  axis equal; %グラフの縦横比を1:1に指定
  grid('on');
  grid('on');
\begin{figure}[!htbp]
\begin{center}
\includegraphics[width=0.6\columnwidth]{Figs/vector_loci_2_6.pdf}
\caption{$\displaystyle \frac{1}{s^2 + 0.5s+ 1}$のベクトル軌跡}
\label{vector_loci_2_6}
\end{center}
\end{figure}


== 応用編 ==
== 応用編 ==
303行目: 283行目:
</math>
</math>


よって,むだ時間要素のボード線図を描くスクリプト例はリストsample2_7となる.実行結果は図Bode_2_7である.
よって,むだ時間要素のボード線図を描くスクリプト例はリストsample2_7となる.実行結果は図6である.
ここで,関数<tt>ones</tt>は指定したサイズで要素がすべて1の行列を生成する関数であり,関数<tt>size</tt>で周波数ベクトルの大きさを取り出して利用している.
ここで,関数<tt>ones</tt>は指定したサイズで要素がすべて1の行列を生成する関数であり,関数<tt>size</tt>で周波数ベクトルの大きさを取り出して利用している.
[[ファイル:Bode_2_7.png|thumb|図6 むだ時間要素のボード線図(<math>L=1</math>)]]


sample2_7 むだ時間要素のボード線図を描くスクリプト
sample2_7 むだ時間要素のボード線図を描くスクリプト
330行目: 314行目:
  ylabel('Phase (deg)');
  ylabel('Phase (deg)');
  grid('on');
  grid('on');
Bode_2_7.pdf
むだ時間要素のボード線図(<math>L=1</math>)


=== 実験結果との重ね合わせの例 ===
=== 実験結果との重ね合わせの例 ===
341行目: 319行目:
実験科目や卒業研究などで,実験装置での実測結果と理論式から求めた理論曲線を比較する場面がよく出てくる.リストsample2_8は実験で求めた周波数応答と理論曲線を重ねて描くスクリプトの例である.
実験科目や卒業研究などで,実験装置での実測結果と理論式から求めた理論曲線を比較する場面がよく出てくる.リストsample2_8は実験で求めた周波数応答と理論曲線を重ねて描くスクリプトの例である.


実験による測定結果の周波数,ゲイン,位相をそれぞれ<tt>omega_e</tt>, <tt>gaindB_e</tt>, <tt>phase_e</tt>という変数に代入しておき,理論曲線と重ねている.この際,実験データの方はマーカーで示すべきであるので,<tt>semilog</tt>関数内で線類を指定している.また,関数<tt>legend</tt>でグラフに凡例を付け加えることができる.実行結果を図Bode_2_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 実験結果と理論曲線を重ねる例]]




376行目: 356行目:
  grid('on');
  grid('on');
  legend('Theoretical', 'Experimental');
  legend('Theoretical', 'Experimental');
Bode_2_8.pdf
実験結果と理論曲線を重ねる例