📄 hm02_a.m
字号:
% 文件名: hm02_a.m
% Matlab 程序用于训练神经网络来预估系统下一步的输出值
% 任务:
% (1) 训练 NN
% (2) 预估系统下一步的输出值.
% (3) 保证训练后NN达到质量要求.
% 求出给定系统的真实输出值.
% 定义已知系统参数
a1=0.8;
a2=0.5;
a3=1.0;
b1=0.5;
b2=-0.5;
% 设定输入输出初始值.
yt1=1.0;
ut1=1.0;
% 对所有的连接权设置初始值.
ww1=0.95;%%%%%%%%%%%%%%%%%%%%%%%% 连接权初始值
ww2=0.95;
ww3=0.95;
ww4=0.95;
ww5=0.95;
ww6=0.95;
% 选择学习率和Sigmoid函数(双曲正切函数)的常数.
c=0.85; %%%%%%%%%%%%%%%%%%% 学习率
k1=1;
k2=1;
k3=1;
d1=1;
d2=1;
d3=1;
% 循环用来创建数据.
for t=1:500;
u(t)=1.0954*(rand(1)-0.5); % 建立输入数据
e(t)=0.2*randn(1); % 建立误差数据
% 相对应的输出数据
y(t)=( (a1+b1*ut1*ut1)*yt1 + ut1*ut1*ut1 +a2*(a2+b2*ut1*ut1)*e(t) )/(a3+ut1+ut1*ut1) + e(t);
% 对于隐藏层的作用函数.
h1(t)=yt1*ww3 + ut1*ww6;
h2(t)=ut1*ww4 + yt1*ww5;
% Sigmoid 双曲正切函数.
sh1(t)=k1*( 2.0/( 1.0 + exp( -d1*h1(t) ) ) - 1.0 );
sh2(t)=k2*( 2.0/( 1.0 + exp( -d2*h2(t) ) ) - 1.0 );
% 由 sh1(t) 和 sh2(t) 分别对 h1(t) 和 h2(t) 求导.
dsh1(t)=-k1*2.0*d1*exp( -d1*h1(t) ) / ( 1.0 + exp( -d1*h1(t) ) )^2;
dsh2(t)=-k2*2.0*d2*exp( -d2*h2(t) ) / ( 1.0 + exp( -d2*h2(t) ) )^2;
% 输出层的输出.
y1(t)=sh1(t)*ww1 + sh2(t)*ww2;
sy1(t)=k3*( 2.0/(1.0 + exp(-d3*y1(t)) ) - 1.0 );
% 由 sy1(t) 对 y1(t) 求导.
dsy1(t)=-k3*2.0*d3*exp( -d3*y1(t) ) / ( 1.0+exp( -d3*y1(t) ) )^2;
% 基于上次值, 更新6个连接权值, 即实现BP算法.
w1(t)=ww1 + c*( y(t)-sy1(t) )*dsy1(t)*sh1(t);
w2(t)=ww2 + c*( y(t)-sy1(t) )*dsy1(t)*sh2(t);
w3(t)=ww3 + c*( y(t)-sy1(t) )*dsy1(t)*ww1*dsh1(t)*yt1;
w4(t)=ww4 + c*( y(t)-sy1(t) )*dsy1(t)*ww2*dsh2(t)*ut1;
w5(t)=ww5 + c*( y(t)-sy1(t) )*dsy1(t)*ww2*dsh2(t)*yt1;
w6(t)=ww6 + c*( y(t)-sy1(t) )*dsy1(t)*ww1*dsh1(t)*ut1;
% 更新输入输出, 以及6个连接权.
ut1=u(t);
yt1=y(t);
if (t==500) % 500次循环时, 显示连接权变化.
delta_ww1=w1(t)-ww1
delta_ww2=w2(t)-ww2
delta_ww3=w3(t)-ww3
delta_ww4=w4(t)-ww4
delta_ww5=w5(t)-ww5
delta_ww6=w6(t)-ww6
end;
ww1=w1(t);
ww2=w2(t);
ww3=w3(t);
ww4=w4(t);
ww5=w5(t);
ww6=w6(t);
end; % 结束 for=1:500 循环.
ww1
ww2
ww3
ww4
ww5
ww6
figure(1);
t=1:500;
plot (t,y(t),t,sy1(t),':')
title ('Comparison between y(t) and sy1(t) during training')
xlabel ('Iteration t')
ylabel ('y(t), sy1(t)')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -