%BP逼近非线性函数,结果2-6-1
clear all;
close all;
clc;
xite=0.50; %学习速率
alfa=0.05; %动量因子
w2=rands(6,1); %隐层到输出层初始权值为【-1 1】随机值
w2_1=w2;w2_2=w2_1;
w1=rands(2,6); %输入层到隐层权值
w1_1=w1;w1_2=w1;
dw1=0*w1;
TIME=0;
x=[0,0]';
u_1=0;
y_1=0;
I=[0,0,0,0,0,0]';
Iout=[0,0,0,0,0,0]';
FI=[0,0,0,0,0,0]';
ts=0.001;
for k=1:1:1000
time(k)=k*ts;
u(k)=0.50*sin(6*pi*time(k)); %输入
y(k)=(u_1-0.9*y_1)/(1+y_1^2); %期望输出
%-------------前向传播,求网络输出--------------
for j=1:1:6
I(j)=x'*w1(:,j); %隐层输入
Iout(j)=1/(1+exp(-I(j))); %隐层输出
end
yn(k)=w2'*Iout; %网络输出
%------------反响传播,调整权值----------------
e(k)=y(k)-yn(k); % 误差
if e(k)>0.005
TIME=k;
end
w2=w2_1+(xite*e(k))*Iout+alfa*(w2_1-w2_2); %调整后的w2
for j=1:1:6
FI(j)=exp(-I(j))/(1+exp(-I(j)))^2;
end
for i=1:1:2
for j=1:1:6
dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i); %调整后的w1增量
end
end
w1=w1_1+dw1+alfa*(w1_1-w1_2); %调整后w1
x(1)=u(k); %下一次输入
x(2)=y(k);
w1_2=w1_1;w1_1=w1; %记住前两次的w1
w2_2=w2_1;w2_1=w2; %记住前两次的w2
u_1=u(k);
y_1=y(k);
end
%--------------图形显示---------------
TIME
figure(1);
plot(time,y,'r',time,yn,'b');
xlabel('times');ylabel('y and yn');
figure(2);
plot(time,y-yn,'r');
xlabel('times');ylabel('error');