Pythonで学ぶ制御工学　第20弾：開ループ系の設計仕様

# #Pythonで学ぶ制御工学< 開ループ系の設計仕様 >

##はじめに
基本的な制御工学をPythonで実装し，復習も兼ねて制御工学への理解をより深めることが目的である．
その第20弾として「開ループ系の設計仕様」を扱う．

##開ループ系の設計仕様
制御設計において，閉ループ系の設計仕様は重要な概念であるが，今回は，それらについて問題点を解決する開ループ系の設計仕様について学習する．まず，閉ループ系の問題点にまとめたものを示す．
![image](https://user-images.githubusercontent.com/61382602/112303088-3c2b5300-8cdf-11eb-896a-0a280c8c2e6d.png)

したがって，以下では**安定性・速応性・減衰性・定常偏差**について，開ループ系の設計仕様がどのようになるのかを見ていくこととする．

##安定性
![image](https://user-images.githubusercontent.com/61382602/112303544-bc51b880-8cdf-11eb-93f5-0ede612e13fb.png)
###実装
安定性について，入出力信号の関係性から見るための実装とナイキスト線図を作成するプログラムをここで示す．

#####ソースコード：入出力信号の関係性と安定性
```python:changed_amplitude_sin.py
"""
2021/03/24
@Yuya Shimizu

正弦波を入力としたときの出力の振幅変化
"""

import numpy as np
import matplotlib.pyplot as plt
from control import tf, margin
from control.matlab import lsim
from for_plot import plot_set

P = tf([0, 1], [1, 1, 1.5, 1])
P2 = tf([0, 1], [1, 2, 2, 1])


#位相が180deg遅れる周波数(w_pc)を取得
_, _, wpc, _ = margin(P)
_, _, wpc2, _ = margin(P)

t = np.arange(0, 30, 0.01)  #シミュレーション時間
u = np.sin(wpc * t)
u2 = np.sin(wpc2 * t)
y = 0 * u
y2 = 0 * u2

#描画
fig, ax = plt.subplots(2, 2)
fig2, ax2 = plt.subplots(2, 2)
for i in range(2):
    for j in range(2):
        #出力をネガティブフィードバックして次の時刻の入力を生成
        u = np.sin(wpc*t) - y
        y, t, x0 = lsim(P, u, t, 0)

        u2 = np.sin(wpc2*t) - y2
        y2, _, _ = lsim(P2, u2, t, 0)

        ax[i, j].plot(t, u, ls='--', label = 'u')
        ax[i, j].plot(t, y, label = 'y')
        plot_set(ax[i, j], 't', 'u, y')

        ax2[i, j].plot(t, u2, ls='--', label = 'u')
        ax2[i, j].plot(t, y2, label = 'y')
        plot_set(ax2[i, j], 't', 'u, y')
        
fig.tight_layout()
fig.suptitle("unstable; input < output", size = 15)
fig2.tight_layout()
fig2.suptitle("stable; input > output", size = 15)

plt.show()
```
#####出力
![unstable](https://user-images.githubusercontent.com/61382602/112304868-5c5c1180-8ce1-11eb-96c2-680540320156.png)
![stable](https://user-images.githubusercontent.com/61382602/112304870-5cf4a800-8ce1-11eb-987e-c5e5fdd94095.png)
いま．位相のずれた出力を入力として使って変化を見ている．不安定な図（上段）では，入力よりも出力のほうが常に大きくなっている．これは，出力を次の入力に使うことを考えれば，どんどん大きくなっていく，すなわち発散していくことが予想できる．図の実線が出力を表しているが，発散していることが分かる．

一方，安定な図（下段）では，入力よりも出力のほうが常に小さくなっている．これは，出力を次の入力に使うことを考えれば，どんどん小さくなっていく，すなわちある値に収束していくことが予想できる．図の実線が出力を表しているが，ある値に近づいていることが分かる．



#####ソースコード：ナイキスト線図
```python:Nyquist.py
"""
2021/03/24
@Yuya Shimizu

安定なナイキスト線図と不安定なナイキスト線図
"""

import matplotlib.pyplot as plt
from control import tf, nyquist
from control.matlab import logspace
from for_plot import plot_set

P = tf([0, 1], [1, 1, 1.5, 1])
P2 = tf([0, 1], [1, 2, 2, 1])

##ナイキスト線図
fig, ax = plt.subplots(1, 2)

#閉ループ系が不安定になる場合
P = tf([0, 1], [1, 1, 1.5, 1])
x, y, _ = nyquist(P, logspace(-3, 5, 1000), Plot=False)
ax[0].plot(x, y, color='k')
ax[0].plot(x, -y, ls='--', color='k')
ax[0].scatter(-1, 0, color='r')
ax[0].set_title('unstable')
plot_set(ax[0], 'Re', 'Im')

#閉ループ系が不安定になる場合
P = tf([0, 1], [1, 2, 2, 1])
x, y, _ = nyquist(P, logspace(-3, 5, 1000), Plot=False)
ax[1].plot(x, y, color='k')
ax[1].plot(x, -y, ls='--', color='k')
ax[1].scatter(-1, 0, color='r')
ax[1].set_title('stable')
plot_set(ax[1], 'Re', 'Im')

fig.suptitle('Nyquist', size=15)
plt.show()
```
#####出力
![Nyquist](https://user-images.githubusercontent.com/61382602/112304891-641bb600-8ce1-11eb-80a7-f7d80eff9dd5.png)
図の赤い点が位相交差周波数のときの開ループ系すなわち，$(-1, j0)$を表しており，不安定な時はその左に，安定な時はその右にナイキスト線図が描かれていることが分かる．

##速応性・減衰性
![image](https://user-images.githubusercontent.com/61382602/112303662-e60adf80-8cdf-11eb-8eff-522060fb7ead.png)

##定常偏差
![image](https://user-images.githubusercontent.com/61382602/112303837-1e122280-8ce0-11eb-912d-de83cbed7fb5.png)

##要求する開ループ系の性能
![image](https://user-images.githubusercontent.com/61382602/112304107-70ebda00-8ce0-11eb-984a-fb2574fdc31c.png)

##感想
閉ループ系と開ループ系は単純にフィードバックの有無の違いで別物であると思っていたが，実際にはそうではなく，閉ループ系についての挙動を理解しやすくするために用いられる形であり，ナイキスト線図などはその開ループ系での安定性を判別する手法の1つであることを改めて学んだ．これは制御系の開発・設計において非常に重要になってくると思う．

##参考文献
Pyhtonによる制御工学入門　　南 祐樹　著　　オーム社