function LineAndNonlin
%% 参数初始化
l = 0.009; % 学习率
alfa = 0.05; % 动量因子
cells1 = 8; % 隐层神经元个数
cells2 = 4;
cells1_2 = 1; % 线性网络的隐层神经元个数
w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [8 ,1]
w2 = rand(cells2,cells1); % 随机赋值第二层连接权系数 [4, 8]
w3 = rand(1,cells2); % 随机赋值第三层连接权系数 [1, 4]
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值 [8, 1]
yw2 = rand(cells2,1); % 随机赋值第二层输出阈值 [4, 1]
yw3 = rand; % 随机赋值第三层输出阈值 [1]
w1_2 = rand(cells1_2,2); % 随机赋值第一层连接权系数 [1 ,2]
ts=0.001; % 样本
n = 1000; % 样本数
yn = rand(1,n); % 随机赋值输出(预测)
y = rand(1,n); % 随机赋值输出(真实)
counts = 1; % 计数值初始化
x = [0]; % 输入
x_2 = [0, 0]'; % 输入
g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出
aa = 0.3; % 线性部分参数
bb = 0.6; % 线性部分参数
times = 1; % 训练轮数
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
ei=0;
for a=1:n % 样本数
time(a)=a*ts;
u=0.50*sin(3*2*pi*a*ts); % 0.50*sin(3*2*pi*k)
g=u^3 + 0.3*u^2 - 0.4*u;
y(a) = aa*y_1 + bb*y_1_1 + g_1;
net1_1=w1*x-yw1; % 第一层网络的输入 [8, 1]
out1_1=logsig(net1_1); % 第一层网路的输出 [8, 1]
net2_1=w2*out1_1-yw2; % 第二层网络的输入 [4, 8]*[8 ,1]=[4, 1]
out2_1=logsig(net2_1); % 第二层网络的输出 [4, 1]
net3_1=w3*out2_1-yw3; % 第三层网络的输出 [1]
ynet=net3_1; % 第三层网络的输出 [1]
net1_2=w1_2*x_2; % 第一层网络的输入 [1]
yn(a) = net1_2 + ynet; % 计算两个模型的总输出
det3=y(a)-yn(a); % 计算偏差 [1]
det2=((det3*(w3))*out2_1)*(1-out2_1); % ([1, 4]*[4 ,1])*[4, 1] = [4, 1]
det1=((det2'*(w2))*out1_1)*(1-out1_1); % [8, 1]
w1=w1+det1*x'*l; % [8, 1]
w2=w2+(det2*out1_1')*l; % [4, 8]
w3=w3+(det3*out2_1')*l; % [1, 4]
yw1=-det1*l+yw1;
yw2=-det2*l+yw2;
yw3=-det3*l+yw3;
w1_2=w1_2+det3*x_2'*l; % [1, 2]
ei=ei+det3^2/2;
e(i)=ei;
g_1 = g;
y_1_1 = y_1;
y_1=y(a);
x(1)=g; % 更新输入
x_2(1) = y_1;
x_2(2) = y_1_1;
end % 结束一次样本遍历
if ei<0.008
break;
end
counts=counts+1;
end % 结束学习
%% 计算学习的曲线
x = [0]'; % 输入
x_2 = [0, 0]'; % 输入
yn_test = rand(1,n); % 随机赋值输出(预测)
y_test = rand(1,n); % 随机赋值输出(真实)
g_1 = 0; % 上一时刻的输入
y_1 = 0; % 上一时刻的输出
y_1_1 = 0; % 上上一时刻的输出
ts=0.1; % 样本
n = 1000; % 样本数
for a=1:n
u=sin(2*pi*a*ts/100); % sin(2*pi*a*ts/100)
g=u^3 + 0.3*u^2 - 0.4*u;
y_test(a) = aa*y_1 + bb*y_1_1 + g_1;
net1=w1*x-yw1;
out1=logsig(net1);
net2=w2*out1-yw2;
out2=logsig(net2);
net3=w3*out2-yw3;
ynet=net3;
net1_2=w1_2*x_2; % 第一层网络的输入 [1]
yn_test(a) = net1_2 + ynet; % 计算两个模型的总输出
g_1 = g;
y_1_1 = y_1;
y_1=y_test(a);
x(1)=g; % 更新输入
x_2(1) = y_1;
x_2(2) = y_1_1;
end
%% 绘图
figure(1);
subplot(2,1,1);
plot(time,y,'b-',time,yn,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=0.50*sin(3*2*pi*k)');
xlabel('x轴');
ylabel('y=0.50*sin(3*2*pi*k)');
if (counts<times)
count=1:counts;
sum=counts;
else
count=1:times;
sum=times;
end
subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');
figure(2);
plot(time,y_test,'b-',time,yn_test,'r-');
legend('true', 'forecast')
grid on
title('BP学习方法逼近y=sin(2*pi*a*ts/100)');
xlabel('x轴');
ylabel('y=sin(2*pi*a*ts/100)');
return