讨论:基于PID神经网络的系统辨识与控制
在采用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', ) %将图形窗口底色设为白色
% axis()
title('SPIDNNI')
% % figure
% % plot(Je)
% % title(' PIDNNI Je')
% % axis()
回复 1 # sunminmin 的帖子
给自己顶一下 那应该是那个年代里绝无仅有的景色吧。一个二十岁的小姑娘,留着齐耳短发,穿着小小的牛仔衣,擎起一瓶啤酒,就那样在大街上喝着走着。进入山坡。桃花盛开的土地上一片松软,踩在上面脚很舒服。 帮楼主顶下,我对辨识也是刚看了点皮毛 顶下!!!!!!!!! PID可以做辨识吗?我怎么感觉智能用于控制器设计?
页:
[1]