|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
在采用pid神经网络对系统进行辨识时,采用批处理法给网络提供训练样本集,每学习一次(把样本集中的所有样本点输进网络供网络学习)网络进行一次权值的调整,学习N次,网络训练结束,得到训练的权值,在训练得到的权值的作用下网络能非常逼近被辨识对象的模型。理论是这样,但是我写的程序总是达不到预期的效果,是我对PID神经网络的批处理法理解错了,还是程序写的不对???
- clc
- clear
- % close all
- elta=0.03; %学习步长
- step=400; %时间序列长度
- err_goal=0.001; %err_goal为期望误差最小值
- in1pw=zeros(step,1); %输入层至隐层比例元的权重
- in2pw=zeros(step,1);
- in1iw=zeros(step,1); %输入层至隐层积分元的权重
- in2iw=zeros(step,1);
- in1dw=zeros(step,1); %输入层至隐层微分元的权重
- in2dw=zeros(step,1);
- in1pw(1)=1; %输入层至隐层比例元的权重初值
- in2pw(1)=-1;
- in1iw(1)=0.1; %输入层至隐层积分元的权重初值
- in2iw(1)=-0.1;
- in1dw(1)=1; %输入层至隐层微分元的权重初值
- in2dw(1)=-1;
- in1pw(1:3,:)=1;
- in2pw(1:3,:)=-1;
- in1iw(1:3,:)=0.1;
- in2iw(1:3,:)=-0.1;
- in1dw(1:3,:)=1;
- in2dw(1:3,:)=-1;
- poutw=zeros(step,1); %隐含层比例神经元至输出层的权重
- ioutw=zeros(step,1); %隐含层积分神经元至输出层的权重
- doutw=zeros(step,1); %隐含层微分神经元至输出层的权重
- poutw(1)=0.1; %隐含层比例神经元至输出层的权重初值
- ioutw(1)=0.1; %隐含层积分神经元至输出层的权重初值
- doutw(1)=0.1; %隐含层微分神经元至输出层的权重初值
- poutw(1:3,:)=0.1;
- ioutw(1:3,:)=0.1;
- doutw(1:3,:)=0.1;
- in1u=zeros(step,1); %输入层神经元1输入值
- in2u=zeros(step,1); %输入层神经元2输入值
- in1y=zeros(step,1); %输入层神经元1输出值
- in2y=zeros(step,1); %输入层神经元2输出值
- pu=zeros(step,1); %隐层比例神经元的输入值
- iu=zeros(step,1); %隐层积分神经元的输入值
- du=zeros(step,1); %隐层微分神经元的输入值
- py=zeros(step,1); %隐层比例神经元的输出值
- iy=zeros(step,1); %隐层积分神经元的输出值
- dy=zeros(step,1); %隐层微分神经元的输出值
- outu=zeros(step,1); %输出层神经元输入值
- outy=zeros(step,1); %输出层神经元输出值
- yi=zeros(step,1); %SPIDNN的输出值,其值等于输出层神经元的输出值
-
- e=zeros(step,1); %对象输出和PIDNN输出之新息
- pe=zeros(step,1);
- ie=zeros(step,1);
- de=zeros(step,1);
-
- Je=zeros(step,1); %E为目标函数,即期望误差
- sgnp=zeros(step,1);
- sgni=zeros(step,1);
- sgnd=zeros(step,1);
- u=zeros(step,1);
- y=zeros(step,1);
- for i=1:600 %学习次数
- for k=3:step
- u(k-1)=0.2*sin(2*pi*(k-1)/25)+0.3*sin(pi*(k-1)/75);
- 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;
- % u(k)=0.2*sin(2*pi*k/25)+0.3*sin(pi*k/75);
-
- % u(k-1)=0.6*sin(2*pi*(k-1)/50)+0.4*sin(2*pi*(k-1)/75);
- % y(k)=5*y(k-1)/(2.5+y(k-1)^2)+u(k-1)^3;
- in1u(k)=u(k-1); %输入层神经元1输入值
- in2u(k)=y(k-1); %输入层神经元2输入值
- in1y(k)=in1u(k); %输入层神经元输出值
- in2y(k)=in2u(k);
- pu(k)=in1pw(k)*in1y(k)+in2pw(k)*in2y(k); %隐层比例神经元的输入值
- iu(k)=in1iw(k)*in1y(k)+in2iw(k)*in2y(k); %隐层积分神经元的输入值
- du(k)=in1dw(k)*in1y(k)+in2dw(k)*in2y(k); %隐层微分神经元的输入值
-
- py(k)=pu(k);
- iy(k)=iy(k-1)+iu(k);
- dy(k)=du(k)-du(k-1);
-
- % py(k) %隐层比例神经元的输出值限幅处理,防止网络过饱和
- if py(k)>1
- py(k)=1;
- elseif py(k)<-1
- py(k)=-1;
- end
-
- % iy(k) %隐层积分神经元的输出值限幅处理,防止网络过饱和
- if iy(k)>1
- iy(k)=1;
- elseif iy(k)<-1
- iy(k)=-1;
- end
-
- % dy(k) %隐层微分神经元的输出值限幅处理,防止网络过饱和
- if dy(k)>1
- dy(k)=1;
- elseif dy(k)<-1
- dy(k)=-1;
- end
-
- outu(k)=poutw(k)*py(k)+ioutw(k)*iy(k)+doutw(k)*dy(k); %输出层神经元输入值
- outy(k)=outu(k); %输出层神经元输出值
-
- yi(k)=outy(k); %计算SPIDNN的输出值,其值等于输出层神经元的输出值
-
- sgnp(k)=sign((py(k)-py(k-1))/(pu(k)-pu(k-1)));
- sgni(k)=sign((iy(k)-iy(k-1))/(iu(k)-iu(k-1)));
- sgnd(k)=sign((dy(k)-dy(k-1))/(du(k)-du(k-1)));
-
- e(k)=y(k)-yi(k); %计算对象输出和PIDNN输出之差值
- Je(k)=e(k)^2/2;
-
- pe(k)=e(k)*poutw(k)*sgnp(k);
- ie(k)=e(k)*ioutw(k)*sgni(k);
- de(k)=e(k)*doutw(k)*sgnd(k);
- % 输入层至隐含层权值调整 %输入层至隐层比例元的权重
- %输入层至隐层积分元的权重 %输入层至隐层微分元的权重
- in1pw(k+1)=in1pw(k)+elta*(pe(k)*in1y(k));
- in2pw(k+1)=in2pw(k)+elta*(pe(k)*in2y(k));
- in1iw(k+1)=in1iw(k)+elta*(ie(k)*in1y(k));
- in2iw(k+1)=in2iw(k)+elta*(ie(k)*in2y(k));
- in1dw(k+1)=in1dw(k)+elta*(de(k)*in1y(k));
- in2dw(k+1)=in2dw(k)+elta*(de(k)*in2y(k));
- % 隐含层至输出层权值调整
- poutw(k+1)=poutw(k)+elta*(e(k)*py(k)); %隐含层比例神经元至输出层的权重
- ioutw(k+1)=ioutw(k)+elta*(e(k)*iy(k)); %隐含层积分神经元至输出层的权重
- doutw(k+1)=doutw(k)+elta*(e(k)*dy(k)); %隐含层微分神经元至输出层的权重
- end
- in1pw(1:3,:)=in1pw(k+1);
- in2pw(1:3,:)=in2pw(k+1);
- in1iw(1:3,:)=in1iw(k+1);
- in2iw(1:3,:)=in2iw(k+1);
- in1dw(1:3,:)=in1dw(k+1);
- in2dw(1:3,:)=in2dw(k+1);
- poutw(1:3,:)=poutw(k+1);
- ioutw(1:3,:)=ioutw(k+1);
- doutw(1:3,:)=doutw(k+1);
- end
- figure
- plot(yi,'r')
- hold on
- plot(y,'k--')
- set(gcf, 'Color', [1,1,1]) %将图形窗口底色设为白色
- % axis([0 1000 -15 15])
- title('SPIDNNI')
- % % figure
- % % plot(Je)
- % % title(' PIDNNI Je')
- % % axis([0 1000 0 10])
复制代码
|
|