%format long
[m,n]=size(X0)
X1=cumsum(X0) %累加
X2=[]
for i=1:n-1
X2(i,:)=X1(i)+X1(i+1)
end
B=-0.5.*X2
t=ones(n-1,1)
B=[B,t] % 求B矩阵
YN=X0(2:end)
P_t=YN./X1(1:(length(X0)-1)) %对原始数据序列X0进行准光滑性检验,
%序列x0的光滑比P(t)=X0(t)/X1(t-1)
A=inv(B.'*B)*B.'*YN.'
a=A(1)
u=A(2)
c=u/a
b=X0(1)-c
X=[num2str(b),'exp','(',num2str(-a),'k',')',num2str(c)]
strcat('X(k+1)=',X)
%syms k
for t=1:length(X0)
k(1,t)=t-1
end
k
Y_k_1=b*exp(-a*k)+c
for j=1:length(k)-1
Y(1,j)=Y_k_1(j+1)-Y_k_1(j)
end
XY=[Y_k_1(1),Y]%预测值
CA=abs(XY-X0)%残差数列
Theta=CA %残差检验 绝对误差序列
XD_Theta= CA ./ X0 %残差检验 相对误差序列
AV=mean(CA) % 残差数列平均值
R_k=(min(Theta)+0.5*max(Theta))./(Theta+0.5*max(Theta)) % P=0.5
R=sum(R_k)/length(R_k) %关联度
Temp0=(CA-AV).^2
Temp1=sum(Temp0)/length(CA)
S2=sqrt(Temp1)%绝对误差序列的标准差
%----------
AV_0=mean(X0)% 原始序列平均值
Temp_0=(X0-AV_0).^2
Temp_1=sum(Temp_0)/length(CA)
S1=sqrt(Temp_1) %原始序列的标准差
TempC=S2/S1*100 %方差比
C=strcat(num2str(TempC),'%') %后验差检验 %方差比
%----------
SS=0.675*S1
Delta=abs(CA-AV)
TempN=find(Delta<=SS)
N1=length(TempN)
N2=length(CA)
TempP=N1/N2*100
P=strcat(num2str(TempP),'%') %后验差检验%计算小误差概率
%%%%%%%%%%%%%%%%把下面函数保存为gmcal.m文件%%%%%%%%%%%function gmcal=gm1(x)
sizexd2 = size(x,2)
%求数组长度
k=0
for y1=x
k=k+1
if k>1
x1(k)=x1(k-1)+x(k)
%累加生成
z1(k-1)=-0.5*(x1(k)+x1(k-1))
%z1维数减1,用于计算B
yn1(k-1)=x(k)
else
x1(k)=x(k)
end
end
%x1,z1,k,yn1
sizez1=size(z1,2)
%size(yn1)
z2 = z1'
z3 = ones(1,sizez1)'
YN = yn1' %转置
%YN
B=[z2 z3]
au0=inv(B'*B)*B'*YN
au = au0'
%B,au0,au
afor = au(1)
ufor = au(2)
ua = au(2)./au(1)
%afor,ufor,ua
%输出预测的 a u 和 u/a的值
constant1 = x(1)-ua
afor1 = -afor
x1t1 = 'x1(t+1)'
estr = 'exp'
tstr = 't'
leftbra = '('
rightbra = ')'
%constant1,afor1,x1t1,estr,tstr,leftbra,rightbra
strcat(x1t1,'=',num2str(constant1),estr,leftbra,num2str(afor1),tstr,rightbra,'+',leftbra,num2str(ua),rightbra)
%输出时间响应方程,也就是最终要求的灰色模型
%%%%%%%%%%%%%%%%%%%%%在workspace里输入%%%%%%%%%%%%
x =[5999,5903,5848,5700,7884]gm1(x)
%其中5999,5903,5848,5700,7884可以换成已知的历史数据,无论几个都可以。
clcclear all
% 本程序主要用来计算根据灰色理论建立的模型的预测值。
% 应用的数学模型是 GM(1,1)。
% 原始数据的处理方法是一次累加法。
y=[1662.87 2163.4 1965.35 2472.48 2900.66 3034.93 2755.5 3207 3462]%已知数据
n=length(y)
yy=ones(n,1)
yy(1)=y(1)
for i=2:n
yy(i)=yy(i-1)+y(i)
end
B=ones(n-1,2)
for i=1:(n-1)
B(i,1)=-(yy(i)+yy(i+1))/2
B(i,2)=1
end
BT=B'
for j=1:n-1
YN(j)=y(j+1)
end
YN=YN'
A=inv(BT*B)*BT*YN
a=A(1)
u=A(2)
t=u/a
t_test=4 %需要预测个数
i=1:t_test+n
yys(i+1)=(y(1)-t).*exp(-a.*i)+t
yys(1)=y(1)
for j=n+t_test:-1:2
ys(j)=yys(j)-yys(j-1)
end
x=1:n
xs=2:n+t_test
yn=ys(2:n+t_test)
plot(x,y,'^r',xs,yn,'*-b')
det=0
for i=2:n
det=det+abs(yn(i)-y(i))
end
det=det/(n-1)
disp(['百分绝对误差为:',num2str(det),'%'])
disp(['预测值为: ',num2str(ys(n+1:n+t_test))])
输出结果:
百分绝对误差为:228.3113%
预测值为: 3710.152 3978.2142 4265.6442 4573.8413
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)