PID c++算法学习和实现

原理图:
在这里插入图片描述
在这里插入图片描述
(1)位置式PID
1:当前系统的实际位置,与你想要达到的预期位置的偏差, 2:进行PID控制,误差会一直累加,会使当前输出与过去的所有输入相关,输入uk出错,会导致系统大幅波动 3:位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,一旦误差开始反向变化,系统需要一定时间从饱和区退出,所以在u(k)达到最大和最小时,要停止积分作用,并且要有积分限幅和输出限幅, 4:用位置式PID时,一般我们直接使用PD控制,不使用积分项

实际应用中,用差分代替微分,连加代替积分,也就是离散型PID
令:
在这里插入图片描述

(1)实现:位置模式PID

#include <math.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include "matplotlibcpp.h"
#include <vector>
#include <math.h>
#include <string>
#include<stdlib.h>
namespace plt = matplotlibcpp;class pid_p
{
private:float ki;float kp;float kd;float ek;float ek_1;float actual;float de;float target;float yk;
public:pid_p();~pid_p();pid_p(float p,float i,float d);void get_error();void get_value(float act,float tar);float update();
};pid_p::pid_p():kp(0),ki(0),kd(0),ek(0),ek_1(0),de(0),actual(0),yk(0)
{
}
pid_p::pid_p(float p,float i,float d):ek(0),ek_1(0),de(0),actual(0),yk(0)
{kp=p;ki=i;kd=d;
}pid_p::~pid_p()
{
}
void pid_p::get_value(float act,float tar)
{actual=act;target=tar;get_error();printf("actual:%f,target%f",actual,target);
}
void pid_p::get_error()
{ek=target-actual;
}
float pid_p::update()
{de+=ek;yk=kp*ek+ki*de+kd*(ek-ek_1);printf("p:%f,i:%f,d:%f,act:%f,yk:%f,ek:%f\r\n",kp,ki,kd,actual,yk,ek);ek_1=ek;return yk;}//输入三个参数kp,ki,kd
int main(int argc,char ** argv)
{   float target=1000;std::string str_p=argv[1];std::string str_i=argv[2];std::string str_d=argv[3];// std::string str_p="0.35";// std::string str_i="0.0001";// std::string str_d="0.0001";float act=0;int N=100;float kp=atof(str_p.c_str());float ki=atof(str_i.c_str());float kd=atof(str_d.c_str());pid_p a(kp,ki,kd);std::vector<float> x,y;for (int i=0;i<N;i++){x.push_back(i);y.push_back(act);a.get_value(act,target);act+=a.update();a.pid_printf();//if(act>target)break;}plt::plot(x,y);plt::show();
}

(2)增量式PID
原理:使控制器输出为增量,尽量使每次数据均与过去数据无关,没有积分项。
公式:
在这里插入图片描述
实现

class pid_add
{private:float kp,ki,kd,ek,ek_1,ek_2,uk,yk,delta_u;public:pid_add();pid_add(float p,float i,float d);void get_value(float act,float tar);void update_error();float update();};
pid_add::pid_add():kp(0),ki(0),kd(0),uk(0),ek(0),ek_1(0),yk(0)
{};pid_add::pid_add(float p,float i,float d):uk(0),ek(0),ek_1(0),yk(0)
{kp=p;ki=i;kd=d;
};void pid_add::get_value(float act,float tar)
{uk=act;yk=tar;
}
void pid_add::update_error()
{ek_1=ek;ek=yk-uk;
}float pid_add::update()
{update_error();delta_u=kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1+ek_2);return delta_u;
}

(3) 积分分离式PID

原理:在系统误差较大时,取消积分环节;当误差较小时,引入积分环节。这样既不影响控制器的动态性能,又可以提高控制器的稳态精
实现:在位置式/增量式PID加入积分环节一个阈值,实现略

(4) 抗饱和积分式PID
原理:在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。
实现:

class pid_antisaturation
{private:float kp,ki,kd,uk,uk_1,yk,ek,ek_1,ek_2;const float max_uk_1=500,min_uk_1=-500;public:pid_antisaturation():kp(0),ki(0),kd(0),uk(0),yk(0),ek(0),ek_1(0),ek_2(0),uk_1(0){};pid_antisaturation(float p,float i,float d):kp(p),ki(i),kd(d),uk(0),yk(0),ek(0),ek_1(0),ek_2(0),uk_1(0){};void get_value(float act,float target);void update_error();float update();
};
void pid_antisaturation::get_value(float act,float target)
{uk_1=uk;uk=act;yk=target;
}
void pid_antisaturation::update_error()
{ek_2=ek_1;ek_1=ek;ek=yk-uk;
}
float pid_antisaturation::update()
{float increase;update_error();if((uk_1>max_uk_1)&(ek>0)){ek=0;}if((uk_1<min_uk_1)&(ek<0)){ek=0;}increase=kp*(ek-ek_1)+ki*ek+kd*(ek-2*ek_1+ek_2);printf("p:%f,i:%f,d:%f,act:%f,yk:%f,ek:%f\r\n",kp,ki,kd,uk,yk,ek);return increase;
}

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

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

相关文章

为什么别人能拿到大厂offer?你应该明白这些java面试技巧!

言简意赅的说明自己的工作时间&#xff0c;擅长技术栈和自己的工作预期。 注意准备两份自我介绍&#xff0c;一个是跟面试官说的&#xff0c;一个是跟HR说的。 项目经验介绍 选一个自己感觉是最成功的&#xff0c;而且还是最有把握的项目&#xff0c;讲给面试官。 简单说下…

Lvgl9 WindowsSimulator Visual Studio2017

因为在操作过程中遇到了一些错误&#xff0c;所以将操作及解决问题的过程记录下来。 一、下载lv_port_pc_visual_studio github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux su…

Linux系统使用Docker部署MeterSphere并实现公网访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

JavaWeb的简单了解

一、什么是JavaWeb 1. JavaWeb&#xff1a;是使用jsp和JavaBean技术开发动态网站的 2.是什么动态网站 和html的区别在哪&#xff1a;thml开发的网站只能在你自己电脑上访问其他人可以访问 3.那怎么开发JavaWeb&#xff1a;我们首先需要eclipse还需要Tomcat 小tips&am…

跨站请求伪造漏洞(CSRF)

什么是CSRF CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;即跨站请求伪造攻击。 漏洞原理 跨站请求伪造漏洞的原理主要是利用了网站对用户请求的验证不严谨。攻击者会在恶意网站中构造一个…

正信法律:老板一直拖欠工资怎么办

在职场中&#xff0c;薪酬是劳动者辛勤工作的直接回报&#xff0c;然而不幸的是&#xff0c;拖欠工资的现象时有发生。面对老板一直拖欠工资的困境&#xff0c;员工应采取一系列明智而有效的措施来维护自己的合法权益。 与雇主进行沟通。清晰、冷静地表达自己的诉求&#xff0c…

电脑怎么下载微信小程序的视频

电脑怎么下载微信小程序中的视频资源&#xff0c;本篇文章就教大家如何下载微信小程序的视频资源的方法&#xff0c;这里要借助一个工具:下载高手 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w6DWf-9Nxw?pwdl09r 提取码&#xff1a;l09r --来自百度网盘…

个人在线要饭网站源码

源码简介 施舍也要讲究便捷&#xff0c;如果能像购物一样&#xff0c;那也是很美的一件事情&#xff1b; 接入了支付宝当面付系统. 安装环境 php5.6 Nginx 安装教程 1.上传源码压缩包到网站目录并解压即可 2.支付配置 /修改文件 app/config.php /*** 请填写以下配置信…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

vue商城项目vue shop vite

Vue Shop 是一个基于 Vue.js 框架构建的电子商务平台&#xff0c;它利用了 Vue 的响应式数据绑定和组件化的特点&#xff0c;为用户提供了一种快速开发和部署在线商店的解决方案。Vite 是一种现代化的前端构建工具&#xff0c;它提供了快速的冷启动、即时模块热更新&#xff08…

数据安全之路:Databend 用户与角色管理应用

Databend 目前支持基于角色的访问控制 (RBAC) 和 自主访问控制 (DAC) 模型&#xff0c;用于访问控制功能。 通过本指南&#xff0c;我们会了解权限和角色在 Databend 中的基本概念&#xff0c;以及如何管理角色、继承角色与建立层级、设置默认角色以及所有权的重要性。这些功能…

springboot-开源项目-追踪法-简单有效,从F12到SQL数据库表

使用的技术栈&#xff1a;springbootmybatis&#xff0c;edge浏览器 插件&#xff1a;MybatisX 第一步&#xff1a; 按F12,选择网络 第二步&#xff1a; 进入IDEA编辑器&#xff0c;键盘按两次shift键&#xff0c;点击第一个&#xff0c;快速定位到该操作 3&#xff1a; 我…

解码rmallox勒索病毒:深入了解与全面应对这一网络威胁

随着科技的不断发展&#xff0c;我们的生活已经与数字世界紧密相连。然而&#xff0c;这种紧密的联系也带来了新的安全隐患&#xff0c;其中勒索病毒就是近年来网络安全领域的一个突出问题。特别是rmallox勒索病毒&#xff0c;它以其独特的加密性和破坏性&#xff0c;给全球范围…

一起找bug之购物

如果不是购物车满了&#xff0c;大概都不会发现这个 bug 淘宝 APP 修复了购物车满的情况下&#xff0c;往里面添加新商品时&#xff0c;会把一个老商品移入收藏夹&#xff0c; 但是如果这个老商品是已失效状态&#xff0c;就无法自动移入收藏夹&#xff0c;而且会一直在购物车…

Qt之QSS样式表

QSS简介 QSS&#xff08;Qt Style Sheet&#xff09;样式表是一种用于描述图形用户界面&#xff08;GUI&#xff09;样式的语言。它允许开发者为应用程序的控件定义视觉外观&#xff0c;例如颜色、字体、尺寸和布局等。 QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化…

Vue 读取后台二进制文件流转为图片显示

Vue 读取后台二进制文件流转为图片显示 后台返回格式 <img :src"payImg" id"image" style"width: 150px;height: 150px;" alt"">axios写法 重点 responseType: ‘blob’ &#xff0c; 使用的是res中的data blob this.$axios.…

Windows安装MySQL

文章目录 一、下载MySQL安装包1、选择版本以及Windows系统点击下载2、选择No thanks,just start my download.3、下载到指定目录解压即可 二、添加环境变量三、添加配置文件四、初始化MySQL数据库服务器五、安装启动服务六、修改连接登录密码七、停止MySQL服务 一、下载MySQL安…

Linux网络的封包和拆包

一般使用socket 到令牌环网然后向上逐渐拆包 MTU:最大的传输单元 以太网&#xff1a;1500 mss&#xff1a;网络类型&#xff0c;线路&#xff0c;以及特性相关

数据库知识点汇总(最全!,2024年最新大佬分享开发经验

十九、删除数据 DELETE 语句 使用 DELETE 语句从表中删除数据。 DELETE FROM table [WHERE condition]; 删除数据 使用 WHERE 子句删除指定的记录 DELETE FROM departments WHERE department_name ‘Finance’; 如果省略 WHERE 子句&#xff0c;则表中的全部数据将被删除 DELE…

[自研开源] MyData v0.8 数据集成案例分享

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 案例&#xff…