Python 实现PID控制一阶惯性系统[通俗易懂]

Python 实现PID控制一阶惯性系统[通俗易懂]1.PID.py#PID控制一阶惯性系统测试程序#*****************************************************************##增量式PID系统##*************************************…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1.PID.py

#  PID控制一阶惯性系统测试程序

#*****************************************************************#
#                      增量式PID系统                              #
#*****************************************************************#
class IncrementalPID:
    def __init__(self, P, I, D):
        self.Kp = P
        self.Ki = I
        self.Kd = D

        self.PIDOutput = 0.0             #PID控制器输出
        self.SystemOutput = 0.0          #系统输出值
        self.LastSystemOutput = 0.0      #上次系统输出值

        self.Error = 0.0                 #输出值与输入值的偏差
        self.LastError = 0.0
        self.LastLastError = 0.0

    #设置PID控制器参数
    def SetStepSignal(self,StepSignal):
        self.Error = StepSignal - self.SystemOutput
        IncrementValue = self.Kp * (self.Error - self.LastError) + self.Ki * self.Error + self.Kd * (self.Error - 2 * self.LastError + self.LastLastError)
        self.PIDOutput += IncrementValue
        self.LastLastError = self.LastError
        self.LastError = self.Error

    #设置一阶惯性环节系统  其中InertiaTime为惯性时间常数
    def SetInertiaTime(self,InertiaTime,SampleTime):
        self.SystemOutput = (InertiaTime * self.LastSystemOutput + SampleTime * self.PIDOutput) / (SampleTime + InertiaTime)
        self.LastSystemOutput = self.SystemOutput


# *****************************************************************#
#                      位置式PID系统                              #
# *****************************************************************#
class PositionalPID:
    def __init__(self, P, I, D):
        self.Kp = P
        self.Ki = I
        self.Kd = D

        self.SystemOutput = 0.0
        self.ResultValueBack = 0.0
        self.PidOutput = 0.0
        self.PIDErrADD = 0.0
        self.ErrBack = 0.0

    def SetInertiaTime(self, InertiaTime,SampleTime):
       self.SystemOutput = (InertiaTime * self.ResultValueBack + SampleTime * self.PidOutput) / (SampleTime + InertiaTime)
       self.ResultValueBack = self.SystemOutput

    def SetStepSignal(self,StepSignal):
        Err = StepSignal - self.SystemOutput
        KpWork = self.Kp * Err
        KiWork = self.Ki * self.PIDErrADD
        KdWork = self.Kd * (Err - self.ErrBack)
        self.PidOutput = KpWork + KiWork + KdWork
        self.PIDErrADD += Err
        self.ErrBack = Err




2.TestPID.py

import PID
import matplotlib.pyplot as plt
plt.figure(1) # 创建图表1
plt.figure(2) # 创建图表2

#测试PID程序
def TestPID(P, I, D):
    IncrementalPid = PID.IncrementalPID(P, I, D)
    PositionalPid = PID.PositionalPID(P, I, D)
    IncrementalXaxis = [0]
    IncrementalYaxis = [0]
    PositionalXaxis = [0]
    PositionalYaxis = [0]

    for i in range(1, 500):
        #增量式
        IncrementalPid.SetStepSignal(100.2)
        IncrementalPid.SetInertiaTime(3,0.1)
        IncrementalYaxis.append(IncrementalPid.SystemOutput)
        IncrementalXaxis.append(i)

        #位置式
        PositionalPid.SetStepSignal(100.2)
        PositionalPid.SetInertiaTime(3,0.1)
        PositionalYaxis.append(PositionalPid.SystemOutput)
        PositionalXaxis.append(i)

    plt.figure(1)      # 选择图表1
    plt.plot(IncrementalXaxis, IncrementalYaxis,'r')
    plt.xlim(0,120)
    plt.ylim(0,140)
    plt.title("IncrementalPID")

    plt.figure(2)     # 选择图表2
    plt.plot(PositionalXaxis, PositionalYaxis, 'b')
    plt.xlim(0,120)
    plt.ylim(0,140)
    plt.title("PositionalPID")

    plt.show()

if __name__ == "__main__":
    TestPID(4.5,0.5,0.1)



3.实现效果:

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186046.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 汇编学习 step by step[通俗易懂]

    汇编学习 step by step[通俗易懂]转自:http://hi.baidu.com/hkbyest16位汇编对于一个汇编初学者,首先必看的就是王爽老师的这本《汇编语言》,虽然它不是很完整,虽然它有一些错漏,虽然它需要一些前置知识(详见书籍前言部分,前言一定要仔细看!),但是王爽老师独特的教学理念构造了这本循序渐进的书,我们从中可以抛开对汇编语言的畏惧心态,一步一步的深入进去,更可喜的是在这本书里我们可以学到宝贵的底层编程意识和

    2022年10月13日
    2
  • Thread.MemoryBarrier 方法

    Thread.MemoryBarrier 方法classFoo{int_answer;bool_complete;voidA(){_answer=123;_complete=true;}voidB(){if(_complete)Console.Wri…

    2022年7月12日
    18
  • java 实用 代码_java新手实用代码有哪些?java新手代码大全「建议收藏」

    java 实用 代码_java新手实用代码有哪些?java新手代码大全「建议收藏」对于java新手来说,积累一些实用的基础代码还是很有必要的,毕竟写代码是需要实践以及积累的,那么接下来,我们就来给大家分享一些java新手代码给大家参考!1.字符串有整型的相互转换Stringa=String.valueOf(2);//integertonumericstringinti=Integer.parseInt(a);//numericstringtoan…

    2022年6月21日
    30
  • 背包问题九讲笔记_01背包[通俗易懂]

    背包问题九讲笔记_01背包[通俗易懂]摘自TianyiCui童鞋的《背包问题九讲》,稍作修改,方便理解。01背包问题描述已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。限制:每种物品只有一件,可以选择放或者不放问题:在不超过背包容量的情况下,最多能获得多少价值或收益相似问题:在恰好装满背包的情况下,最多能获得多少价值或收益这里,我们先讨论在不超过背包容量的情况

    2022年7月12日
    25
  • 记录一次XordDos(BillGates)木马导致Centos kworker线程占满CPU资源的解决过程「建议收藏」

    记录一次XordDos(BillGates)木马导致Centos kworker线程占满CPU资源的解决过程「建议收藏」1.问题现象​ 通过top命令查看资源占用发现有大量kworker线程占用CPU资源,如下图。怀疑是系统问题或平台程序导致的问题。2.是否是程序导致的论证过程​ 因平台有两部分组成socket+web端,考虑可能是两者中的一个导致的,因此采用以下三种方式验证:​ [1]只关掉socekt端,问题依旧出现​ [2]只关掉web端,问题依旧出现​ [3]全部关掉,问题依旧出现​ …

    2025年11月27日
    6
  • 各种聚类算法的介绍和比较「建议收藏」

    一、简要介绍1、聚类概念聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。2、聚类和分类的区别聚类技术通常又被称为无监督学习,因为与监督学习不同,在聚类中那些表示数据类别的分类或者分组信息是没有的。Clustering(聚类),

    2022年4月16日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号