【学习草稿】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.4mtarget = 1
now = 0.2
kp = 0.5error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 30:error = target-nowerror_list.append(error)uk = kp*error # 基于误差输出add_num += 1 uk_list.append(uk)now = now + uknow_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.5error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:error = target-nowerror_list.append(error)uk = kp*error # 基于误差输出add_num += 1 uk_list.append(uk)now = now + uk - 0.1now_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.5error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:error = target-nowerror_list.append(error)uk = kp*error # 基于误差输出add_num += 1 uk_list.append(uk)now = now + uk - 0.1now_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.5error_list = [0]
uk_list = [0]
now_list = [0.2]
add_num = 0
while add_num < 60:error = target-nowerror_list.append(error)uk = kp*error # 基于误差输出add_num += 1 uk_list.append(uk)now = now + uk - 0.1now_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.5error_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-nowerror_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 += 1uk = ukp + uki #基于误差输出uk_list.append(uk)now = now + uk - 0.1now_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.3error_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-nowerror_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=0else:diff_error=error_list[-1]-error_list[-2]ukd = kd*diff_error # 微分部分ukd_list.append(ukd)add_num += 1uk = ukp + uki + ukd #基于误差输出uk_list.append(uk)now = now + uk - 0.1now_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)))

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux4.6、进程优先级

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 进程优先级是什么&#xff1f; 为什么会有进程优先级&#xff1f; 那么优先级是如何办到的&#xff1f; 最后一个问题&#xff1a;Linux为什么要限制优先级&#xff1f; 进程优先级是什么&#xff1f; 就是进程在访…

2021年06月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题3分,共30分) 第1题 执行下列程序,输出的结果为? A:12 B:24 C:8 D:30 答案:B 第2题 执行下列程序,角色说出的内容是? A:2 B:3 C:4 D:5 答案:A 第3题 执行下列程序,输出结果为?

【Flutter】graphic图表实现自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法,接收三个参数Size类型,Offset类型,Map<int, Tuple>类型。可查到的文档是真的少,所以只能在源码中扒拉例子,做符合需求的修改。 官方github示例 官方示例 这个例子感觉像是tooltip和提供的那些属性的…

2023年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 一、问题求解&#xff1a;真题&#xff08;2023-01&#xff09;真题&#xff08;2023-02&#xff09;真题&#xff08;2023-03&#xff09;真题&#xff08;2023-04&#xff09;真题&#xff08;2023-05&#xff09;真题&#xff08;2023-06&#xff09;真题&#xff…

【密码学】【安全多方计算】浅析隐私求交PSI

文章目录 隐私求交的定义隐私求交方案介绍1. 基于DH的PSI方案2. 基于OT的PSI方案3.基于OPRF的PSI方案 总结 隐私求交的定义 隐私集合求交使得持有数据参与方通过计算得到集合的交集数据&#xff0c;而不泄露任何交集以外的数据信息。 隐私求交方案介绍 1. 基于DH的PSI方案 …

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议&#xff0c;它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

计算机系统漫游

编译系统 预处理&#xff08;Preprocessing&#xff09;&#xff1a; 预处理器根据源代码中的预处理指令&#xff0c;如#include和#define等&#xff0c;将源代码转换为另一份源代码。预处理器的输出通常会保存在hello.i的文件中。编译&#xff08;Compilation&#xff09;&…

为什么要坚持每天做公域引流

做公域不一定等于拍视频&#xff0c;真正适合小白的引流方式其实还是做图文内容&#xff0c;比如小红书发帖&#xff0c;知乎问答&#xff0c;微信读书&#xff0c;问一问等。 长期坚持每天做公域引流有以下好处&#xff1a; 提高品牌知名度&#xff1a;每天坚持做公域流量&a…

nodejs+vue+elementui学生竞赛管理系统65o97

高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生体育 能力与创新思维、学生竟赛管理系统检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而我所在学院多采用半手工管理学生竟赛的方式&#xff0c;所以有必要开发学生竟赛管理系统来对学生…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…

前端管理制度

数据运营中心的管理形式&#xff1a; 数据运营中心的管理形式 竖向是各小组 横向是项目管理 负责人的定位&#xff1a; 只是工作的内容不同&#xff0c;没有上下级之分 帮助组员找到适合的位置&#xff0c;帮助大家解决问题&#xff0c;给大家提供资源 前端组的工作形式&am…

MySQL数据库如何实现跨服务器访问数据

点击上方蓝字关注我 在使用MySQL数据库时&#xff0c;很多同学经常会问&#xff0c;我能跨服务器访问另一库的数据么&#xff1f;得到的答案很多时候是让人失望的。那么如果真的需要访问&#xff0c;又不想使用拷贝表及数据的方式&#xff0c;可以实现么&#xff0c;又该如何实…

无货源商城搭建的几种方案(电商商品采集API)

随着电商行业的快速发展&#xff0c;越来越多的商家开始考虑搭建自己的电商商城。然而&#xff0c;对于一些没有自己的货源或者想要快速进入电商领域的商家来说&#xff0c;从哪里获取商品成为了他们面临的首要问题。本文将介绍几种无货源商城的搭建方案&#xff0c;帮助商家快…

【创建和排查隐藏进程和隐藏计划任务】

Window 创建隐藏进程和隐藏计划任务&#xff1a; 隐藏进程&#xff1a; 在Windows中&#xff0c;隐藏进程主要通过修改进程属性或使用第三方工具实现。以下是一个使用PowerShell脚本创建隐藏进程的示例&#xff1a; $Script {Start-Process -FilePath "notepad.exe"…

设二维数组a[1...m,1...n]()含有m*n个整数。写一个算法判断a中所有元素是否互不相同,并输出相关信息(yes/no)

设二维数组a[1…m&#xff0c;1…n]&#xff08;&#xff09;含有m*n个整数。 写一个算法判断a中所有元素是否互不相同&#xff0c;并输出相关信息&#xff08;yes/no) 分析其时间复杂度 代码思路&#xff1a; 这种如果纯暴力做的话时间复杂度非常高。 我这里考虑把题目中的二…

地理坐标系转换

1.EPSG代码 搜索地理坐标系对应的EPSG代码 https://epsg.io/ 常用的地理坐标系EPSG代码&#xff1a; 2. 坐标系转换 转换网址&#xff1a; https://epsg.io/transform &#xff08;1&#xff09;修改 input coordinate system 和 output coordinate system&#xff0c; 可以…

Zookeeper 实战 | Zookeeper 和Spring Cloud相结合解决分布式锁、服务注册与发现、配置管理

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

攻关眼科难题!第一届爱尔眼科-四川大学科研基金完成立项

当前我国眼科患者数量不断增长&#xff0c;人民群众对高质量的眼健康的需要不断攀升&#xff0c;而目前国内眼科医疗资源远不能满足需求&#xff0c;疑难眼病诊疗能力及学术科研体系建设仍有较大进步空间。基于此&#xff0c;爱尔眼科携手四川大学共同设立爱尔眼科-四川大学科研…

小程序----使用图表显示数据--canvas

需求&#xff1a;在小程序上实现数据可视化 思路&#xff1a;本来想用的是echarts或者相关的可视化插件&#xff0c;但因为用的是vue3&#xff0c;大多数插件不支持&#xff0c;所以用了echarts&#xff0c;但最后打包的时候说包太大超过2M无法上传&#xff0c;百度了一下&…

LeetCode Hot100 33.搜索旋转排序数组

题目&#xff1a; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nu…