python实现PID算法及测试的例子


Posted in Python onAugust 08, 2019

PID算法实现

import time

class PID:
  def __init__(self, P=0.2, I=0.0, D=0.0):
    self.Kp = P
    self.Ki = I
    self.Kd = D
    self.sample_time = 0.00
    self.current_time = time.time()
    self.last_time = self.current_time
    self.clear()
  def clear(self):
    self.SetPoint = 0.0
    self.PTerm = 0.0
    self.ITerm = 0.0
    self.DTerm = 0.0
    self.last_error = 0.0
    self.int_error = 0.0
    self.windup_guard = 20.0
    self.output = 0.0
  def update(self, feedback_value):
    error = self.SetPoint - feedback_value
    self.current_time = time.time()
    delta_time = self.current_time - self.last_time
    delta_error = error - self.last_error
    if (delta_time >= self.sample_time):
      self.PTerm = self.Kp * error#比例
      self.ITerm += error * delta_time#积分
      if (self.ITerm < -self.windup_guard):
        self.ITerm = -self.windup_guard
      elif (self.ITerm > self.windup_guard):
        self.ITerm = self.windup_guard
      self.DTerm = 0.0
      if delta_time > 0:
        self.DTerm = delta_error / delta_time
      self.last_time = self.current_time
      self.last_error = error
      self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)
  def setKp(self, proportional_gain):
    self.Kp = proportional_gain
  def setKi(self, integral_gain):
    self.Ki = integral_gain
  def setKd(self, derivative_gain):
    self.Kd = derivative_gain
  def setWindup(self, windup):
    self.windup_guard = windup
  def setSampleTime(self, sample_time):
    self.sample_time = sample_time

测试PID算法

import PID
import time
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline
#这个程序的实质就是在前九秒保持零输出,在后面的操作中在传递函数为某某的系统中输出1

def test_pid(P = 0.2, I = 0.0, D= 0.0, L=100):
  """Self-test PID class

  .. note::
    ...
    for i in range(1, END):
      pid.update(feedback)
      output = pid.output
      if pid.SetPoint > 0:
        feedback += (output - (1/i))
      if i>9:
        pid.SetPoint = 1
      time.sleep(0.02)
    ---
  """
  pid = PID.PID(P, I, D)

  pid.SetPoint=0.0
  pid.setSampleTime(0.01)

  END = L
  feedback = 0

  feedback_list = []
  time_list = []
  setpoint_list = []

  for i in range(1, END):
    pid.update(feedback)
    output = pid.output
    if pid.SetPoint > 0:
      feedback +=output# (output - (1/i))控制系统的函数
    if i>9:
      pid.SetPoint = 1
    time.sleep(0.01)

    feedback_list.append(feedback)
    setpoint_list.append(pid.SetPoint)
    time_list.append(i)

  time_sm = np.array(time_list)
  time_smooth = np.linspace(time_sm.min(), time_sm.max(), 300)
  feedback_smooth = spline(time_list, feedback_list, time_smooth)
  plt.figure(0)
  plt.plot(time_smooth, feedback_smooth)
  plt.plot(time_list, setpoint_list)
  plt.xlim((0, L))
  plt.ylim((min(feedback_list)-0.5, max(feedback_list)+0.5))
  plt.xlabel('time (s)')
  plt.ylabel('PID (PV)')
  plt.title('TEST PID')

  plt.ylim((1-0.5, 1+0.5))

  plt.grid(True)
  plt.show()

if __name__ == "__main__":
  test_pid(1.2, 1, 0.001, L=80)
#  test_pid(0.8, L=50)

结果

python实现PID算法及测试的例子

以上这篇python实现PID算法及测试的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Python遍历pandas数据方法总结
Feb 09 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
python字典改变value值方法总结
Jun 21 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
pip安装python库的方法总结
Aug 02 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
python打开文件的方式有哪些
Jun 29 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
python开头的coding设置方法
Aug 08 #Python
pycharm 安装JPype的教程
Aug 08 #Python
Python学习笔记之lambda表达式用法详解
Aug 08 #Python
python读取大文件越来越慢的原因与解决
Aug 08 #Python
Python实现Singleton模式的方式详解
Aug 08 #Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 #Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 #Python
You might like
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
python中uuid模块实例浅析
2020/12/29 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
C语言笔试题
2014/09/04 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
重点工程汇报材料
2014/08/27 职场文书
初中重阳节活动总结
2015/05/05 职场文书
工作报告范文
2019/06/20 职场文书
python办公自动化之excel的操作
2021/05/23 Python