適応制御：モデル規範型リアプノフ法による設計

#概要
どうもこんにちは。
PIDで大体の制御はまかなえます。
一方で不安定系の場合、計測できない状態量があれば、モデルベースでオブザーバを用いた制御系を作る場合が有ります。
しかし、モデルベース制御を行うにはモデルのパラメータを同定する必要があります。
そうすると当然同定パラメータと実際のパラメータとの誤差が問題になり、制御がうまくいっていないときオブザーバーの数値が悪いのか、フィードバックゲインが悪いのか、数式モデル自体が間違っているのかわからなくなります。

今回は、**適応制御というパラメータを制御している時に調整**し、規範モデルと一致させる制御について実験したので、
まとめたいと思います。

#基礎理論
読んだ本的に基礎になるのは、リアプノフの安定定理とBarbalatの定理です。リアプノフの安定定理は、ググると良いです。
Barbalatの定理は直感的です。

----------------------------------
$g(t)$が$\displaystyle lim_{t \to \infty}g(t) <\infty$つまり、$g(\infty)$が有界（ある数値といえる）とき
且つ、$\int_0^{\infty} g(t)^2 dt <\infty $ つまり、$g(t)$の面積が有界のとき

$lim_{t \to \infty}g(t)  = 0$となる

--------------------
という定理です。これは、無限にいかない（ディラック関数のように面積は有界のものを除く）、且つ面積が有界なら０に収束するというものです。
面積が有界になるのは、$g(t)$が定常で0でなくなると面積が無限になるので定常0になるという風に考えられるでしょう。
細かい証明は知りません

#実践:一次遅れ系
###目的
規範モデル$y_M(s)=G_M(s) r(s)$と一致するように制御対象出力$y(s)$を制御する

###設定
$y(s) = G(s) u(s)$とします。

```math
G_M(s) = \frac{a_M}{s+b_M} \\
G(s) = \frac{a}{s+b}
``` 

###制御入力

```math
u=\theta_1 r+\theta_2 y
```
とします。この二つの$u=\theta_1 r+\theta_2 y ,y(s) = G(s) u(s)$というループをまとめると

```math
y(s)=\frac{b\theta_1}{s+(a-b\theta_2)} r
```
となります。$\theta$をうまく調整する事で規範モデルと一致するさせる事を目指します。つまり

```math
b\theta_1 = b_M\\
a-b\theta_2 = a_M
```
にθを調整する事で合わせます

###誤差システム
$e = y_M-y$としてeについての方程式を作ります。時刻歴で作ります

```math
\begin{eqnarray}
\dot{e} + a_M e &=& b_M r + (a -a_M)y-bu \\
&=&b{(b_M/b -\theta_1) r + [(a-a_M)/b -\theta_2] y }\\
&=& b {\tilde{ \theta_1} r + \tilde{\theta_2}y}
\end{eqnarray}
```
と新しい文字を定義して作ります。


###リアプノフ関数
ここから、$\theta$の調整則を作ります。安定性つまり誤差の収束を保証するためにリアプノフ関数Vを次のように作ります

```math
V(e,\tilde{\theta_1},\tilde{\theta_2}) = \frac{1}{2}e^2+\frac{1}{2} (q1\tilde{\theta_1}^2 + q2\tilde{\theta_2}^2)
```
正定関数となるのは二乗しかないので明らかです。ここで時間微分が負になれば、$e,\tilde{\theta_1},\tilde{\theta_2}$は0に収束します（リアプノフの安定定理的にはそうじゃないのだろうか）。

```math
\begin{eqnarray}
\dot{V} &=& e\dot{e} + {q1 \tilde{\theta_1} \dot{\tilde{\theta_1}} +q2 \tilde{\theta_2} \dot{\tilde{\theta_2}} }\\
&=& e( - a_M e +b( \tilde{ \theta_1} r + \tilde{\theta_2}y ))+ {q1 \tilde{\theta_1} \dot{\tilde{\theta_1}} +q2 \tilde{\theta_2} \dot{\tilde{\theta_2}} }\\
&=& -a_M e^2 + \tilde{\theta_1 } (q1 \dot{\tilde{\theta_1}} +e b r  )  +  \tilde{\theta_2} (q2 \dot{\tilde{\theta_2} -eby}  )
\end{eqnarray}
```
ここで、

```math
\dot{\tilde{\theta_1}} = -ebr/q1 \\
\dot{\tilde{\theta_2}} = -eby/q2\\

```
とすれば、

```math
\dot{V}=-a_M e^2
```
となり、負定となります。
ここで、Barbalatの定理を使います。$\int_0^{\infty} e(t)^2 dt  = \int_0^{\infty} \dot{V}/(-a_M) dt  = -a_M (V(\infty)-V(0)) < \infty$ となるため、

```math
lim_{t \to \infty}e(t)  = 0
```
と誤差なく追従できる結果になります。
$\tilde{\theta_{1,2}}$は実験した結果、特定の値に収束しますが0には収束しませんでした。おそらく、$\dot{V}$が$e$のみの関数になってしまっているため、負定を示しても0収束は示せず、有界になるという事までしか証明できないのでしょう。

$\dot{\tilde{\theta_1}} = \dot{(b_M/b -\theta_1)} = -\dot{\theta_1}$,$\dot{\tilde{\theta_2}} = \dot{(a-a_M)/b -\theta_2} = -\dot{\theta_2}$であるため


```math
\dot{\theta_1} = ebr/q1 \\
\dot{\theta_2} = eby/q2\\
```
に従ってθを更新すれば、よいことになります。誤差と出力・目標値を掛けるという非線形制御を行うので、通常の線形制御と全く動作が異なるだろうといえます。線形システムではなくなるので周波数帯域での評価も難しくなります。

#matlabで実験
![adaptive1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/11e0f2f3-2b95-8e93-471b-01bd4c9d9b22.png)

×箱はかけ算を意味しています。$g1 = b/q1 ,g2 = b/q2$です。初期値は０でやっています。

実際に目標値にsin波を指定して$y,y_M$を観測すると次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/564efc4b-40ce-42d9-c4e2-cde978f865bc.png)

最初はずれがありますが、徐々にすればなくなっているのがわかります。もっと長い時間見ると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/99cf92df-80c7-bfde-4215-e26a389efb8a.png)
誤差は完全に収束します。

```math
b\theta_1 = b_M\\
a-b\theta_2 = a_M
```
つまり

```math
\theta_1 = 5\\
\theta_2 = (3-1)/(-1) = -2
```
に調整してくれているかというと
![adaptive2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/333a27f7-a04c-cabb-8a60-269b9658184c.png)

と目的通り、規範モデルと一致するようコントローラのゲイン調節が行われています。

適応制御の実力を感じたのではないでしょうか

###高周波を入力した場合
目標値のsinを高周波にすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/ffae59e1-4db3-3ba8-f866-284389f9bb7c.png)

一致までにかなりの時間を要するようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b2b52852-529e-0702-5ae3-67e034044146.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/e9757792-9688-0797-8bda-4e40c90994f7.png)

###g1,g2を変化
g2を思いっきり小さく(0.01)にすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1b943db5-efee-b01d-75ff-eeb0791f56f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/408f846b-b78f-a813-2701-d71d298deea5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/4745c7c7-6b35-02ec-cdd8-8eb4f32fca80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/8145e295-3fcc-1541-c684-91774993d428.png)

θ2の調整が遅くなるため、ゆっくりしか誤差が減っていないのがわかります。
両方小さくすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/9ab53b17-9f3c-ede7-eab0-0b94ce3d7138.png)
両方初期値0でゆっくりしか変化しないため、出力がほぼ0になっています

#g1,2を大きくすると
![adap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/55ac84fb-43c2-a5f6-aa29-cce03296963e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/277c838e-f1af-13c9-5e54-c47012f08f9f.png)
振動的に細かく合わせている事がわかります。
実験時間を長くすると
![adap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/c42a977c-2e1a-e84a-bd06-097ccf13ca32.png)
完全に収束します、また、発散もしないようです。



#参考文献

* 適応制御　宮里義彦著　オーム社

今後は、倒立振子の計測角度には安定角に対し定常偏差が載っているので、この偏差を推定する方法を研究したいと思っています。ただ、難しい。
以前作った、倒立振子は完全にモデルベースで同定して作ったのですが、糸の上に載せるとモデルが変わり制御できなかったため、倒立振子に対して適応制御を適用して見ようと思います。