基于BP神经网络的PID智能控制

news/2025/3/31 15:16:06/

基于BP神经网络的PID智能控制

  • 基于BP神经网络的PID整定原理
  • 经典的增量式数字PID控制算法为:
  • BP神经网络结构:
  • 学习算法
  • 仿真模型
  • Matlab代码
  • 仿真效果图
  • 结论
  • python仿真
    • 参考文献

基于BP神经网络的PID整定原理

PID控制要获得较好的控制效果,就必须通过调整好比例、积分和微分三种控制作用,形成控制量中既相互配合又相互制约的关系,这种关系不一定是简单的“线性组合”,从变化无穷的非线性组合中可以找出最佳的。神经网络所具有的任意非线性表达的能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。采用BP神经网络,可以建立参数Kp、Ki、Kd自学习的PID控制器。

经典的增量式数字PID控制算法为:

u(k)=u(k−1)+∆u(k)
∆u(k)=k_p(error(k)−error(k−1))+k_ierror(k)+k_d(error(k)−2error(k−1)+error(k−2))

BP神经网络结构:

BP神经网络结构
激活函数

学习算法

学习算法1
学习算法2
学习算法3

仿真模型

仿真模型

Matlab代码

略做优化及解释

%BP based PID Control
clear all;
close all;
xite=0.20;
alfa=0.05;
S=2; %Signal type
IN=4;H=5;Out=3; %NN Structure
if S==1 %Step Signal
% wi=[-0.6394 -0.2696 -0.3756 -0.7023;
% 
% -0.8603 -0.2013 -0.5024 -0.2596;
% 
% -1.0749 0.5543 -1.6820 -0.5437;
% 
% -0.3625 -0.0724 -0.6463 -0.2859;
% 
% 0.1425 0.0279 -0.5406 -0.7660];wi=0.50*rands(H,IN);wi_1=wi;wi_2=wi;wi_3=wi;% wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325;
% 
% -0.1146 0.2949 0.8352 0.2205 0.4508;
% 
% 0.7201 0.4566 0.7672 0.4962 0.3632];wo=0.50*rands(Out,H);wo_1=wo;wo_2=wo;wo_3=wo;endif S==2 %Sine Signal% wi=[-0.2846 0.2193 -0.5097 -1.0668;
% 
% -0.7484 -0.1210 -0.4708 0.0988;
% 
% -0.7176 0.8297 -1.6000 0.2049;
% 
% -0.0858 0.1925 -0.6346 0.0347;
% 
% 0.4358 0.2369 -0.4564 -0.1324];% wi=[0.2909    0.0504   -0.5608    0.8765;
%    -0.4225    0.5890    0.1840    0.5660;
%    -0.2075   -0.4704    0.1246   -0.3400;
%    -0.2277   -0.0930   -0.0809    0.3108;
%     0.3456   -0.1417   -0.5223    0.298]wi=0.50*rands(H,IN)wi_1=wi;wi_2=wi;wi_3=wi;% wo=[1.0438 0.5478 0.8682 0.1446 0.1537;
% 
% 0.1716 0.5811 1.1214 0.5067 0.7370;
% 
% 1.0063 0.7428 1.0534 0.7824 0.6494];% wo=[-0.5582   -0.4503   -0.5845   -0.1433    0.2659;
%    -0.3943   -0.3942    0.2685   -0.1449   -0.2649;
%    -0.5109   -0.2169    0.3106   -0.2965   -0.5230]wo=0.50*rands(Out,H)wo_1=wo;wo_2=wo;wo_3=wo;endx=[0,0,0];du_1=0;u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;y_1=0;y_2=0;y_3=0;Oh=zeros(H,1); %Output from NN middle layerI=Oh; %Input to NN middle layererror_2=0;error_1=0;ts=0.001;for k=1:1:6000time(k)=k*ts;if S==1rin(k)=1.0;elseif S==2rin(k)=sin(1*2*pi*k*ts);end%Unlinear model
a(k)=1.2*(1-0.8*exp(-0.1*k));
yout(k)=a(k)*y_1/(1+y_1^2)+u_1;error(k)=rin(k)-yout(k);xi=[rin(k),yout(k),error(k),1];x(1)=error(k)-error_1;x(2)=error(k);x(3)=error(k)-2*error_1+error_2;epid=[x(1);x(2);x(3)];I=xi*wi'; % [1,4]*[4,5]% 中间层激活函数
for j=1:1:HOh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %Middle Layer
endK=wo*Oh; %Output Layer [3,5]*[5,1]% 输出层激活函数
for l=1:1:OutK(l)=exp(K(l))/(exp(K(l))+exp(-K(l))); %Getting kp,ki,kd
end% 输出层输出结果,PID系数
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);Kpid=[kp(k),ki(k),kd(k)];
% 增量PID计算
du(k)=Kpid*epid;
u(k)=u_1+du(k); %PID控制量输出
% 符号函数,模型输出变化量/控制增量的变化量(+0.0001避免出现除0)
dyu(k)=sign((yout(k)-y_1)/(du(k)-du_1+0.0001));%Output layer
% 输出层激活函数求导 
for j=1:1:OutdK(j)=2/(exp(K(j))+exp(-K(j)))^2;
endfor l=1:1:Outdelta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
endfor l=1:1:Outfor i=1:1:Hd_wo(l,i)=xite*delta3(l)*Oh(i)+alfa*(wo_1(l,i)-wo_2(l,i));end
endwo=wo_1+d_wo+alfa*(wo_1-wo_2);%Hidden layer
% 中间层激活函数求导
for i=1:1:HdO(i)=4/(exp(I(i))+exp(-I(i)))^2;
endsegma=delta3*wo;for i=1:1:Hdelta2(i)=dO(i)*segma(i);
endd_wi=xite*delta2'*xi;wi=wi_1+d_wi+alfa*(wi_1-wi_2);%Parameters Updatedu_1=du(k);u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);y_2=y_1;y_1=yout(k);wo_3=wo_2;wo_2=wo_1;wo_1=wo;wi_3=wi_2;wi_2=wi_1;wi_1=wi;error_2=error_1;error_1=error(k);endwi
wo
figure(1);plot(time,rin,'r',time,yout,'b--');
xlabel('time(s)');ylabel('rin,yout');
legend('rin','yout');
grid on
figure(2);plot(time,error,'r');xlabel('time(s)');ylabel('error');
grid on
figure(3);plot(time,u,'r');xlabel('time(s)');ylabel('u');
grid on
figure(4);
subplot(311);plot(time,kp,'r');xlabel('time(s)');ylabel('kp');
grid on
subplot(312);plot(time,ki,'g');xlabel('time(s)');ylabel('ki');
grid on
subplot(313);plot(time,kd,'b');xlabel('time(s)');ylabel('kd');
grid on

仿真效果图

rin yout

u
error
pid

结论

由图可知,该算法经过一段时间的自动调参后误差趋于稳定,PID参数随着误差的变化而变化,证明了算法的有效性。实际使用时可增加一些限制条件,使算法更加鲁棒。

python仿真

单位阶跃信号响应,可根据实际模型使用PID或PI、PD控制,把不用的项系数设为0即可。
out
p
i
d

参考文献

[1]: 先进PID控制MATLAB仿真(第二版)刘金琨 第4章 神经PID控制


http://www.ppmy.cn/news/270242.html

相关文章

自定义注解,基于redis实现分布式锁

一、如何实现自定义注解 1.1、注解的基础知识 实现自定义注解其实很简单,格式基本都差不多。也就参数可能变一变。 Retention:取值决定了注解在什么时候生效,一般都是取运行时,也就是RetentionPolicy.RUNTIME。 Target&#xff…

JS 装饰器

JS 装饰器 JavaScript 装饰器是一种以 符号开头的特殊语法,放在目标代码的前面用于包装或扩展代码功能。JavaScript 的装饰器语法目前仍处于提案阶段,现阶段使用的话需要通过 bable 等方式进行编译之后,才能在浏览器正常运行。装饰器分为两…

操作系统 第三章 3.2 错题整理

页面引用串长度是什么意思 合法位存在位 不存在即发生故障 区分好页表项和逻辑地址 是不同的 逻辑地址48bit 偏移量12bit 页号36bit 页表项8B 4KB/8B2^9 一个页面能存放2^9个页表项 页号9bit,36/94 虚拟存储器包括内存和磁盘对换区,工作集要频繁用到&…

C语言 switch语句

switch语句 switch 语句是多分支选择语句. switch语句用来更优雅的解决多分支if语句, 例如, 学生成绩分类(85分以上为A, 70-84分为B, 60-69分为C等...); 人口统计分类(按年龄分为老、总、青少、儿童);工资统计分类... switch 语句格式: switch (expression) {…

想装吗?看看装B大全

一、装B之读书 世界上总是有那么群爱装B的人,所以才有这篇不完全装B手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的,而我在此仅探讨几个关于读书的装B问题。 唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”&a…

一公司员工反向“招聘老板”,网友:这是直聘BOSS

原来当老板的跑路了,员工不一定会失业,只要再招一个老板就可以了 4月14日,四川某家公司发布了一则招聘公告,称老板跑路了,希望招聘一位老板,并给出了高薪。 该公司员工表示,目前公司欠薪无法继…

很文艺,很小资 —— 初级华语音乐装逼指南【转载自豆瓣九点】

你还在听蔡依林、孙燕姿、张韶涵、王心凌、梁静茹么?出去怎么好意思跟人打招呼啊~~~所以我特地写这一篇来网普一下,造福广大装逼无门装精无路的小青年们。首先,本文是针对华语的,也就是两岸三地之内人声用中文演绎的歌曲&#xff…

官方或授权数码相机维修点一览(华南)

网易 > 数码频道 > 相机首页 > 正文 官方或授权数码相机维修点一览(华南) 2007-05-24 13:06:21 下面是几大主流数码相机品牌在华南地区售后服务中心、授权维修点或推荐维修中心的联系方式,本文列出希望能给广大数码相机用户带来方便。 佳能数码相机 广州新…