参考论文:
[1]佚名. 灰色预测GM(1,1)模型的改进及应用[J]. 数学的实践与认识, 2011, 41(23):8.
详细介绍请查看论文,介绍很详细,本文只作记录。
本文用Matlab复现了论文第三部分的改进的灰色预测GM(1,1)模型,如有错误,敬请指正。
% GM(1,1)模型
% yuce : 预测值
% epsilon : 残差 (<0.2一般要求 <0.1较高要求)
% delta : 相对误差
% rho : 级比偏差值 (<0.2可以接受 <0.1较好)
clc,clear;
x0 = xlsread('工作簿1.xlsx');
k = input('请输入预测年数:');
%导入数据,这里为列向量
n = length(x0);
lamda = x0(1:n-1)./x0(2:n); % 级比 ——8个数据
range = minmax(lamda'); %级比范围
if range(1,1) < exp(-2/(n+2)) || range(1,2)>exp(2/(n+2))
error('级比没有落入灰色模型的范围内')
else
%空行输出
disp(' ');
disp('可以用GM(1,1)建模')
end
x1 = cumsum(x0) ;%累加运算
R= [1:n-1]';
W=0;
s1=inf;
g=ones(3,1);
for w=0:0.001:1 %遍历权重
B=[(w-1)*x1(1:n-1)-w*x1(2:n),ones(n-1,1)];
Y=x0(2:n);
T=(B'*B)\B'*Y; %拟合参数
a=T(1);
u=T(2);
C1=(x0(1)-u/a)/(1-exp(a))+sum(x0(2:n).*exp(-a*R));
C2=(1-exp(a))^(-2)+sum(exp(-2*a*R));
C=C1/C2;
S=(C/(1-exp(a))+u/a-x0(1))^2+sum((C*exp(-a*R)-x0(2:n)).^2);
if S<s1
s1=S;
W=w;
g(1)=a;
g(2)=u;
g(3)=C;
end
end
yucezhi = g(3)*exp(-g(1)*[0:n-1+k])
%白化方程的离散响应
epsilon=x0(1:n)'-yucezhi(1:n) %计算残差
delta=abs(epsilon./x0(1:n)') %计算相对误差
rho=1-(1-0.5*T(1))/(1+0.5*T(1))*lamda' %计算级比偏差值
t1=1998:2006;%时间自己修改
t2=1998:2006+k;%同上
plot(t1,x0,'bo--');
hold on
plot(t2,yucezhi,'go-')
hold on;
title('预测结果');
legend('真实值','预测值');