pid制御によるランダム信号の除去
python controlでpid制御のシミュレーションを行おうとしています。
系にステップ応答を入力した際に制御パラメータを色々と変え、過渡応答がどのようになるのかを確かめることはできました。
次に、入力としてランダムな信号を入れて、フィードバック制御により偏差をうまく減らせるか、を確かめたいのですが、どういうコードにすれば良いかが分かりません。
よろしくお願いします
発生している問題・エラーメッセージ
Parameter ``U``: Wrong shape (rows, columns): (881,). Expected: (300,) or (1, 300).
該当のソースコード
python
1 2import numpy as np 3from control.matlab import * 4import matplotlib.pyplot as plt 5import scipy 6import sympy as sp 7from scipy import signal 8 9#むだ時間 10num_delay, den_delay=pade(0.001,3) 11P_pade=tf(num_delay,den_delay) 12 13 14 15#ボード線図、伝達関数のグラフの体裁を整える 16def linestyle_generator(): 17 linestyle=['-', '--', '-.', ':'] 18 lineID=0 19 while True: 20 yield linestyle[lineID] 21 lineID=(lineID+1) % len(linestyle) 22 23def plot_set(fig_ax, *args): 24 fig_ax.set_xlabel(args[0]) 25 fig_ax.set_ylabel(args[1]) 26 fig_ax.grid(ls=':') 27 if len(args)==3: 28 fig_ax.legend(loc=args[2]) 29 30def bodeplot_set(fig_ax,*args): 31 fig_ax[0].grid(which="both",ls=':') 32 fig_ax[0].set_ylabel('Gain [dB]') 33 34 fig_ax[1].grid(which="both", ls=':') 35 fig_ax[1].set_xlabel('$\omega$ [rad/s]') 36 fig_ax[1].set_ylabel('Phase [deg]') 37 38 if len(args)>0: 39 fig_ax[1].legend(loc=args[0]) 40 if len(args)>1: 41 fig_ax[0].legend(loc=args[1]) 42 43 44# 伝達関数の定義 45omega_n=1259.56 46zeta=0.704116 47k=0.974673 48L=0.0004 49 50 51P3=tf([k*omega_n**2],[1,2*zeta*omega_n,omega_n**2])*P_pade 52 53 54ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 55 56#P制御(成功例) 57 58kp=(0.6,0.8,1.2) 59ref=1 60 61LS=linestyle_generator() 62fig, ax=plt.subplots() 63for i in range(3): 64 Kp=tf([0,kp[i]],[0,1]) 65 Gyr=feedback(1,P3*Kp) 66 67 y,t=step(Gyr, np.arange(0,0.03,0.0001)) #ここを変えたい 68 69 pltargs={'ls' : next(LS), 'label' : '$k_p$='+str(kp[i])} 70 ax.plot(t,y*ref, **pltargs) 71 72ax.axhline(ref , color="k",linewidth=0.5) 73plot_set(ax, 't', 'y','best') 74 75 76 77 78 79 80#p制御(うまくいかない) 81 82kp=(0.6,0.8,1.2) 83ref=1 84 85LS=linestyle_generator() 86fig, ax=plt.subplots() 87for i in range(3): 88 Kp=tf([0,kp[i]],[0,1]) 89 Gyr=feedback(1,P3*Kp) 90 91 y,t=lsim(Gyr,x_1,dt)#変更後 92 93 pltargs={'ls' : next(LS), 'label' : '$k_p$='+str(kp[i])} 94 ax.plot(t,y*ref, **pltargs) 95 96ax.axhline(ref , color="k",linewidth=0.5) 97plot_set(ax, 't', 'y','best')
試したこと
最初は x_1,t_1 としていたのですが、「time values must be equally spaced.」というエラーが出たので、t_1のデータの各要素の差分をとって(np.diff)それを平均したものをdtとしました。
補足情報(FW/ツールのバージョンなど)
x_1,t_1というのは、ランダム信号のデータです。(位置、時間幅)
とりあえず上記のプログラミングはp制御のみです。
参考図書:『pythonによる制御工学入門』

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/08/27 13:57