(采用BP神经网络完成非线性函数的逼近)神经网络
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制系统仿真与模型处理设计报告
(采用BP神经网络完成非线性函数的逼近)
1、题目要求:
(1)确定一种神经网络、网络结构参数和学习算法。
(2)选择适当的训练样本和检验样本,给出选取方法。
(3)训练网络使学习目标误差函数达到0.01,写出学习结束后的网络各参数,并绘制学习之前、第100次学习和学习结束后各期望输出曲线、实际输出曲线。绘制网络训练过程的目标误差函数曲线。
(4)验证网络的泛化能力,给出网络的泛化误差。绘制网络检验样本的期望输出曲线和网络输出曲线。
(5)分别改变神经网络的中间节点个数、改变网络的层数、改变学习算法进行比较实验,讨论系统的逼近情况,给出你自己的结论和看法。
2、设计方案:
在MATLAB中建立M文件下输入如下命令:
x=[0:0.01:1];
y=2.2*power(x-0.25,2)+sin(5*pi*x);
plot(x,y)
xlabel('x');
ylabel('y');
title('非线性函数');
得到如下图形,即所给的非线性函数曲线图:
构造一个1-7-1的BP神经网络,第一层为输入层,节点个数为1;第二层为隐层,节点个数为7;变换函数选正切s型函数(tansig);第三层为输出层,节点个数为1,输出层神经元传递函数为purelin函数。并且选Levenberg-Marquardt算法(trainlm)为BP网络的学习算法。对于该初始网络,我们选用sim()函数观察网络输出。继续在M函数中如下输入。
net=newff(minmax(x),[1,7,1],{'tansig','tansig','purelin'},'trainlm'); y1=sim(net,x);
figure;
plot(x,y,'b',x,y1,'r')
title('期望输出与实际输出比较');
xlabel('t');
则得到以下所示训练的BP网络期望输出与实际输出曲线比较:
应用函数train()对网络进行训练之前,需要预先设置训练参数。将最大训练次数为100次,训练精度设置为0.01,学习速度为0.01。
net.trainParam.epochs=100;
net.trainParam.goal=0.001;
net.trainParam.lr=0.01;
net=train(net,x,y);
y2=sim(net,x);
plot(x,y,'-r',x,y2,'*g')
title('训练后的结果');
下图为网络训练过程,可以看到,当训练4次以后,就已达要求。
下图为训练后的结果曲线,“*”为学习过后的曲线,红线为期望输出,两条曲线已经很相近了。这说明经过训练后,BP网络对非线性函数的逼近效果相当好。
接着检验网络的泛化能力,在M文件后,继续输入
err=y-y2;
plot(x,y2,'*g',x,err,'+c');
得到以下图形,由图可知,网络具有很好的泛化能力。
将神经网络的节点数为3时,相关图形如下。
从上面3个图中我们可以看出,当节点为3时,经过训练后,BP网络对非线性函数的逼近效果明显减弱,并且在经过100次训练后仍然达不到所要求的输出精度。我由此推出,当层数一样多的时候,隐层神经元数目愈多,则BP网络逼近非线性函数的能力越强。
我把上述的层数分布:1-7-1改为1-3-5-1,得到以下的结果:
从三幅图中我们可以看到,在神经元数目一样的情况下,不同的层数对结果
是有明显影响的。
我将原训练函数trainlm改为traingd,得到以下输出结果。
从三幅图可以看出,将trainlm改为traingd之后,连所要求的精度都不能达到。我由此推出,训练算法对非线性函数的逼近有一定影响,应当选择适合的训练算法。
3、总结:
通过这次作业,我总算对神经网络有了一定的了解,在实践中学习的确能加深对知识的理解和运用能力。这次我特地没有用nntool工具箱,而是采用M文件编辑,也算对其有了初步的掌握,感觉M文件编写很灵活,分号的作用很明显,
和命令窗口相比也更容易修改参数。