用神经网络拟合一个非线性函数姓名:李海浪班级:10级自动化3班学号:P1018134791.基于BP神经网络逼近函数假设频率参数k=1,绘制要逼近的非线性函数的曲线。函数的曲线如图1所示.MATLAB程序如下:k=1;p=[0:0.05:10];t=sin(k*pi/4*p);plot(p,t);title('要逼近的正弦函数');xlabel('时间');ylabel(正弦波函数');012345678910-1-0.8-0.6-0.4-0.200.20.40.60.81要逼近的正弦波函数时间正弦波函数图1要逼近的正弦函数曲线2.建立网络应用newff()函数建立BP网络结构。隐层神经元数目n可以改变,暂设为n=3,输出层有一个神经元。选择隐层和输出层神经元传递函数分别为tansig函数和purelin函数,网络训练的算法采用Levenberg–Marquardt算法trainlm。NATLAB程序如下:n=3;net=newff(minmax(p),[n,1],{'tansig''purelin'},'trainlm');y1=sim(net,p);figure;plot(p,t,'-',p,y1,':')title('未训练网络的输出结果');xlabel('时间');ylabel('仿真输出--原函数');同时绘制网络输出曲线,并与原函数相比较,结果如图2所示。图2未训练网络的输出结果“”代表要逼近的非线性函数曲线;“‥‥”代表未经训练的函数曲线;因为使用newff()函数建立函数网络时,权值和阈值的初始化是随机的,所以网络输出结构很差,根本达不到函数逼近的目的,每次运行的结果也有时不同。3.网络训练应用train()函数对网络进行训练之前,需要预先设置网络训练参数。将训练时间设置为50,训练精度设置为0.01,其余参数使用缺省值。训练后得到的误差变化过程如图3所示。图3训练过程net.trainParam.epochs=50;net.trainParam.goal=0.01;net=train(net,p,t);TRAINLM-calcjx,Epoch0/50,MSE9.27774/0.01,Gradient13.3122/1e-010TRAINLM-calcjx,Epoch3/50,MSE0.00127047/0.01,Gradient0.0337555/1e-010TRAINLM,Performancegoalmet.从以上结果可以看出,网络训练速度很快,经过一次循环跌送过程就达到了要求的精度0.01。4.网络测试对于训练好的网络进行仿真:MATLAB程序如下:y2=sim(net,p);figure;plot(p,t,'-',p,y1,':',p,y2,'--')title('训练后网络的输出结果');xlabel('时间');ylabel('仿真输出');绘制网络输出曲线,并与原始非线性函数曲线以及未训练网络的输出结果曲线相比较,比较出来的结果如图4所示。图4训练后网络的输出结果“”代表要逼近的非线性函数曲线;“‥‥‥”代表未经训练的函数曲线;“―――”代表经过训练的函数曲线;从图中可以看出,得到的曲线和原始的非线性函数曲线很接近。这说明经过训练后,BP网络对非线性函数的逼近效果比较好。