微微 发表于 2006-7-18 11:28

求助高手:现NAN数

求助各位高手,应用BP网络实现对PID自调整的程序中,总是出现NAN数是怎么回事啊,恳请指点,谢谢

[ 本帖最后由 ericlin 于 2006-7-18 19:01 编辑 ]

ericlin 发表于 2006-7-18 18:48

是divided by zero 了吧

微微 发表于 2006-7-20 10:14

没有啊,但是另外的一个模型是对的阿,这个模型在SIMULINK仿真是正确的,但是用程序编写就是不对了,BP网络学习了几秒后就停止了,不知道怎么回事,恳请高手深入指点,谢谢

ericlin 发表于 2006-7-21 12:04

“BP网络学习了几秒后就停止了”
可能原因:1。已经达到目标误差;2,达到最大训练步数,但无法达到目标误差。

微微 发表于 2006-7-21 16:09

如果出现这两种原因怎么去改进阿,还请ericlin教授指点一下,谢谢

[ 本帖最后由 微微 于 2006-7-21 16:12 编辑 ]

ericlin 发表于 2006-8-10 16:58

不是啊,它会告诉你具体什么原因的,如果已经达到目标误差就很好啊,不用改进。如果无法达到目标误差就增加训练步数,或者试试其他训练方法,要具体看你这方面的程序了,还有也有可能是其他原因的。看系统的提示语是什么啊?

微微 发表于 2006-8-11 10:28

我是用M函数编程的,只有图形的显示,看不出来是什么系统的提示阿,这样该怎么办呢,还请指点一下阿,谢谢

toes 发表于 2006-8-11 13:17

贴出程序给大家看看吧,也许会有人帮你。

微微 发表于 2006-8-12 15:37

%BP based PID Control
clear all;
close all;

xite=0.20;
alfa=0.05;

S=1; %Step type

IN=4;H=5;Out=3;%NN Structure
if S==1%Step Signal
    wi =[ 0.4501    0.2621    0.1154   -0.0943;
   -0.2689   -0.0435    0.2919    0.4355;
    0.1068   -0.4815    0.4218    0.4169;
   -0.0140    0.3214    0.2382   -0.0897;
    0.3913   -0.0553   -0.3237    0.3936];

   

wi=0.50*rands(H,IN);
wi_1=wi;wi_2=wi;wi_3=wi;
wo= [-0.4421   -0.4901   -0.3013   -0.3012   -0.0549;
   -0.1471   -0.3611    0.1038   -0.4847    0.4318;
    0.3132   -0.2972   -0.2278    0.2468   -0.0340];

wo_1=wo;wo_2=wo;wo_3=wo;
end




x=;
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 layer
I=Oh;             %Input to NN middle layer
error_2=0;
error_1=0;

ts=0.001;
for k=1:1:6000
time(k)=k*ts;

if S==1
   rin(k)=1.0;
elseif S==2
   rin(k)=sin(1*2*pi*k*ts);
end


ts=0.001;                  
sys=tf(659.0559*0.2,);
dsys=c2d(sys,ts,'z');
=tfdata(dsys,'v');   

yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2

error(k)=rin(k)-yout(k);

xi=;

x(1)=error(k)-error_1;
x(2)=error(k);
x(3)=error(k)-2*error_1+error_2;

epid=;
I=xi*wi';
for j=1:1:H
    Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %Middle Layer
end
K=wo*Oh;             %Output Layer
for l=1:1:Out
    K(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));      %Getting kp,ki,kd
end
kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);
Kpid=;

du(k)=Kpid*epid;
u(k)=u_1+du(k);

dyu(k)=sign((yout(k)-y_1)/(du(k)-du_1+0.0001));

%Output layer
for j=1:1:Out
    dK(j)=2/(exp(K(j))+exp(-K(j)))^2;
end
for l=1:1:Out
    delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
end

for l=1:1:Out
   for i=1:1:H
       d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);
   end
end
    wo=wo_1+d_wo+alfa*(wo_1-wo_2);
%Hidden layer
for i=1:1:H
    dO(i)=4/(exp(I(i))+exp(-I(i)))^2;
end
    segma=delta3*wo;
for i=1:1:H
   delta2(i)=dO(i)*segma(i);
end

d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);

%Parameters Update
du_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);
end
figure(1);
plot(time,rin,'r',time,yout,'b');
xlabel('time(s)');ylabel('rin,yout');
figure(2);
plot(time,error,'r');
xlabel('time(s)');ylabel('error');
figure(3);
plot(time,u,'r');
xlabel('time(s)');ylabel('u');
figure(4);
subplot(311);
plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');
subplot(312);
plot(time,ki,'g');
xlabel('time(s)');ylabel('ki');
subplot(313);
plot(time,kd,'b');
xlabel('time(s)');ylabel('kd');

微微 发表于 2006-8-12 15:39

还请各位高手帮忙看一下程序哪处出错了,怎么运行总是不对呢

happy 发表于 2006-8-15 18:13

我运行了一下上面的程序,没有什么错误
最后结果为四张图

微微 发表于 2006-8-15 20:08

谢谢happy教授!!但是运行的结果你觉得怎么样,四张图不对,在鼠标点击到程序中显示的结果是都是NAN,比如wi,明明是给定的值,但是当鼠标移动到程序中的这个部分是,还是出现NAN字样,一直没有找出原因。

happy 发表于 2006-8-16 10:26

原帖由 微微 于 2006-8-15 20:08 发表
谢谢happy教授!!但是运行的结果你觉得怎么样,四张图不对,在鼠标点击到程序中显示的结果是都是NAN,比如wi,明明是给定的值,但是当鼠标移动到程序中的这个部分是,还是出现NAN字样,一直没有找出原因。

wi=wi_1+d_wi+alfa*(wi_1-wi_2);

这个式子又没有可能为0呢?
另外最初的wi你也是随机给出的

微微 发表于 2006-8-17 09:12

谢谢happy 教授的关注。
是阿,我也不明白是怎么回事,图形的输出肯定是不对的,所以一直没有解决。

happy 发表于 2006-8-17 17:30

我又重新运行了一下,还是没有看到你说的NAN
下面试运行结果
页: [1] 2
查看完整版本: 求助高手:现NAN数