IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> PID控制算法学习与Matlab仿真 -> 正文阅读

[数据结构与算法]PID控制算法学习与Matlab仿真

起因

PID控制算法应该是包括工业机器人等各种行业和领域中非常常用的一种控制算法了。了解这个算法的起因是在稚晖君开发的自行车项目中见到,后来在北理工组会中了解到PID控制算法属于控制工程专业中非常基础的理论。
初步了解之后就会经常注意到这个算法,发现PID在飞控算法中非常重要,也常出现在b站分享的各种自平衡项目中。前两天又了解到著名“载人航天仿真工程软件”《坎巴拉太空计划》的MOD中也可以通过写入PID算法来对火箭姿态进行控制。可以说此算法是既实用又很酷了。

算法原理

连续系统中的PID算法公式如下
U ( t ) = k P [ e r r ( t ) + 1 T I ∫ e r r ( t ) d t + T D d [ e r r ( t ) ] d t ] = k P e r r ( t ) + k P T I ∫ e r r ( t ) d t + T D k P d [ e r r ( t ) ] d t = k P e r r ( t ) + k I ∫ e r r ( t ) d t + k D d [ e r r ( t ) ] d t U(t)=k_P\left [ err(t)+\frac{1}{T_I}\int err(t)dt+T_D\frac{d[err(t)]}{dt} \right ]\\ =k_P err(t)+\frac{k_P}{T_I}\int err(t)dt+T_D k_P\frac{d[err(t)]}{dt} \\ =k_P err(t)+k_I\int err(t)dt+k_D\frac{d[err(t)]}{dt} U(t)=kP?[err(t)+TI?1?err(t)dt+TD?dtd[err(t)]?]=kP?err(t)+TI?kP??err(t)dt+TD?kP?dtd[err(t)]?=kP?err(t)+kI?err(t)dt+kD?dtd[err(t)]?
其中 U ( t ) U(t) U(t)即为调节的控制量, e r r ( t ) err(t) err(t)为期望值与实际值的偏差,由于实际使用时都要对三个参数进行调节,因此索性直接写为 k P k_P kP? k I k_I kI? k D k_D kD?,正好代表了P比例 I积分 D微分三个调节参数。
离散系统中的PID算法公式如下
U ( t ) = K P e r r ( t ) + K I ∑ n = 0 k e r r ( n ) + K D [ e r r ( k ) ? e r r ( k ? 1 ) ] U(t)=K_P err(t)+K_I\sum_{n=0}^{k}err(n)+K_D\left [ err(k)-err(k-1) \right ] U(t)=KP?err(t)+KI?n=0k?err(n)+KD?[err(k)?err(k?1)]
算法结构如下
在这里插入图片描述

算法解析

比例P就是常规中很直觉的控制思想,即大了就缩小,小了就扩大;

比例P存在的问题是调节速度过快会引起系统在期望值处震荡,因此引入微分D;
微分D考量变化速度,若变化速度过大将降低调节量;

比例P+微分D存在的问题是,存在稳态误差(系统由于其他干扰,使得比例调节无法完成期望值,在另一处实现稳态),因此引入积分I;
积分I考量一段时间的误差积累(特别是稳态误差),根据误差积累改变调节量。

调参小技巧

最优的曲线貌似因人而异,如果需要更快达到目标,可以存在少量超调,微微震荡,如果对震荡敏感,可以严格限制超调,降低达到目标的速度,总的来说:

  1. K p K_p Kp? K i K_i Ki?最后 K d K_d Kd?
  2. 确定 K p K_p Kp? 时,由0逐渐加大比例增益 K p K_p Kp?,直至系统出现振荡,再从此时的比例增益 K p K_p Kp?逐渐减小,直至系统振荡消失,记录此时的比例增益 K p K_p Kp?,设定最终的比例增益 K p K_p Kp?为当前值的60%~70%;
  3. K i K_i Ki?也一样保证在震荡的临界处即可;
  4. 最后加 K d K_d Kd?

Matlab仿真

%Project: 【PID控制算法仿真】最简单的系统
%Author: Jace
%Data: 2022/6/12
%====================准备====================
clear all;
close all;
clc;
%====================初始化参数====================
%--------全局参数--------
N=100;
%--------系统模型参数1--------
A=0.9;
B=0.2114;

%--------分配空间--------
x=zeros(1,N);
u=zeros(1,N);
e=zeros(1,N);
Sum_e=zeros(1,N);
r=zeros(1,N);

%--------初始化--------
r(1)=800;
x(1)=0;
e(1)=0;   
Sum_e(1)=0;

%--------PID参数--------
% kp=0.22;    
% ki=0.13;
% kd=0;
kp=2;    
ki=0.23;
kd=0.2;
for k=2:N
    %系统运行
    x(k)=A*x(k-1)+B*u(k-1)+B*u(k);%系统状态方程
    if k<N/2
        r(k)=r(1);%期望值
    else
        r(k)=r(1)-200;
    end
    e(k)=r(k)-x(k);%误差信号
    Sum_e(k)=Sum_e(k-1)+e(k);%误差的累加和
    u(k)=kp*e(k)+ki*Sum_e(k)+kd*(e(k)-e(k-1)); %PID控制器输出
end

figure;
hold on,box on;
plot(x,'-r.');
plot(r,'-k.');
legend('State','Expect');
axis([0 N 0 1000])
xlabel('Sampling Time');ylabel('Value');
title('State');

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-21 21:32:04  更:2022-06-21 21:32:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:57:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码