用matlab建立gm(1,1)模型
用10448,10988 ,11267,11322, 9497,10519 ,11828 ,11826,11148, 11229,12824,12889,11758预测下一个值。如果没有用gm残差修正模型,预测结果误差较大。要进行残差修正,用matlab代码怎么写。谢谢。还没改进的代码如下:function yc0=GM1(x0,N)
n=length(x0);
for i=1:n
x1(i)=sum(x0(1:i));
end
for k=2:n % 紧邻均生成 z
% z(k)=0.5*x1(k)+0.5*x1(k-1);
z(k)=((x1(k)-x1(k-1))/(log2(x1(k))-log2(x1(k-1))))*log2(exp(1));
end
% for i=1:n-1
% b(i,1)=-z(i+1);
% y(i)=x0(i+1);
% end
% b(:,2)=1;
b(:,1)=-z(2:n)';
b(:,2)=1;
y=x0(2:n);
y=y'; % 转置为列向量
au=b\y; % 作矩阵除法,计算a u
yc1(1)=x0(1);
d=(1-exp(-n*au(1)))/(1-exp(-au(1)));
c=(sum(x1)+(d-n)*au(2)/au(1))/d;
for k=1:n+N-1
% c=x0(1)-au(2)/au(1);
yc1(k+1)=(c-au(2)/au(1))*exp( -au(1)*k)+au(2)/au(1);
end
yc0(1)=x0(1);
% for k=1:n+N-1
% yc0(k+1)=yc1(k+1)-yc1(k);
% end
yc0(2:n+N)=yc1(2:n+N)-yc1(1:n+N-1);
% disp(uint16(yc0(2:1:n+1)));
% for k=1:n
% e0(k)=x0(k)-yc0(k);
% end
e0=x0(1:n)-yc0(1:n);
max1=max(abs(e0));
r=1;
for k=2:n
r=r+0.5*max1/(abs(e0(k))+0.5*max1);
end
r=r/n; % r 表示关联度
pe=mean(e0);
% px0=sum(x0)/n;
% z=x0-px0;
% S1=sqrt(sum(z.^2)/n);
% z=e0-pe;
% S2=sqrt(sum(z.^2)/n);
% C=S2/S1
c= std(e0)./std(x0)
p=length(find(abs(e0-pe)<0.6745*std(x0)))/n;
if p>0.95&c<0.35
disp (' 预测精度好');
else if p>0.8&c<0.5
disp (' 预测合格');
else if p>0.7&c<0.65
disp (' 预测勉强合格');
else disp (' 预测不合格');
end
end
end
怎么进行残差修正啊