%RNN 即Elman网络
%matlab自有版本
clear all;
clc;
global WI WO WR b1 b2;
%% 生成数据
[U,Y]=generateData(1000,1);
train_u=U(:,1:700);
train_y=Y(:,1:700);
test_u=U(:,701:end);
test_y=Y(:,701:end);
%数据归一化
[train_u1, st1] = mapminmax(train_u);
[train_y1, st2] = mapminmax(train_y);
% 测试数据做与训练数据相同的归一化操作
test_u1 = mapminmax('apply',test_u,st1);
test_y1 = mapminmax('apply',test_y,st2);
%% 神经初始化
% 包含15个神经元,训练函数为trainlm,traingdx
net=elmannet(1:1,15,'trainlm');
% 设置显示级别
net.trainParam.show=1;
% 最大迭代次数为2000次
net.trainParam.epochs=2000;
% 误差容限,达到此误差就可以停止训练
net.trainParam.goal=1.0e-6;
% 最多验证失败次数
net.trainParam.max_fail=5;
% 对网络进行初始化
net=init(net);
%% 输入训练样本进行训练
[net,per] = train(net,train_u,train_y);
%% 测试
test_y_1=test_y(:,1);
test_ym = sim(net, test_u);
test_ym_1= sim(net,test_u(:,1));
%% 自建格式测试
WI=net.IW{1,1};
WR=net.LW{1,1};
WO=net.LW{2,1};
b1=net.b{1};
b2=net.b{2};
[test_ym1_1,~]=forecast(test_u(:,1),zeros(15,1));
x=zeros(15,301);
for i=1:300
[test_ym1(i) x(:,i+1)]=forecast(test_u(:,i),x(:,i));
end
function [y xk]=forecast(U,X)
global WI WR WO b1 b2
xk=zeros(15,1);
S=WI*U+WR*X+b1;
xk=tansig(S);
y=purelin(WO*xk+b2);
end
%% 产生训练集
function [P Y]=generateData(dataNum,k)
pi=3.141592653;
switch k
case 1 %训练输入为函数值
t=linspace(1,dataNum,dataNum);
u=sin(2*t'*pi/25);
y=zeros(dataNum+1,1);
for i=1:dataNum
y(i+1)=u(i)^3+y(i)/(1+y(i)^2);
end
P = [y(1:dataNum),u]; %1*R
Y = y(2:dataNum+1);
case 2 %训练输入为随机值
u=2*rand(dataNum,1)-1;
y=zeros(dataNum+1,1);
for i=1:dataNum
y(i+1)=u(i)^3+y(i)/(1+y(i)^2);
end
P = [y(1:dataNum),u]; %1*R
Y = y(2:dataNum+1);
case 3
t=linspace(1,dataNum+1,dataNum+1);
u=sin(2*t'*pi/25);
y=zeros(dataNum+2,1);
for i=1:dataNum
y(i+2)=y(i+1)*y(i)*(y(i+1)+4.5)/(1+y(i+1)^2+y(i)^2)+u(i+1);
end
P = [y(2:dataNum+1),u(2:end)];
Y = y(3:end);
end
P = P';
Y = Y';
end