はじめに
線形連続時間時不変システムの入力と出力をラプラス変換(s領域で表現)し,出力と入力の比(=出力÷入力)をとったものを伝達関数と呼びます。 入力が単位インパルス(δ関数)である場合,そのラプラス変換は1ですから, 伝達関数は単位インパルスを入力した場合のシステムの出力そのもの,つまりインパルス応答を表します。
sは複素数です。よくs = σ + jωと書かれます。 当たり前ですが,伝達関数は複素関数となります。 しばしば「複素関数のグラフは描けない」との言葉に出会います。 1変数の実関数y = f(t),例えば
であれば,横軸をt,縦軸をyとすればシンプルにグラフを描けます。

本記事では,伝達関数の直接的プロット法を提案します(これは「新しい」プロット法─と言いたいですが,新しいかどうか判りませんでした💦)。 また,これまでに議論した電流制御系にこのプロット法を適用して,ボード線図やLTspiceによる時間領域でのシミュレーションと比較します。
唐突なアニメーション
いきなりですが,図2のアニメーションをご覧下さい。

これは電流制御系において,制御ゲインを変えながら開ループ・閉ループ伝達関数をプロットしたものを, MatplotlibのFuncAnimationにてGIFアニメとして書き出したものです。
これまで,図3のRL回路,図4のブロック図の電流制御系について,2つの記事を書きました。
negligible.hatenablog.com negligible.hatenablog.com


図2は,図4のPI制御器にパラメータKを乗算し,K = 0.2 ~ K = 8までKを変化させた場合のアニメーションです。
伝達関数の直接的プロット法
複素関数である伝達関数をどのように“プロット”するか──そこで,私は伝達関数F(s)があった場合に,
- dB表示での絶対値 = 20 log10 |F(s)|,すなわちゲインをコンター図としてプロット
- 偏角arg F(s),すなわち位相を流線としてプロット
することを考えました。 考えられるs = σ + jωの範囲を絨毯爆撃のように数値的に計算して,無理やりプロットしますので, 本記事では直接的プロット法と命名しました。
Matplotlibにおいては,上記1のコンター図をcontour, contourfで描き,上記2の流線はstreamplotで描きます。 特に伝達関数の位相を流線で描くというのは,ひょっとしたら新しいアイディアなのではないかと密かに思っています。
電流制御系の伝達関数
前記事の通り,サンプル & ホールド,1サンプル遅れ,PWM (pulse-width modulation)のある離散時間(ディジタル)制御システムを, 移動平均フィルタとむだ時間のある連続時間(アナログ)制御システムで近似できます。 近似した結果が,前掲の図4となります。
前向き要素をG(s),フィードバック要素をH(s)とし, 開ループ伝達関数をTo(s),閉ループ伝達関数をTc(s)とすれば,
となります。
計算例
回路定数等のパラメータはこれまでと同じく表1としました。
| パラメータ | 値 |
|---|---|
| 抵抗器 | |
| インダクタ | |
| サンプリング周期 | |
| 比例ゲイン | |
| 積分ゲイン |
K = 0.6の場合
K = 0.6の場合,図5に示すように,閉ループ伝達関数の極は2つの実根となります。
また,図6に示すように,開ループ伝達関数のボード線図から位相余裕PM = 77.12°となります。
したがって,この場合,システムは安定です。
図7に示すLTspiceでの時間領域シミュレーションでは,ステップ応答の時定数が約520 μsであることが分かり,
逆数をとれば,1 / 520 μs = 1,923 rad/sと計算できます。
図6のボード線図のゲイン交差角周波数と,図4の閉ループ伝達関数の(虚軸に近い方の)極の実部に概ね一致している気がします。



K = 0.964の場合
K = 0.964の場合,図8に示すように,閉ループ伝達関数の極は重根となっているように見えます。
また,図9に示すように,開ループ伝達関数のボード線図から位相余裕PM = 69.34°となります。
したがって,この場合,システムは安定です。
図10のLTspiceでの時間領域シミュレーションでは,オーバーシュートが発生しておらず,ステップ応答の時定数が約290 μsであることが分かり,
逆数をとれば,1 / 290 μs = 3,448 rad/sと計算できます。
図9のボード線図のゲイン交差角周波(約2,500 rad/s)とも,図4の閉ループ伝達関数の極とも少しずれている気がしますね。
同じく考察が待たれます…。重根だからでしょうか?



K = 1.9の場合
振動的ではあるが安定限界には至っていないひとつの例として,K = 1.9の場合を考えました。
K = 1.9の場合,図10に示すように,閉ループ伝達関数の極は2つの複素数(共役複素数)となっているように見えます。
また,図11に示すように,開ループ伝達関数のボード線図から位相余裕PM = 49.55°となります。
したがって,この場合,システムは安定です。
図12のLTspiceでの時間領域シミュレーションでは,オーバーシュートが発生しております。
オーバーシュートのピークとアンダーシュート*1のピークを半周期と捉えて振動周波数を見積もると,1.2 kHz (= 7,540 rad/s)となります。
これは,図10の閉ループ伝達関数の極の虚部と一致しているように見えますね!



K = 4.39の場合
K = 4.39の場合,図13に示すように,閉ループ伝達関数の極は2つの複素数(共役複素数)となっているように見えますが,
ついに虚軸にまで達し,まさに左半平面から右半平面に堕ちて行く安定限界となっています。
また,図14に示すように,開ループ伝達関数のボード線図から位相余裕PMはほぼ零(= −0.07°)となっています。
図15のLTspiceでの時間領域シミュレーション持続振動が発生しています。
振動周波数は1.67 kHz (=10,493 rad/s)であり,やはり,図13の閉ループ伝達関数の極の虚部と一致します。



移動平均フィルタとむだ時間がなかった場合
図4において,移動平均フィルタとむだ時間がなかった場合,開ループ・閉ループ伝達関数は図16のように描けます。 図2と同じく,Kを0.2 ~ 8まで変化させた場合のアニメーションとなります。

閉ループ伝達関数の極は実軸上にあるため振動せず,Kを大きくしていくと,ただひたすらに実軸を負の方向に移動していきます。 言い換えれば(KI/KP = R/Lとなるように設定し,極零相殺したため)一次遅れ系であり,Kを大きくすると,理論上はいくらでも応答を速くできることが分かります。 実際には操作量(制御入力=電圧)に制約があるため(PWMインバータの直流電圧等),応答速度には限界があります。
しかし,これに移動平均フィルタとむだ時間を追加すると,図2のような複雑な挙動になるというのはなかなかに興味深いですね🎵
あとがき
私は回路と制御の世界で生きてきたので,2次元や3次元に分布する物理量を描くコンター図に少し憧れていました😅 いました? いや,今でもOpenFOAMのような3次元CAEツールを使いこなす人には憧れを抱きますね🤩
今回は,水戸にある妻の実家から記事を投稿しました。 子どもたちはじいじ・ばあばと一緒に遊べて大変楽しいようです🤣 明日は天気が好転すると良いのですが…。
【追記】K = 1.9の場合の閉ループ伝達関数の極の実部について
極の実部にも言及しておくべきでしたね😅 図10に見える2つの極(複素共役)を
とすると,閉ループ伝達関数の分母多項式は,次式を因数として含みます。
これを,2次遅れ系の標準的な分母多項式
と比較すれば,
を満足するはずです。 (9),(10)式をζ,ωnについて解けば,
を得ます。 逆に,(9),(10)式をσp,ωpについて解けば,
を得ます(注:(13)式は(9)式とまるっきり同じです。最初からσpは解けています💦)。
図10において,sp = −4,000 ± j7,500と読み取れば,
と計算できます。特に減衰係数ζは正しいのでしょうか?
LTspiceでωn = 1,ζ = 0.4706の場合の2次遅れ系のステップ応答をシミュレーションしてみると──。

オーバーシュートのピークからアンダーシュートのピークの間の時間は,(LTspiceのカーソルで読み取れば)図示の通り3.542 sでした。 これは半周期なので1周期では倍の7.084 s,その逆数は0.1412 Hzとなって,2πを掛けて角周波数とすれば0.887 rad/sとなります。 これが前述のωpに該当するはずです。 実際,計算してみると,
となって,概ね正しいことが分かります。
※追記(2020/08/11):正のσpと正のζが対応するように数式を誤っていたので,負のσpと正のζが対応するように訂正しました。