Python で感度関数、相補感度関数を描く
制御工学で使用される感度関数、相補感度関数を Python で解く方法のメモ。
感度関数は制御対象の伝達関数が変動した場合の出力への影響を示し、相補感度関数はノイズに対する制御量への影響を示します 全ての周波数で感度関数、相補感度関数を同時に小さくはできないので、通常低周波領域で感度関数を小さく、高周波領域で相補感度関数を小さくするように制御系を設計します。(通常目標値は低周波成分を、ノイズは高周波成分を多く含むため)
以下では最適レギュレータを例に感度関数(実線)、相補感度関数(破線)をプロットしています。
import numpy as np import scipy as sp import control as ct from matplotlib import pyplot as plt A = np.array([[0, 1], [0, -1]]) B = np.array([[0], [1]]) Q = np.diag([2, 1]) R = np.array([[1]]) K, S, E = ct.matlab.lqr(A, B, Q, R) Abk = A-B.dot(K) D1 = 1 D2 = 0 # mag1^(-1) : 感度関数 mag1, phase1, freq1 = ct.matlab.bode(ct.ss(A, B, K, D1), dB=True, Hz=True, Plot=False) # mag2 : 相補感度関数 mag2, phase2, freq2 = ct.matlab.bode(ct.ss(Abk, B, K, D2), dB=True, Hz=True, Plot=False) plt.figure() plt.semilogx(freq1, -mag1, freq2, mag2, "--") plt.ylabel("Gain[dB]") plt.xlabel("Frequency[Hz]") plt.show()
