% GM(1,N)模型预测
% 2013/8/13
% mingbo1501
% mingboctgu@163.com
clear;
clc;
close all;
p=12;%模型阶数
num=360;%检验个数
%----------------生成样本--------------------%
data0=load('runoff.txt');
data0=smooth(data0);
[m,n]=size(data0);
for i=1:m-p
data(i,:)=data0(i:i+p);%前p列输入,第p+1列输出
end
[m1,n1]=size(data);
X1=data(1:m1-num,1:p);Y1=data(1:m1-num,p+1);%训练样本
X2=data(m1-num+1:end,1:p);Y2=data(m1-num+1:end,p+1);%检验样本
%---------------建立模型并估计参数----------------------%
X1_sum=cumsum(X1,1);Y1_sum=cumsum(Y1,1);%进行一次累加
t=length(Y1_sum);%预报序列长度
for i=1:t-1
B1(i,1)=-0.5*(Y1_sum(i)+Y1_sum(i+1));
end
B_else=X1_sum(2:end,:);
B=[B1,B_else];
Y=Y1(2:end);
alph=(B'*B)\B'*Y;
a=alph(1);%系统发展系数
b=alph(2:end);%驱动系数
temp=zeros(t,1);
for i=1:t
temp(i,1)=(Y1_sum(1)-sum(X1_sum(i,:)'.*b/a))*exp(-a*(i))+sum(X1_sum(i,:)'.*b/a);
end
Y1_yuce=diff(temp);
yuce1=[Y1(1);Y1_yuce];
figure
plot(1:m1-num,yuce1,'b',1:m1-num,Y1,'r');
legend('预测值','实测值');
rate1=length(find((yuce1-Y1)./Y1*100<20))/(m1-num)*100;%合格率
DC1=1-sum((Y1-yuce1).^2)./sum((Y1-mean(Y1)).^2);%确定性系数
%--------------进行预报-------------------------%
X2_sum=cumsum(X1,1);Y2_sum=cumsum(Y1,1);%进行一次累加
temp1=zeros(num,1);
for i=t+1:m1
temp1(i-t,1)=(Y2_sum(1)-X2_sum(i-t,:)*b/a)*exp(-a*(i))+X2_sum(i-t,:)*b/a;
end
Y2_yuce=diff(temp1);
yuce2=[Y2(1);Y2_yuce];
figure
plot(1:num,yuce2,'b',1:num,Y2,'r');
legend('预测值','实测值');
rate2=length(find((yuce2-Y2)./Y2*100<20))/num*100;%合格率
DC2=1-sum((Y2-yuce2).^2)./sum((Y2-mean(Y2)).^2);%确定性系数