【制御理論】PythonでPID制御のボード線図を描く

みなさま、お疲れ様です。先日こんな記事を書きました。

その結果、ボード線図は以下のようになると結論づけました。

書き終わった後に「え?本当?」って自分を疑い始めました。

エンジニアたるもの仮説、検証を行わないとダメですよね。ということで検証をしようという記事になります。pythonでPID制御のボード線図を描いてみて、仮説通りになるか?を見てみます。

ということで本記事は

PID制御のボード線図が2つゼロ点挿入しているようになっているか?を確認する!!!

という記事になります。本記事は以下の書籍を参考にしています。

ではやってみます。

スポンサーリンク

結論:PID制御のボード線図はゼロ点2個ある形(よかった~)

早速ですが、結論です。計算通りで合ってました。(よかった。よかった。)

以下にPythonで計算したボード線図を示します。(Kp=1,Ki=1,Kd=0.1です。)

いい感じに計算通りです。ゼロ点周波数も想定通りです。

以下がゼロ点の計算値です。0.18Hzと1.41Hzにゼロ点があります。上のボード線図を見ると同じポイントでゲインが折れていることが分かります。

ということで前回記事の計算通りの周波数特性となっていることが分かりました。

以下はその確認過程を記しておこうと思います。

PID制御のボード線図を確認したときのPythonスクリプト

jupyterlabを使用して以下のようなスクリプトを描いて確認しました。

まず、必要なライブラリをimportして、PID制御パラメータを入力します。

なんで?Kdだけ0.1にしてんの?について、少し説明しておきます。前回記事よりPID制御のゼロ点周波数は以下の計算式で計算できます。

$$(A,B)_1=(\frac{\frac{K_p}{K_i}-\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2},\frac{\frac{K_p}{K_i}+\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2})$$

この式の√の中身を見ると

$$\frac{K_p}{K_i})^2>4\frac{K_d}{K_i}$$

じゃないと解を持たないことが分かります。なぜなら√の中身が負になっちゃうから。なのでKdを他のKp,Kiに比べて小さい値に設定しないと成り立たないから、今回は適当に1/10に設定しています。

Kp,Kiが1なのは確かめ計算するのに楽そうだからです。

続いて、AとBを計算しています。

A,Bは以下の解を持つと書きましたが、結局B1=A2であり、A1=B2になっているので、解は一位に決まってますね。一応それの確かめ算としてsympyで計算しています。

$$(A,B)_1=(\frac{\frac{K_p}{K_i}-\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2},\frac{\frac{K_p}{K_i}+\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2})$$

$$(A,B)_2=(\frac{\frac{K_p}{K_i}+\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2},\frac{\frac{K_p}{K_i}-\sqrt{(-\frac{K_p}{K_i})^2-4\frac{K_d}{K_i}}}{2})$$

続いて、A,Bの逆数を取ってゼロ点周波数を計算しています。

角周波数から周波数に変えるために2πで割ってます。

あとは、PID制御の伝達関数定義して、ボード線図計算して、表示して終わりです。

はい。前回記事で導出したPID制御のボード線図と今回Pythonで計算させたボード線図が一致しているので、前回記事の導出過程も正しいと判断いたします。

ということで本記事は以上になります。

誰かの参考になれば幸いです。最後までお読みいただきありがとうございました!!!!