一个pid的python代码

需在jupyter中运行,并安装ipywidgets scipy matplotlib numpy以及ipykernel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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)

  

posted on   风中狂笑  阅读(61)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示