声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2831|回复: 5

[控制理论] 讨论:基于PID神经网络的系统辨识与控制

[复制链接]
发表于 2012-2-20 00:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在采用pid神经网络对系统进行辨识时,采用批处理法给网络提供训练样本集,每学习一次(把样本集中的所有样本点输进网络供网络学习)网络进行一次权值的调整,学习N次,网络训练结束,得到训练的权值,在训练得到的权值的作用下网络能非常逼近被辨识对象的模型。理论是这样,但是我写的程序总是达不到预期的效果,是我对PID神经网络的批处理法理解错了,还是程序写的不对???


  1. clc
  2. clear
  3. % close all
  4. elta=0.03; %学习步长
  5. step=400; %时间序列长度
  6. err_goal=0.001; %err_goal为期望误差最小值
  7. in1pw=zeros(step,1); %输入层至隐层比例元的权重
  8. in2pw=zeros(step,1);
  9. in1iw=zeros(step,1); %输入层至隐层积分元的权重
  10. in2iw=zeros(step,1);
  11. in1dw=zeros(step,1); %输入层至隐层微分元的权重
  12. in2dw=zeros(step,1);
  13. in1pw(1)=1; %输入层至隐层比例元的权重初值
  14. in2pw(1)=-1;
  15. in1iw(1)=0.1; %输入层至隐层积分元的权重初值
  16. in2iw(1)=-0.1;
  17. in1dw(1)=1; %输入层至隐层微分元的权重初值
  18. in2dw(1)=-1;
  19. in1pw(1:3,:)=1;
  20. in2pw(1:3,:)=-1;
  21. in1iw(1:3,:)=0.1;
  22. in2iw(1:3,:)=-0.1;
  23. in1dw(1:3,:)=1;
  24. in2dw(1:3,:)=-1;
  25. poutw=zeros(step,1); %隐含层比例神经元至输出层的权重
  26. ioutw=zeros(step,1); %隐含层积分神经元至输出层的权重
  27. doutw=zeros(step,1); %隐含层微分神经元至输出层的权重
  28. poutw(1)=0.1; %隐含层比例神经元至输出层的权重初值
  29. ioutw(1)=0.1; %隐含层积分神经元至输出层的权重初值
  30. doutw(1)=0.1; %隐含层微分神经元至输出层的权重初值
  31. poutw(1:3,:)=0.1;
  32. ioutw(1:3,:)=0.1;
  33. doutw(1:3,:)=0.1;
  34. in1u=zeros(step,1); %输入层神经元1输入值
  35. in2u=zeros(step,1); %输入层神经元2输入值
  36. in1y=zeros(step,1); %输入层神经元1输出值
  37. in2y=zeros(step,1); %输入层神经元2输出值
  38. pu=zeros(step,1); %隐层比例神经元的输入值
  39. iu=zeros(step,1); %隐层积分神经元的输入值
  40. du=zeros(step,1); %隐层微分神经元的输入值
  41. py=zeros(step,1); %隐层比例神经元的输出值
  42. iy=zeros(step,1); %隐层积分神经元的输出值
  43. dy=zeros(step,1); %隐层微分神经元的输出值
  44. outu=zeros(step,1); %输出层神经元输入值
  45. outy=zeros(step,1); %输出层神经元输出值
  46. yi=zeros(step,1); %SPIDNN的输出值,其值等于输出层神经元的输出值
  47.    
  48. e=zeros(step,1); %对象输出和PIDNN输出之新息
  49. pe=zeros(step,1);
  50. ie=zeros(step,1);
  51. de=zeros(step,1);
  52.    
  53. Je=zeros(step,1); %E为目标函数,即期望误差
  54. sgnp=zeros(step,1);
  55. sgni=zeros(step,1);
  56. sgnd=zeros(step,1);
  57. u=zeros(step,1);
  58. y=zeros(step,1);
  59. for i=1:600 %学习次数
  60. for k=3:step
  61.     u(k-1)=0.2*sin(2*pi*(k-1)/25)+0.3*sin(pi*(k-1)/75);
  62.     y(k)=0.4*y(k-1)+0.54*y(k-2)+u(k-1)^3+u(k-1)^2-2.5*u(k-1)+rand()/4;
  63. %     u(k)=0.2*sin(2*pi*k/25)+0.3*sin(pi*k/75);
  64.    
  65. % u(k-1)=0.6*sin(2*pi*(k-1)/50)+0.4*sin(2*pi*(k-1)/75);
  66. % y(k)=5*y(k-1)/(2.5+y(k-1)^2)+u(k-1)^3;
  67.     in1u(k)=u(k-1); %输入层神经元1输入值
  68.     in2u(k)=y(k-1); %输入层神经元2输入值
  69.     in1y(k)=in1u(k); %输入层神经元输出值
  70.     in2y(k)=in2u(k);
  71.     pu(k)=in1pw(k)*in1y(k)+in2pw(k)*in2y(k); %隐层比例神经元的输入值
  72.     iu(k)=in1iw(k)*in1y(k)+in2iw(k)*in2y(k); %隐层积分神经元的输入值
  73.     du(k)=in1dw(k)*in1y(k)+in2dw(k)*in2y(k); %隐层微分神经元的输入值
  74.    
  75.     py(k)=pu(k);
  76.     iy(k)=iy(k-1)+iu(k);
  77.     dy(k)=du(k)-du(k-1);
  78.    
  79. %     py(k) %隐层比例神经元的输出值限幅处理,防止网络过饱和
  80.     if py(k)>1
  81.         py(k)=1;        
  82.     elseif py(k)<-1
  83.         py(k)=-1;
  84.     end
  85.    
  86. %     iy(k) %隐层积分神经元的输出值限幅处理,防止网络过饱和   
  87.     if iy(k)>1
  88.         iy(k)=1;        
  89.     elseif iy(k)<-1
  90.         iy(k)=-1;
  91.     end
  92.    
  93. %     dy(k) %隐层微分神经元的输出值限幅处理,防止网络过饱和   
  94.     if dy(k)>1
  95.         dy(k)=1;        
  96.     elseif dy(k)<-1
  97.         dy(k)=-1;
  98.     end
  99.            
  100.     outu(k)=poutw(k)*py(k)+ioutw(k)*iy(k)+doutw(k)*dy(k); %输出层神经元输入值
  101.     outy(k)=outu(k); %输出层神经元输出值
  102.    
  103.     yi(k)=outy(k); %计算SPIDNN的输出值,其值等于输出层神经元的输出值
  104.    
  105.     sgnp(k)=sign((py(k)-py(k-1))/(pu(k)-pu(k-1)));
  106.     sgni(k)=sign((iy(k)-iy(k-1))/(iu(k)-iu(k-1)));
  107.     sgnd(k)=sign((dy(k)-dy(k-1))/(du(k)-du(k-1)));
  108.         
  109.     e(k)=y(k)-yi(k); %计算对象输出和PIDNN输出之差值
  110.     Je(k)=e(k)^2/2;

  111.     pe(k)=e(k)*poutw(k)*sgnp(k);
  112.     ie(k)=e(k)*ioutw(k)*sgni(k);
  113.     de(k)=e(k)*doutw(k)*sgnd(k);  
  114. %  输入层至隐含层权值调整 %输入层至隐层比例元的权重
  115. %输入层至隐层积分元的权重 %输入层至隐层微分元的权重
  116. in1pw(k+1)=in1pw(k)+elta*(pe(k)*in1y(k));
  117. in2pw(k+1)=in2pw(k)+elta*(pe(k)*in2y(k));  
  118. in1iw(k+1)=in1iw(k)+elta*(ie(k)*in1y(k));
  119. in2iw(k+1)=in2iw(k)+elta*(ie(k)*in2y(k));   
  120. in1dw(k+1)=in1dw(k)+elta*(de(k)*in1y(k));
  121. in2dw(k+1)=in2dw(k)+elta*(de(k)*in2y(k));
  122. %  隐含层至输出层权值调整
  123. poutw(k+1)=poutw(k)+elta*(e(k)*py(k)); %隐含层比例神经元至输出层的权重
  124. ioutw(k+1)=ioutw(k)+elta*(e(k)*iy(k)); %隐含层积分神经元至输出层的权重
  125. doutw(k+1)=doutw(k)+elta*(e(k)*dy(k)); %隐含层微分神经元至输出层的权重
  126. end
  127. in1pw(1:3,:)=in1pw(k+1);
  128. in2pw(1:3,:)=in2pw(k+1);
  129. in1iw(1:3,:)=in1iw(k+1);
  130. in2iw(1:3,:)=in2iw(k+1);
  131. in1dw(1:3,:)=in1dw(k+1);
  132. in2dw(1:3,:)=in2dw(k+1);
  133. poutw(1:3,:)=poutw(k+1);
  134. ioutw(1:3,:)=ioutw(k+1);
  135. doutw(1:3,:)=doutw(k+1);

  136. end
  137. figure
  138. plot(yi,'r')
  139. hold on
  140. plot(y,'k--')
  141. set(gcf, 'Color', [1,1,1]) %将图形窗口底色设为白色
  142. % axis([0 1000 -15 15])
  143. title('SPIDNNI')
  144. % % figure
  145. % % plot(Je)
  146. % % title(' PIDNNI Je')
  147. % % axis([0 1000 0 10])
复制代码

点评

pid神经网络理论参见舒怀林的《pid神经元网络及其控制系统》  发表于 2012-2-20 00:58
回复
分享到:

使用道具 举报

 楼主| 发表于 2012-2-20 16:18 | 显示全部楼层
回复 1 # sunminmin 的帖子

给自己顶一下
发表于 2012-2-22 15:35 | 显示全部楼层
那应该是那个年代里绝无仅有的景色吧。一个二十岁的小姑娘,留着齐耳短发,穿着小小的牛仔衣,擎起一瓶啤酒,就那样在大街上喝着走着。进入山坡。桃花盛开的土地上一片松软,踩在上面脚很舒服。
发表于 2012-6-5 15:46 | 显示全部楼层
帮楼主顶下,我对辨识也是刚看了点皮毛
发表于 2012-6-12 17:08 | 显示全部楼层
顶下!!!!!!!!!
发表于 2012-8-20 16:14 | 显示全部楼层
PID可以做辨识吗?我怎么感觉智能用于控制器设计?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-15 13:00 , Processed in 0.071762 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表