%% 基于BP神经网络对非线性函数进行逼近
%% 清空环境变量
clear
clc
%% 初始化部分
%初始化学习参数
eta=0.3;
% 初始化权值矩阵
wij=2*rand(2,5)-1;
wjk=2*rand(5,1)-1;
% 初始化阈值
thetaj=2*rand(5,1)-1;
thetak=2*rand(1)-1;
%设定误差标准
errstd=0.05;
errall=10;
xteach1=linspace(-10,10,11);
xteach2=linspace(-10,10,11);
for p=1:11
for q=1:11
yteach(p,q)= (sin(xteach1(p))/xteach1(p))*(sin(xteach2(q))/xteach2(q));
end
end
while i<10000000000
i
for p=1:11
for q=1:11
%取样本
xt=[xteach1(p);xteach2(q)];
yt=yteach(p,q);
%计算各层的输出,前向传播
oi=xt;
netj=wij'*xt;
oj=1./(1+exp(-(netj-thetaj)));
netk=wjk'*oj;
ok=1./(1+exp(-(netk-thetak)));
y=ok;
%计算各层误差 后向传播
deltak=(yt-y).*ok.*(1-ok);
deltaj=wjk*deltak.*oj.*(1-oj);
%修正权值和阈值
wij=wij+eta*oi*deltaj';
thetaj=thetaj-eta*deltaj;
wjk=wjk+eta*oj*deltak';
thetak=thetak-eta*deltak;
%保存当前样本误差
errp=((yt-y).^2)./2;
end
if errp < 0.00000000001
break
end
i = i + 1;
end
end
%画图显示
x1=-10:0.1:10;
x2=-10:0.1:10;
[x,y]=meshgrid(x1,x2);
z1=(sin(x)/x)*(sin(y)/y);
figure(1)
mesh(x,y,z1);
title('标准图像')
hold on
x1=linspace(-10,10,21);
x2=linspace(-10,10,21);
for p=1:21
for q=1:21
%取样本
xt=[x1(p);x2(q)];
oi=xt;
netj=wij'*xt;
oj=1./(1+exp(-(netj-thetaj)));
netk=wjk'*oj;
ok=1./(1+exp(-(netk-thetak)));
z2(p,q)=ok;
end
end
figure;
[x,y]=meshgrid(x1,x2);
mesh(x,y,z2);
title('测试结果图像');