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二分法实现实例
Nov 21 Python
python字符串替换示例
Apr 24 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
python实现二叉树的遍历
Dec 11 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
python类中super() 的使用解析
Dec 19 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
python 实现aes256加密
Nov 27 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
php获取字段名示例分享
2014/03/03 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
详解PHP中的Traits
2015/07/29 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
浅析vue深复制
2018/01/29 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python利用ansible分发处理任务
2015/08/04 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
用python实现百度翻译的示例代码
2018/03/09 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
《夏夜多美》教学反思
2014/02/17 职场文书
助学贷款贫困证明
2014/09/23 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
食品药品安全责任书
2015/05/11 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA