传统PID(位置式PID控制)调节:

这种算法的缺点是,由于全量输出,每次输出均与过去的状态有关,计算时要对
e(k) 进行累加,计算机运算工作量大。而且,因为计算机输出的 u(k) 对应的是执行机构的实际位置,如计算机出现故障, u(k) 的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成重大的生产事故,因而产生了增量式
PID 控制算法。

代码如下:

 import matplotlib.pyplot as plt
class Pid:
def __init__(self,set_value = 100,now_value = 0,error_sum = 0,error_value = 0,error_last = 0,kp = 0,ki = 0,kd = 0):
self.set_value = set_value
self.now_value = now_value
self.error_sum = error_sum
self.error_value = error_value
self.error_last = error_last
self.kp = kp
self.ki = ki
self.kd = kd
pid = Pid(100,100,0,0,0,0.7,0.1,0.1)
data = []
i = 100
while i:
pid.error_value = pid.set_value - pid.now_value
pid.error_sum += pid.error_value
pid.now_value = pid.kp * (pid.error_value + pid.ki * pid.error_sum + pid.kd * (pid.error_value - pid.error_last))
print(pid.now_value)
data.append(pid.now_value)
pid.error_last = pid.error_value
i = i - 1
#打印输出图表的部分
plt.plot(data)
plt.title("kp=" + (str)(pid.kp) + " ki=" + (str)(pid.ki) + " kd=" + (str)(pid.kd))
plt.ylabel('output')
plt.xlabel('i')
plt.show()

波形如下(kp,ki,kd的参数需自行调节):

增量式PID控制调节:

代码如下:

import matplotlib.pyplot as plt
class Pid:
def __init__(self,set_value = 100,now_value = 0,add_value = 0,last_value = 0,error_value = 0,error_last = 0,error_last_last = 0,kp = 0,ki = 0,kd = 0):
self.set_value = set_value
self.now_value = now_value
self.add_value = add_value
self.last_value = last_value
self.error_value = error_value
self.error_last = error_last
self.error_last_last = error_last_last
self.kp = kp
self.ki = ki
self.kd = kd
pid = Pid(100,100,0,0,0,0,0,0.9,0.07,0.02)
data = []
i = 100
while i:
pid.error_value = pid.set_value - pid.now_value
pid.add_value = pid.kp * (pid.error_value - pid.error_last) + pid.ki * pid.error_value + pid.kd * (pid.error_value - 2 * pid.error_last + pid.error_last_last)
pid.now_value += pid.add_value
print(pid.now_value)
data.append(pid.now_value)
pid.error_last = pid.error_value
pid.error_last_last = pid.error_last
i = i - 1 plt.plot(data)
plt.title("kp=" + (str)(pid.kp) + " ki=" + (str)(pid.ki) + " kd=" + (str)(pid.kd))
plt.ylabel('output')
plt.xlabel('i')
plt.show()

波形如下((kp,ki,kd的参数需自行调节)):

最新文章

  1. Nginx -- Gzip 压缩功能作用
  2. VFP不同句柄 同一事务处理 统一提交或回滚
  3. RouteData
  4. leetcode:32 最长有效括号
  5. qt编译mysql插件
  6. iOS ASIHTTPRequest用https协议加密请求
  7. Nginx 笔记与总结(1)编译安装
  8. java ajax传值 中文乱码
  9. DDR(一)
  10. Linux运维命令之一
  11. Oracle数据库——索引、视图、序列和同义词的创建
  12. [转]Best way to sort a DropDownList in MVC3 / Razor using helper method
  13. 移动收入超PC端 盛大文学战略转型初见成效
  14. Handler消息传递机制——Handler类简洁
  15. Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法
  16. css动画--元素上下跳动
  17. Linux 如何使用echo指令向文件写入内容
  18. shell编程快速入门及实战
  19. NetBeans Lookups Explained!
  20. Android Studio添加so文件并打包到APK的lib文件夹中

热门文章

  1. MySQL数据分析(7)-SQL的两大学习框架
  2. MySQL基础之二:主从复制
  3. jQuery源代码学习之十——动画Animate
  4. Flask 编写一个授权登录验证的模块(二)
  5. qt 创建及调用QT的 DLL
  6. DELPHI安卓动态权限申请
  7. ArcGIS超级工具SPTOOLS-锐角检查,获得内角并判断是否凸多边形,获得线(面)两个折点方向
  8. PHP魔术方法和魔法变量详解
  9. SQL-W3School-高级:SQL LIKE 操作符
  10. Java Web之过滤器(Filter)