一个pid的python代码
需在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)
浙公网安备 33010602011771号