用智能控制理论所学的知识对下面的二维函数建模

更新时间:2023-04-05 05:44:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验报告

用智能控制理论所学的知识对下面的二维函数建模:

xy y

x z

) sin( )

sin(

训练数据取x=(-10:2:10)=[-10,-8,-6,-4,-2,0,2,4,6,8,10]共11个点,y=(-10:2:10)=[-10,-8,-6,-4,-2,0,2,4,6,8,10]共11个点,总共的训练数据为(2维输入1维输出)11×11=121组。建模完成后,用x=(-10:0.5:10),y=(-10:0.5:10)

的输入数据进行模型测试,并与直接利用解析公式的结果进行对比,体会非线性建模过程中各个参数对性能的影响。

用x=(-10:2:10),y=(-10:2:10)训练数据及精确结果所绘制的曲面

用x=(-10:0.5:10),y=(-10:0.5:10)测试数据及精确结果所绘制的曲面

采用BP神经网络:

BP网络训练结果的参数:

用x=(-10:2:10),y=(-10:2:10)训练数据进行模型测试,经BP网络输出结果绘制的平面。

训练数据经BP网络输出结果与精确结果算得的结果误差基本控制在0.03以内。

用x=(-10:0.5:10),y=(-10:0.5:10)测试数据进行模型测试,经BP网络输出结果绘制的平面。

测试数据经BP网络输出结果与精确结果算得的结果误差基本控制在0.05以内。可以发现经过BP网络测试数据所得结果的误差是大于训练数据的。

实验中每次结果不同,这是因为网络初始化为随机的,这里和以下实验均取比较好的结果。

1、.隐含层的神经元数的影响

网络训练精度的提高,可以通过采用一个隐含层,而增加神经元数目的方法来获得。当我们把神经元个数从20个改为10个时,可以观察到误差明显变大。

2、学习速率的影响

学习速率决定每一次循环训练中所产生的权值变化量。

大的学习速率可能导致系统的不稳定;小的学习速率导致较长的训练时间,可能收敛很慢,不过能保证系统不跳出误差表面的低谷而最终趋于最小误差值。

当我们把学习速率从0.05个改为0.1个时,可以观察到误差明显变大。

当我们把学习速率从0.05个改为0.03个时,可以观察到误差变化不大。但是由于初始化的随机性,有时会出现较大误差,可能是由于收敛较慢,还未收敛到最小误差。

3、期望误差的影响

期望误差值也应当通过对比训练后确定一个合适的值,合适是相对于所需要的隐含层的节点数来确定,因为较小的期望误差值是要靠增加隐含层的节点,以及训练时间来获得的。

在一般情况下,作为对比,可以同时对两个不同期望误差值的网络进行训练,最后通过综合因素的考虑来确定采用其中一个网络。经过几次比较,我们最终选取期望误差为0.000001。

当我们把期望误差从0.00001减小到0.000005时,误差变大。这里我们也可以发

现期望误差并非越小越好。

采用ANFIS方法

用x=(-10:2:10),y=(-10:2:10)训练数据进行模型测试,采用ANFIS方法绘制的平面。

用x=(-10:0.5:10),y=(-10:0.5:10)测试数据进行模型测试,采用ANFIS方法绘制的平面。

通过比较,我们可以发现Anfis法误差较小,收敛较快,而且每次的结果随机性很小,基本不变。

附页:

BP神经网络程序

x=[-10:2:10];

y=[-10:2:10];

z1=sin(x+eps)./(x+eps);

z2=sin(y+eps)./(y+eps);

z=z1'*z2; %输入训练数据

m=size(x,2);

n=size(y,2);

pr=zeros(2,m*n); %生成输入两维矩阵

for i=1:m

for j=1:n

pr(1,(m*(i-1)+j))=x(i);

pr(2,(m*(i-1)+j))=y(j);

end

end

%给两维矩阵赋值,第一行为x,第二行为y

net=newff(minmax(pr),[20 1],{'tansig','purelin'},'trainlm'); %建立网络图像,第一层神经元20个,第二层神经元1个

net=init(net); %权值初始化

net.trainParam.show=100; %每迭代100次显示一次

net.trainParam.lr=0.05; %学习速率

net.trainParam.epochs=300; %训练次数

net.trainParam.goal=0.00001; %误差指标

r1=reshape(z,1,m*n); %将两行矩阵转化为一行

net=train(net,pr,r1); %网络训练

%%%%%%%%%%%%%训练数据曲面%%%%%%%%%%%%%%%%%%

figure;

mesh(x,y,z);

title('训练数据精确结果曲面'); %输入和显示原始结果

bpz1=sim(net,pr);

bpz1=reshape(bpz1,m,n);

figure;

mesh(x,y,bpz1);

title('训练后训练数据经过BP神经网络的结果'); %利用BP网络进行模型测试

figure;

mesh(x,y,bpz1-z);

title('误差曲面'); %显示误差

%%%%%%%%%%%%%测试数据曲面%%%%%%%%%%%%%%%%%%

x2=[-10:0.5:10];

y2=[-10:0.5:10];

z1_2=sin(x2+eps)./(x2+eps);

z2_2=sin(y2+eps)./(y2+eps);

z_2=z1_2'*z2_2;

figure;

mesh(x2,y2,z_2);

title('测试数据的精确结果曲面'); %输入和显示原始结果

m2=size(x2,2);

n2=size(y2,2);

pr2=zeros(2,m2*n2);

for i2=1:m2

for j2=1:n2

pr2(1,(m2*(i2-1)+j2))=x2(i2);

pr2(2,(m2*(i2-1)+j2))=y2(j2);

end

end

bpz2=sim(net,pr2);

bpz2=reshape(bpz2,m2,n2);

figure;

mesh(x2,y2,bpz2);

title('训练后测试数据经过BP神经网络的结果'); %利用BP网络进行模型测试

figure;

mesh(x2,y2,bpz2-z_2);

title('误差曲面'); %显示误差

ANFIS方法程序:

x=[-10:2:10];

y=[-10:2:10];

z1=sin(x+eps)./(x+eps);

z2=sin(y+eps)./(y+eps);

z=z1'*z2; %输入训练数据

m=size(x,2);

n=size(y,2);

pr=zeros(3,m*n); %生成输入两维矩阵

for i=1:m

for j=1:n

pr(1,(m*(i-1)+j))=x(i);

pr(2,(m*(i-1)+j))=y(j);

pr(3,(m*(i-1)+j))=z(i,j);

end

end

%给两维矩阵赋值,第一行为x,第二行为y

trnData=pr';

numMFs=7; %7条隶属度函数

mfType='gaussmf'; %采用高斯型隶属度函数,也可以选用其他种类的隶属度函数

epoch_n=20; %训练的次数

in_fismat=genfis1(trnData,numMFs,mfType); %用函数genfis1由训练数据直接生成模糊推理系统参数

out_fismat=anfis(trnData,in_fismat,epoch_n); %学习完成后得到的模糊推理系统矩阵

%%%%%%%%%%%%%训练数据曲面%%%%%%%%%%%%%%%%%%

figure;

mesh(x,y,z);

title('训练数据的精确结果曲面'); %输入和显示原始结果

p=zeros(2,m*n); %生成输入两维矩阵

for i=1:m

for j=1:n

p(1,(m*(i-1)+j))=x(i);

p(2,(m*(i-1)+j))=y(j);

end

end

anfisz1=evalfis(p,out_fismat);

anfisz1=reshape(anfisz1',m,n);

figure;

mesh(x,y,anfisz1);

title('训练后训练数据的解析公式结果'); %利用解析公式进行模型测试

figure;

mesh(x,y,anfisz1-z);

title('误差曲面'); %显示误差

%%%%%%%%%%%%%测试数据曲面%%%%%%%%%%%%%%%%%% x2=[-10:0.5:10];

y2=[-10:0.5:10];

z1_2=sin(x2+eps)./(x2+eps);

z2_2=sin(y2+eps)./(y2+eps);

z_2=z1_2'*z2_2;

figure;

mesh(x2,y2,z_2);

title('测试数据的精确结果曲面'); %输入和显示原始结果

m2=size(x2,2);

n2=size(y2,2);

pr2=zeros(2,m2*n2);

for i2=1:m2

for j2=1:n2

pr2(1,(m2*(i2-1)+j2))=x2(i2);

pr2(2,(m2*(i2-1)+j2))=y2(j2);

end

end

anfisz2=evalfis(pr2,out_fismat);

anfisz2=reshape(anfisz2',m2,n2);

figure;

mesh(x2,y2,bpz2);

title('训练后测试数据的解析公式结果'); %利用解析公式进行模型测试

figure;

mesh(x2,y2,anfisz2-z_2);

title('误差曲面'); %显示误差

本文来源:https://www.bwwdw.com/article/lfhl.html

Top