完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
小弟最近在做一个毕业设计,是基于BP神经网络PID的温度控制,最近要中期检查了,要把仿真程序拿出来,使用matlab仿真程序仿真,我在网上找了很多,都是基本那个程序,但是程序中我有点不懂,还有仿真图像也不是我想要的那种,比如设置温度在20度,那么阶跃响应后的曲线最后徘徊在20左右,但是那个仿真程序我又改不来,不是很会,所以求助哈各位网友,希望网友能够提供一些方法和基于温度控制那种改好的程序,小弟不胜感谢,或者教我这个程序怎么改,温度传递函数应该是个惯性加延迟环节,比如G(s)=1/60S+1*exp(-200s),
%基于BP神经网络的PID控制器设计 clc; clear; NI=3;NH=10;NO=3; %选取网络结构为:3-10-3 %输入层到隐层权值初始化 Wih=0.01*rands(NI,NH);Wih_1=Wih;Wih_2=Wih; %隐层到输出层权值初始化 Who=0.01*rands(NH,NO);Who_1=Who;Who_2=Who; %变量初始化 u=0;u_1=0;u_2=0;ly=0;err_1=0;err_2=0; eta=0.5; %给定学习率 a=0.1; %给定动量项因子 ts=0.002; %给定采样时间 %信号源选择:1—阶跃;2—正弦;3—方波; souce=1; %选择阶跃输入 %开始参数自学习实时控制 for k=1:1000 t(k)=k*ts; %判断信号源 switch souce case 1 rin(k)=1; case 2 rin(k)=sin(2*pi*t(k)); case 3 rin(k)=sign(sin(2*pi*t(k))); otherwise error('信号源错误!'); end %计算被控对象输出 y(k)=1.2*(1-0.8*exp(-0.1*k))*ly/(1+ly^2)+u_1; err(k)=rin(k)-y(k); %计算误差 %-------------计算BP网络各层输入及输出------------- x1=err(k)-err_1; x2=err(k); x3=err(k)-2*err_1+err_2; %输入层输入输出,注意:必要时输入要做归一化 N1i=[x1,x2,x3]; N1o=N1i; %隐层输入输出 N2i=N1o*Wih; N2o=tanh(N2i); %输出层输入输出 N3i=Who'*N2o'; N3o=1./(1+exp(-N3i)); %注意:一定是点除! Kp(k)=N3o(1); Ki(k)=N3o(2); Kd(k)=N3o(3);%记录每次参数 Kpid=[Kp(k),Ki(k),Kd(k)]; %PID参数 %-----------计算控制量(使用增量式PID控制规律)--------- epid=[x1;x2;x3]; du=Kpid*epid; u(k)=u_1+0.4*du; %------------------------修正权值------------------------ %修正输出层权值 dg=exp(-N3o)./((1+exp(-N3o)).^2); %激活函数g(x)一阶导 %加0.0001为防止开始时除数为零 dlta3=err(k)*sign((y(k)-ly)/((u_1-u_2)+0.0001))*epid.*dg; for i=1:NO DWho(:,i)=eta*dlta3(i)*N2o'; end Who=Who+DWho+a*(Who_1-Who_2); %修正隐层权值 df=2*exp(-N2o)./((1+exp(-N2o)).^2); %激活函数f(x)一阶导f'(x) for i=1:NH dlta2(i)=Who(i,:)*dlta3*df(i); end for i=1:NH DWih(:,i)=eta*dlta2(i)*N1o'; end Wih=Wih+DWih+a*(Wih_1-Wih_2); %----------更新数据----------- ly=y(k); u_2=u_1; u_1=u(k); err_2=err_1; err_1=err(k); Wih_2=Wih_1; Wih_1=Wih; Who_2=Who_1; Who_1=Who; end %绘图 figure(1) plot(t,rin,t,y,t,u,t,err,'linewidth',1.5); title('BP网络PID控制效果'); legend('期望曲线','跟踪曲线','控制量','跟踪误差'); xlabel('时间');ylabel('幅值'); figure(2) subplot(3,1,1);plot(t,Kp,'linewidth',1.5); title('PID参数变化曲线');ylabel('Kp'); subplot(3,1,2);plot(t,Ki,'linewidth',1.5); ylabel('Ki'); subplot(3,1,3);plot(t,Kd,'linewidth',1.5); ylabel('Kd');xlabel('时间'); |
|
相关推荐
1个回答
|
|
高手请作答,关注中
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1642 浏览 1 评论
200圆!求助大佬给一份VSG并网和离网模式的simulink仿真
1918 浏览 0 评论
MATLAB(3)--矩阵的引用(sub2ind、ind2sub、reshape函数使用)
2739 浏览 0 评论
3074 浏览 0 评论
4096 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 00:20 , Processed in 0.550067 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号