首页 > 编程语言 >一个pid的python代码

一个pid的python代码

时间:2023-03-25 19:11:22浏览次数:32  
标签:python sys1 代码 pid sys2 num den np polymul

需在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

相关文章