N2O=[0.101 0.102 0.106 0.109 0.111 0.113 0.114 0.118 0.119 0.122 0.125 0.129 0.132 0.133 ...
0.135 0.137 0.139 0.142 0.144 0.147 0.151 0.153 0.155 0.157 0.159 0.161];
CFCot=[0.091 0.096 0.102 0.108 0.113 0.117 0.124 0.131 0.136 0.141 0.147 0.152 0.156 0.16 ...
0.162 0.165 0.166 0.167 0.169 0.17 0.17 0.171 0.171 0.171 0.171 0.171];
CFCoo=[0.039 0.041 0.043 0.045 0.048 0.05 0.053 0.055 0.058 0.061 0.063 0.065 0.066 0.067 ...
0.067 0.067 0.067 0.067 0.067 0.066 0.066 0.066 0.065 0.065 0.064 0.064];
ozone=[265.7369863 264.4027397 262.1863014 264.6383562 256.2438356 259.8191781 252.5342466 254.7369863 261.5561644...
251.5287671 257.4383562 253.6383562 258.8690248 250.4506966 247.8975649 257.2696823 255.2685 252.9157609 ...
245.837527 256.2294319 250.4585185 250.3536513 255.4165116 249.8003694 253.9006126 247.8528705];
p=[N2O;CFCot;CFCoo]; %输入数据矩阵
t=[ozone]; %输出数据矩阵
%对输入矩阵r和输出矩阵c中数据进行归一化处理
[p1,pn]=mapminmax(p);
[t1,tn]=mapminmax(t);
%创建一个BP网络,训练函数为trainlm,隐含层为三层,节点数分别为18,9,6,传递函数分别为logsig,purelin,tansig
net=newff(p,t,[18,9,6],{'logsig','purelin','tansig'},'trainlm'); %建立模型
net.trainParam.show=1000; %1000次显示一次结果
net.trainParam.lr=0.05; %学习速度为0.05
net.trainParam.epochs=5000; %最大训练轮回为5000次
net.trainParam.goal=0.0000004; %均方误差为0.0000004
net=train(net,p1,t1); %开始训练,p1,t1分别为输入,输出的训练数据
%利用原始数据(p1)对BP网络仿真,检验模型
an=sim(net,p1); %用训练好的模型进行仿真
a=mapminmax('reverse',an,tn); %把仿真得到的数据还原为原始的数量级;
%本例因样本容量有限使用训练数据进行测试,通常必须用新鲜数据进行测试
x=1979:2004;
newo=a(1,:);
plot(x,newo,'r-o',x,ozone,'b--+') %绘值公路臭氧总量对比图
legend('网络输出臭氧总量','实际臭氧总量');
xlabel('年份');ylabel('DU');
error=abs(newo-ozone)/ozone; %计算相对误差
%利用训练好的网络进行预测
%用训练好的网络对新数据pnew进行预测时,也应作相应的处理
pnew=[0.163 0.164;0.172 0.172;0.063 0.062]; % 2005年和2006年的相关数据
pnewn=mapminmax(pnew); %利用原始输入数据的归一化参数对新数据进行归一化
anewn=sim(net,pnewn); %利用归一化后的数据进行仿真
anew=mapminmax('reverse',anewn,tn); %把仿真得到的数据还原为原始的数量级