需在jupyter中运行,并安装ipywidgets scipy matplotlib numpy以及ipykernel
from ipywidgets import interact, fixed from scipy.signal import lti import matplotlib.pyplot as plt import numpy as np def serie(sys1,sys2): num=np.polymul(sys1.num,sys2.num) den=np.polymul(sys1.den,sys2.den) return lti(num,den) def feedback(sys1,sys2): num=np.polymul(sys1.num,sys2.den) a=np.polymul(sys1.num,sys2.num) b=np.polymul(sys1.den,sys2.den) den=np.polyadd(a,b) return lti(num,den) def param(t,y): n=0 #indice del tiempo de levantamiento vf=y[-1]#valor final de la respuesta tp=t[np.argmax(y)] # tiempo pico Ma=(max(y)-y[-1])/y[-1]#porcentaje de maximo sobreimpulso while y[n]<vf: n+=1 tl=t[n]#tiempo de levantamiento e=abs(y-vf) #error absoluto ei=e[::-1]#error en orden invertido m=1 #indice del tiempo de establecimiento while ei[m]<2*vf/100: m+=1 ts=t[-m]# tiempo de establecimiento al 2% return print(f'%Amax={Ma*100}\nVf={vf}\ntp={tp}\ntl={tl}\nts={ts}') def pid_tuner(sys,ret=0.0,kp=10,ki=10,kd=10,delta_P=0.01,delta_I=0.01,delta_D=0.01): @interact(kp=(0.001,kp,delta_P),ki=(0.001,ki,delta_I),kd=(0.001,kd,delta_D),param_orig=['Yes','No'],param_cont=['Yes','No']) def CONTROLAR(kp,ki,kd,param_orig,param_cont): ts,ys=sys.step() plt.plot(ts,ys,label='Sistema sin controlar') plt.legend(loc='best') cont=lti([kd,kp,ki],[1,0]) ser=serie(cont,sys) fed=feedback(ser,lti([1],[1])) tc,yc=fed.step(T=ts) plt.plot(tc,yc,label='Sistema controlado') plt.legend(loc='best') plt.title('PID') plt.xlabel('T(s)') plt.ylabel('Amplitud') plt.grid() plt.show if param_orig=="Yes": print('\n Parametros del sistema origianal') param(ts,ys) if param_cont=='Yes': print('\n Parametros del sistema controlado') param(tc,yc) if __name__=='__main__': sys=lti([2],[1,2,3]) pid_tuner(sys)
标签:python,sys1,代码,pid,sys2,num,den,np,polymul From: https://www.cnblogs.com/dogingate/p/17255376.html