clear
clc
close all
%输入
x=[1.2 2 3 2.1 3 5 9 1.3 45 11 41 2.3 6.3 5.4 55 22 21 11 36 5.6 12 26 31 9.5;
-10 0.2 -6 4 6.5 -5 -9 0.5 10 22 11 2.6 6.3 3.5 22 21 11 10 -15 2 6 6 4 3.8;
10 2 5.9 4 6 3.5 8 9 5 26 10 2.6 11 2.6 3.6 0.8 1.1 2.8 5.2 2.3 6.5 4.5 6.8 8.2;
1 2 3 5 66 88 12 0.5 20 0.9 9.8 66 11 5.8 44 62 23 36 45 135 65 23 21 11;
1.2 3 6 3.5 6.3 5 8 4 5 5 6 4.5 6.3 3.5 2.5 3.8 3.8 4.5 6.5 2.5 4 5 6 2;]
y=[5 5.1 5.2 5.3 6.3 6.9 5 6 7 5.6 5.7 6.5 6.2 6.1 6.3 6.5 6.4 6.6 5.8 6.9 6.8 6.7 5.6 6]
%%划分训练数据与测试数据
trainx=x(:,6:24);
%训练样本对应的输出;
trainy=y(6:24);
%测试输入向量
testx=x(:,1:5);
%测试对应的样本输出
testy=y(1:5);
%%对训练样本插值
%训练样本的个数
N=size(trainx,2);
X=[trainx:trainy];
%网格
[xx0,yy0]=meshgrid(1:N,1:6);
[xx1,yy1]=meshgrid(linspace(1,N,100),1:6);
%使用interp2函数插值做二维插值
xx=interp2(xx0,yy0,X,xx1,yy1,'cubic');
%形状复原
trainx=xx(1:5,:);
trainy=yy(6,:);
%%创建网络
er=1e-8;%误差容限
spread=22;%扩散因子
M=101;%神经元个数
net=newrb(trainx,trainy,er,spread,M);
%%测试
yy=net(testx);
%计算显示相对误差
e=(testy-yy)./testy;
fprintf('相对误差:\n');
fprintf('%f',e);
fprintf('\n\n');
%平均相对误差
m=mean(abs(e));
fprintf('平均相对误差:\n %f',m);
%最大相对误差
ma=max(abs(e));
fprintf('最大相对误差:\n %f',ma);
%显示实际值与拟合值
figure(1)
plot(1:5,testy,'bo-')
hold on
plot(1:5,yy,'r*-')
title('地下水测试结果')
axis([1,5,0,8])
%显示残差
figure(2)
plot(1:5,abs(testy-yy),'-o')
title('残差')
axis([1,5,0,0.3])