传递函数离散化和PID控制的Python实现

本文参考【Matlab】M文件编写PID调节传递函数 - 知乎 (zhihu.com),和

(3条消息) 传递函数如何转化为差分方程_乄微风绕指柔乄的博客-CSDN博客_传递函数离散化为差分方程感谢这两位大大,声明:本人小白,错误之处多多体谅

寒假车队培训:要求用G(s)=133/(s^2+25s)的传递函数设计一个增量式的pid

查看相关流程可知,首先要将S域的传递函数改写成差分方程,需要按照下述流程,S域传递函数——Z域离散函数——差分方程

我们使用一阶向前差分S=(Z-1)/T,和Y(k-n)=Y(k)*Z^(-n)得到

Z变换后的输出量和控制量之间的关系为

        Y(k)=133*T^2*U(k-2)+(2-25*T)*Y(k-1)+(25*T-1)*Y(k-2)

其中,Y为输出量,U为控制量,也就是说,再pid控制中,传递函数传递的是输出和控制量之间的关系。得到差分方程之后就可以方便多啦。

import matplotlib.pyplot as plt
import numpy as np
#正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
#正常显示负号
plt.rcParams['axes.unicode_minus']=False
#限制幅度
def limit(a,b):    
    if a>b:        
        return b
    else:       
        return a
#增量式pid
class PID_incremental():    
    def __init__(self,wantted,Kp,Ki,Kd,delta_time):        
        self.Kp=Kp
        self.Ki=Ki        
        self.Kd=Kd        
        self.wantted_val=wantted        
        self.time=delta_time        
        self.sum_err = 0        
        self.now_err = 0        
        self.last_err = 0        
        self.TotalMax = 1100        
        self.last_val = 0        
        self.last_last_val = 0        
        self.now_val = 0       
        self.last_control = 0        
        self.last_last_control = 0        
        self.now_control = 0    
    def iterator(self):        
        '''Z变换后的输出量和控制量之间的关系
        Y(k)=133*T^2*U(k-2)+(2-25*T)*Y(k-1)+(25*T-1)*Y(k-2)'''        
        self.now_val = 133*(self.time)**2*self.last_last_control+ (2-25*self.time)*self.last_val+(25*self.time-1)*self.last_last_val        
        self.last_last_err = self.last_err        
        self.last_err = self.now_err        
        self.now_err = self.wantted_val - self.now_val                                
        #控制器输出序列        
        self.change_control = self.Kp * (self.now_err - self.last_err) + self.Ki * self.now_err + self.Kd * (self.now_err - 2 * self.last_err+ self.last_last_err)        
        self.now_control += self.change_control*self.time        
        #限制now_val的最大值        
        self.now_control = limit(self.now_control,self.TotalMax)        
        self.last_last_control = self.last_control        
        self.last_control = self.now_control        
        self.last_last_val = self.last_val        
        self.last_val = self.now_val        
        return self.now_val
pid_incremental_bf=PID_incremental(133,300,0.0,0.0,0.01)
pid_incremental_af=PID_incremental(133,150,0.015,0.01,0.01)
pid_incremental_val_bf=[]
pid_incremental_val_af=[]
for i in range(100):    
    pid_incremental_val_bf.append(pid_incremental_bf.iterator())    
    pid_incremental_val_af.append(pid_incremental_af.iterator())
x=np.arange(0,100)
plt.title("增量式PID")
plt.xlabel('step/s')
plt.ylabel('current_value')
plt.plot(x,pid_incremental_val_bf)
plt.plot(x,pid_incremental_val_af)
plt.legend(['Adjust_Before','Adjust_After'])

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfMzY1NDU1OTM=,size_20,color_FFFFFF,t_70,g_se,x_16

### 回答1: 离散PID(Proportional-Integral-Derivative)是一种用于控制系统的反馈控制算法。在Python中,可以使用离散PID算法来实现控制系统的自动控制。 离散PID算法由三个部分组成:比例控制、积分控制和微分控制。比例控制通过计算给定值与实际值之间的差异,来产生一个与误差成比例的控制量。积分控制通过对误差的累加来减小长期的误差,确保系统稳定。微分控制通过计算误差变化的速率,来提前预测和预防系统超调。 在Python中,可以通过定义一个离散PID类来实现离散PID算法。首先,需要定义比例增益、积分时间和微分时间等参数。然后,在控制循环中,根据当前的误差计算比例控制量、积分控制量和微分控制量,并将它们加权求和得到总的控制量。 例如,假设目标值为target,当前值为current,误差为error,比例增益为Kp,积分时间为Ti,微分时间为Td,则可以使用以下代码实现离散PID算法: ```python class DiscretePID: def __init__(self, Kp, Ti, Td): self.Kp = Kp self.Ti = Ti self.Td = Td self.integral = 0 self.previous_error = 0 def control(self, target, current): error = target - current # Proportional control p_control = self.Kp * error # Integral control self.integral += error i_control = self.Kp / self.Ti * self.integral # Derivative control d_control = self.Kp * self.Td * (error - self.previous_error) # Total control total_control = p_control + i_control + d_control self.previous_error = error return total_control ``` 通过使用以上代码,可以实现离散PID算法,用于控制系统的自动控制。当目标值与当前值的误差变化时,算法会根据比例增益、积分时间和微分时间等参数,自动调整控制量,实现精确的控制目标。 ### 回答2: Python离散PID是用于控制系统的一种算法。PID代表比例(Proportional)、积分(Integral)和微分(Derivative),是一种经典的反馈控制算法。 离散PID算法在控制系统中广泛应用,是通过对反馈信号进行处理,不断调整控制量以使系统保持稳定的一种算法。在离散PID算法中,比例项通过与误差信号的乘积获得,积分项通过对误差信号的累加获得,而微分项通过误差信号的变化率获得。通过合理设置比例、积分和微分参数,可以使系统达到期望的响应和稳定性。 Python作为一种流行的编程语言,提供了丰富的库和函数,可以方便地实现离散PID算法。比如,可以使用NumPy库进行矩阵运算,使用Matplotlib库进行数据可视化等。此外,Python还提供了许多优秀的控制系统库,如SciPy、Control等,可以进一步简化离散PID算法的实现过程。 在使用Python实现离散PID算法时,首先需要定义控制系统的输入、输出以及期望的响应。然后需要根据实际需求设置比例、积分和微分参数,并利用控制系统的输入、输出以及误差信号进行计算和反馈调整。最后,可以通过数据可视化的方式查看控制系统的响应情况,进一步优化参数设置和算法。 综上所述,Python离散PID算法是一种用于控制系统的算法,可以通过合理设置比例、积分和微分参数,对控制系统进行稳定的调节。通过Python的丰富库和函数,可以方便地实现离散PID算法,并进行进一步的优化和调试。 ### 回答3: Python离散PID是一种用于控制系统的算法,它使用离散时间步骤进行计算和调整。PID代表比例(Proportional)、积分(Integral)和微分(Derivative)。离散PID通过基于当前时间步长的误差和系统状态的变化率来计算控制输出。 在离散PID中,比例项(P)基于当前误差来计算,其值与误差成比例。比例项的作用是根据误差的大小调整输出,以使系统更快地达到目标状态。 积分项(I)是与误差累积成比例的项。它用于校正系统的静态误差,使系统能够在长时间内保持稳定。积分项的作用是根据误差的积累量来调整输出,以消除系统的稳态误差。 微分项(D)基于误差变化率的比例来计算。它用于预测误差的未来变化趋势,并相应调整输出。微分项的作用是防止系统过冲或震荡,以实现更好的响应特性。 离散PID通过将比例、积分和微分项分别乘以对应的调节参数,然后将它们相加,得到最终的控制输出。这个输出将被用于系统的调节,以使系统的响应更接近期望的目标。 在Python中,可以使用不同的库或代码实现离散PID算法。一些常用的Python库包括NumPy, SciPy和control等。使用这些库,可以方便地进行离散PID控制器的设计和实现,并根据具体系统需求进行参数调节和性能优化。 总结来说,离散PID是一种基于离散时间步长的控制算法,它结合比例、积分和微分项,通过计算和调整来实现系统的控制。在Python中,离散PID可以通过使用相应的库和代码实现,并根据系统的需求进行参数调节和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值