【学习草稿】pid控制基础实现--往水桶注水

pid

1)非常通俗易懂的PID控制(1)https://zhuanlan.zhihu.com/p/37515841
球场上运动至指定地点(比例控制):有图【很直观的帮助理解】&有文字分析
2)初识PID-搞懂PID概念 https://zhuanlan.zhihu.com/p/74131690
【重点】数据有错误,但是跟着分析模拟了用p、pi、pid调控往水桶加水的过程
3)PID控制算法原理(抛弃公式,从本质上真正理解PID控制) https://zhuanlan.zhihu.com/p/39573490
看2)的时候 有时会看看3)帮助理解
在这里插入图片描述
在这里插入图片描述
其中r(t)表示给定输入值,c(t)表示实际输出值,e(t)表示信号偏差量=r(t)-c(t),u(t)表示修正量。 ------- https://www.cnblogs.com/cv-pr/p/4785195.html PID控制原理和算法。
PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差e(t)的比例§、积分(I)、微分(D)通过线性组合构成控制量u(t),对控制对象进行控制。
在这里插入图片描述

代码实现与绘图:python3+matplotlib

import matplotlib.pyplot as plt
print(list(range(1,5))) # python3
# 参考  https://zhuanlan.zhihu.com/p/74131690
# (1)有个水桶,需要时刻保持1m 的高度,目前水桶里有0.2m 的水
# 采用P(比例) 的方法加水:即每次测量与1m 的误差,并加入与误差成比例的水量
# 比如设Kp=0.5.
# 第一次,误差是 1-0.2=0.8m,那么加入水量是 Kp*0.8= 0.4m

target = 1
now = 0.2
kp = 0.5

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 30:
    error = target-now
    error_list.append(error)
    uk = kp*error # 基于误差输出
    add_num += 1 
    uk_list.append(uk)
    now = now + uk
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 0.5")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()
    
print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

# (2) 新任务: 有个水桶,但桶底漏了个洞,仍需保持1m 的高度,
# 目前水桶里有0.2m 的水,但每次加水都会流出0.1m.
# 这个例子就接近我们实际工程的例子了,比如电机摩擦的阻力,损耗.
# 【】第一次仍是使用P (比例控制) u= Kp* e
target = 1
now = 0.2
kp = 0.5#1.9 #1 # 0.5

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:
    error = target-now
    error_list.append(error)
    uk = kp*error # 基于误差输出
    add_num += 1 
    uk_list.append(uk)
    now = now + uk - 0.1
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 0.5")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()
    
print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

# (2) 新任务: 有个水桶,但桶底漏了个洞,仍需保持1m 的高度,
# 目前水桶里有0.2m 的水,但每次加水都会流出0.1m.
# 这个例子就接近我们实际工程的例子了,比如电机摩擦的阻力,损耗.
# 【】第一次仍是使用P (比例控制) u= Kp* e
target = 1
now = 0.2
kp = 1 #1.9 #1 # 0.5

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:
    error = target-now
    error_list.append(error)
    uk = kp*error # 基于误差输出
    add_num += 1 
    uk_list.append(uk)
    now = now + uk - 0.1
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 1")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()
    
print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

# (2) 新任务: 有个水桶,但桶底漏了个洞,仍需保持1m 的高度,
# 目前水桶里有0.2m 的水,但每次加水都会流出0.1m.
# 这个例子就接近我们实际工程的例子了,比如电机摩擦的阻力,损耗.
# 【】第一次仍是使用P (比例控制) u= Kp* e
target = 1
now = 0.2
kp = 1.9 #1.9 #1 # 0.5

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:
    error = target-now
    error_list.append(error)
    uk = kp*error # 基于误差输出
    add_num += 1 
    uk_list.append(uk)
    now = now + uk - 0.1
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 1.9")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()
    
print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

# 结论: 比例控制引入了稳态误差,且无法消除.
#       比例常数增大可以减小稳态误差,但如果太大则引起系统震荡,不稳定.
# 为了消除稳态误差,第二次加入积分,使用PI(比例积分控制) 
# 积分控制就是将历史误差全部加起来乘以积分常数.

target = 1
now = 0.2
kp = 0.5
ki = 0.5

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
history_error_list = [0]
ukp_list = [0]
uki_list = [0]
while add_num < 30:
    error = target-now
    error_list.append(error)
    ukp = kp*error # 比例部分
    ukp_list.append(ukp)
    history_error=sum(error_list)
    history_error_list.append(history_error)
    uki = ki*history_error #积分部分
    uki_list.append(uki)
    add_num += 1
    uk = ukp + uki #基于误差输出
    uk_list.append(uk)
    now = now + uk - 0.1
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 0.5, ki = 0.5")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()    

print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("ukp_list={}, len(ukp_list)={}".format(ukp_list, len(ukp_list)))
print("uki_list={}, len(uki_list)={}".format(uki_list, len(uki_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

# 引入积分可以消除稳态误差,但会增加超调,且Ki 增大,超调量也增大.
# 为了消除超调,我们引入微分作用

target = 1
now = 0.2
kp = 0.5
ki = 0.5
kd = 0.3

error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
history_error_list = [0]
ukp_list = [0]
uki_list = [0]
ukd_list = [0]
while add_num < 30:
    error = target-now
    error_list.append(error)
    ukp = kp*error # 比例部分
    ukp_list.append(ukp)
    history_error=sum(error_list)
    history_error_list.append(history_error)
    uki = ki*history_error #积分部分
    uki_list.append(uki)
    if add_num==0:
        diff_error=0
    else:
        diff_error=error_list[-1]-error_list[-2]
    ukd = kd*diff_error # 微分部分
    ukd_list.append(ukd)
    add_num += 1
    uk = ukp + uki + ukd #基于误差输出
    uk_list.append(uk)
    now = now + uk - 0.1
    now_list.append(now)

x=list(range(len(now_list)))
y=now_list
# 绘制折线图
plt.plot(x, y, label='Data Line')
# 绘制纵坐标线
plt.axhline(y=1, color='gray', linestyle='--')
# 绘制数据标记
for i in range(len(x)):
    # 绘制散点图
    plt.scatter(x[i], y[i], s=10, marker='o', color='red')
    # 用于标注文字,注释文本内容+被注释的坐标点+。。。
    # plt.annotate((x[i], y[i]), (x[i] + 0.1, y[i] - 0.051))
# 设置图表标题和标签
plt.title("kp = 0.5, ki = 0.5, kd = 0.3 ")
plt.xlabel("Adjustment times")
plt.ylabel("water level/m")
# 显示图表,得到一个带数据标记的折线图
plt.legend()
plt.show()       
    
print("error_list={}, len(error_list)={}".format(error_list, len(error_list)))
print("ukp_list={}, len(ukp_list)={}".format(ukp_list, len(ukp_list)))
print("uki_list={}, len(uki_list)={}".format(uki_list, len(uki_list)))
print("ukd_list={}, len(ukd_list)={}".format(ukd_list, len(ukd_list)))
print("uk_list={}, len(uk_list)={}".format(uk_list, len(uk_list)))
print("now_list={}, len(now_list)={}".format(now_list, len(now_list)))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake构建一个转换为3d tile的开源代码成功

之前CMake构建一个转换为3d tile的开源代码&#xff0c;生成解决方案之后&#xff0c;从VS2019打开&#xff1b; 总是报一个错误&#xff0c;跟 mocs_compilation_Debug.cpp 这个QT相关文件有关&#xff0c;它生成的obj&#xff0c;总是报模块计算机x64和目标计算机x86冲突&am…

HTTP/3 为什么正迅速崛起

超文本传输协议&#xff08;HTTP&#xff09;作为互联网的基石&#xff0c;一直在网页加载、视频流传输、应用获取数据等方方面面发挥重要作用。 去年&#xff0c;负责定义互联网技术的互联网工程任务组&#xff08;IETF&#xff09;将该协议的最新版本 HTTP/3 定为标准。在此…

leetcode:495. 提莫攻击

一、题目 链接&#xff1a;495. 提莫攻击 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;int findPoisonedDuration(int* timeSeries, int timeSeriesSize, int duration) 二、思路 遍历数组timeSeries&#xff0c;如果 元素值duration < 下一元素值 &#x…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

PyQt6 QPlainTextEdit纯文本控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Nodejs+vue基于微信小程序的高校餐厅食品留样管理系统uniapp

任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于nodejs小程序技术设计并实现了小程序。采用B/S结构,…

Vue中的过滤器了解吗?过滤器的应用场景有哪些?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-filter过滤器 目录 一、是什么 二、如何用 定义filter 小结&#xff1a; 三、应用场景 四…

[Linux]进程创建➕进程终止

文章目录 1.再谈fork()函数1.1fork()创建子进程 OS都做了哪些工作?1.2对上述问题的理解1.3写时拷贝进行父子进程分离的优势1.4了解eip寄存器和pc1.5了解进程的上下文数据1.6对计算机组成的理解1.7fork常规用法1.8fork调用失败的原因 2.进程终止2.1进程终止时操作系统要做的工作…

在Anaconda中用命令行安装环境以及安装包

一、下载Anaconda 下载地址 二、创建环境 1. 打开Anaconda命令行 2.创建环境 conda create -n 环境名称 python3.10(需要的python版本号) 3.激活环境 activate 环境名4.下载安装包 pip install 模块名 -i https://pypi.tuna.tsinghua.edu.cn/simple5.下载torch 官网&…

线程池在Java中的应用实践

摘要&#xff1a;在实际业务场景中&#xff0c;线程池发挥着重要作用。本文将详细解答在高并发、任务执行时间短、并发不高、任务执行时间长以及并发高、业务执行时间长的业务场景下&#xff0c;如何使用线程池进行优化。 一、高并发、任务执行时间短的业务场景 在高并发、任务…

AI 重构工业制造的故事 我们从大模型开始讲起

在数字化浪潮的推动下&#xff0c;工业制造领域正经历着一场前所未有的变革。人工智能&#xff08;AI&#xff09;作为这场变革的关键推动者之一&#xff0c;正以惊人的速度颠覆传统制造业。而大模型作为AI时代最先进的科技工具之一&#xff0c;或将成为引领这场变革的利器&…

js 获取数组的最大值与最小值

let arr [1, 2, 5, 8, 10, 100, -1] 1. 使用Math的静态方法max/min Math.max()函数返回给定的一组数中的最大值。 它的语法&#xff1a;Math.max(value1[, value2, ...]) 使用此方法&#xff0c;需要注意&#xff0c;如果没有参数的话&#xff0c;则返回-Infinity。如果有任一…

走近“中国深度-深海探索主题展”,带你探索深海远洋

深海&#xff0c;自古以来给予了人类无限的遐想&#xff0c;随着时代的进步和科学的发展&#xff0c;海洋的神秘面纱被一点点揭开&#xff0c;呈现在我们面前的是一个资源宝库&#xff0c;“可上九天揽月&#xff0c;可下五洋捉鳖”已经成为现实&#xff0c;21世纪是海洋的世纪…

1和0的故事-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;1和0的故事 作者&#xff1a;Eas0a 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 哦&#xff1f;1和0的故事&#xff1f;&#xff08;奸笑.jpg&#xff09;&#xff0c;打开看看啊。 emmm...j…

广州华锐互动:VR虚拟现实内容创作工具带来全新的应用场景

随着科技的不断发展&#xff0c;低代码编辑工具已经成为了一种越来越受欢迎的开发方式。它可以帮助开发人员快速构建应用程序&#xff0c;降低开发成本&#xff0c;提高开发效率&#xff0c;而VR虚拟现实内容创作工具带来了全新的应用场景。 VR虚拟现实内容创作工具是广州华锐互…

AntDB数据库与东方通TongWeb完成兼容互认,共筑数字化底座核心能力

近日&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;与北京东方通科技股份有限公司&#xff08;简称&#xff1a;东方通&#xff09;完成AntDB数据库与东方通应用服务器TongWeb V7.0的兼容互认。经测试&#xff0c;AntDB数据库能与东方…

工业产品3d交互展示数字云展厅更绿色环保

随着数字技术的飞速发展&#xff0c;3D全景汽车云展厅平台应运而生&#xff0c;为现代展览带来了前所未有的创新与变革。该平台以其独特的优点&#xff0c;为观众、艺术家和展商带来了全新的展览体验&#xff0c;开启了未来展览的新篇章。 首先&#xff0c;3D全景汽车云展厅平台…

俄罗斯山东同乡会会长赵卫星一行莅临百华鞋业考察交流

11月25日&#xff0c;俄罗斯山东同乡会会长赵卫星等专家与市侨联副主席李咏梅&#xff0c;县商务局局长尹纪付、县侨联主席刘志峰、县人才集团总经理刘杰等一行莅临百华鞋业考察调研。百华鞋业总经理郭兴梅全程陪同。 百华鞋业总经理郭兴梅对赵卫星会长一行领导的到来表示热烈…

Python Xorbits库:实现无限可能的编程旅程

概要 Python Xorbits是一个强大而多功能的开源Python库&#xff0c;为开发者提供了实现创新和复杂计算的能力。它提供了各种功能和工具&#xff0c;帮助开发者在编程旅程中探索无限可能。本文将详细介绍Python Xorbits的用途和使用教程&#xff0c;帮助读者了解和掌握这个令人…

图像异常检测研究现状综述

论文标题&#xff1a;图像异常检测研究现状综述 作者&#xff1a;吕承侃 1, 2 沈 飞 1, 2, 3 张正涛 1, 2, 3 张 峰 1, 2, 3 发表日期&#xff1a;2022年6月 阅读日期 &#xff1a;2023年11月28 研究背景&#xff1a; 图像异常检测是计算机视觉领域的一个热门研究课题, 其目…