1程序代码:%普通的灰色预测GM1.mclearX=input('请输入原始数据:','s');%原始数据(可以多行,每一行为一类原始数据,即可多类原始数据)X=str2num(X);[m1m2]=size(X);%m1和m2分别表示X的行数和列数k0=input('请输入所要预测的阶数:');%GM(1,1)模型fori=1:m1n=i;x0=X(i,:);%将原始数据X中的第i行数据赋给x0,即取出一类原始数据disp('1.原始数据:');Y='';forz=1:m2Y=strcat(Y,'(',num2str(x0(z)),')');enddisp(Y);%1.利用一次累加(1-AGO)生成新数列E=triu(ones(m2));%E表示元素为1右上三角阵x1=x0*E;%对原始数据进行一次累加(1-AGO)生成新数列x1disp('2.一次累加(1-AGO)生成的数据:');Y='';forz=1:m2Y=strcat(Y,'(',num2str(x1(z)),')');enddisp(Y);%2.计算出发展系数a,灰作用量ub1=x1;b1(1)=[];b2=x1;b2(m2)=[];b=-0.5*(b1+b2);%生成B的第一行B=[b;ones(1,m2-1)];%生成BB=B';%对B进行转置y0=x0;y0(1)=[];%生成Yy0=y0';%对Y进行转置A=((inv(B'*B))*B')*y0;%根据Y=BA(A为待辨识参数向量),可知A=[inv(B'B)]B'Ya=A(1);u=A(2);%A=[au]'%3.确立模型且求出模拟值u_a=u/a;fork=0:m2+k0-12x2(k+1)=(x0(1)-u_a)*exp(-k*a)+u_a;end%求出新数列的模拟值x2x3=x2;x3(m2+k0)=[];x4=[0x3];x5=x2-x4;%利用累减生成法求出原始数据的模拟值x5disp('3.一次累加(1-AGO)生成的数据的模拟值:')Y='';forz=1:m2+k0Y=strcat(Y,'(',num2str(x2(z)),')');enddisp(Y);disp('4.原始数据的模拟值:')Y='';forz=1:m2+k0Y=strcat(Y,'(',num2str(x5(z)),')');enddisp(Y);%4.模型检验(算出的值到等级参照表中检查其精度等级)%计算后验差比C和残差序列Qx6=x5(1:m2);Q=x0-x6;%Q为残差序列s1=std(Q);%s1为残差序列Q的标准差s2=std(x0);%s2为初始序列x0的标准差C=s1/s2;%后验差比C(越小越好)w1=1:m2;w1=[ones(m2,1)w1'];w2=Q';[bb,bint,r1,rint,stats]=regress(w2,w1);rcoplot(r1,rint)C1=strcat('5.后验差比(均方差比值):C=',num2str(C));disp(C1);ifC=0.35disp('由于C=0.35,则此模型精度等级为1级(好)。');elseifC=0.5disp('由于0.35C=0.5,则此模型精度等级为2级(合格)。');elseifC=0.65disp('由于0.5C=0.65,则此模型精度等级为3级(勉强)。');elsedisp('由于C0.65,则此模型精度等级为4级(不合格)。');endendend3%计算相对误差序列RR=Q./x0;disp('6.相对误差序列:')Y='';forz=1:m2Y=strcat(Y,'(',num2str(R(z)),')');enddisp(Y);disp('(1)如果相对误差为0.01则模型精度等级为1级(好)');disp('(2)如果相对误差为0.05则模型精度等级为2级(合格)');disp('(3)如果相对误差为0.10则模型精度等级为3级(勉强)');disp('(4)如果相对误差为0.20则模型精度等级为4级(不合格)');%计算小误差概率PQmean=mean(Q);%Qmean为残差序列Q的平均值D=abs(Q-Qmean);%D为残差序列Q与其平均值Qmean的差的绝对值p0=0.6745*s2;t=0;forj=1:m2ifD(j)p0t=t+1;endendP=t/m2;%计算小误差概率PP1=strcat('7.计算小误差概率:P=',num2str(P));disp(P1);ifP=0.95disp('由于P=0.95,则此模型精度等级为1级(好)。');elseifP=0.8disp('由于0.80=P0.95,则此模型精度等级为2级(合格)。');elseifP=0.7disp('由于0.70=P0.8,则此模型精度等级为3级(勉强)。');elsedisp('由于P0.70,则此模型精度等级为4级(不合格)。');endendend%5.模型适用范围a1=strcat('8.发展系数:a=',num2str(a));disp(a1);u1=strcat('灰作用量:u=',num2str(u));disp(u1);if-a0.3disp('由于-a0.3,则此模型适合用于中长期预测。');elseif-a0.54disp('由于0.3-a0.5,则此模型适合用于短期预测,中长期预测慎用。');elseif-a0.8disp('由于0.5-a0.8,则此模型作短期预测应十分谨慎。');elseif-a1disp('由于0.8-a1.0,则应采用残差修正GM(1,1)模型。');endendendendend普通灰色模型代码:fori=1:infifi==1e(i)=input('输入数据:');elseife(i-1)==0break;elsee(i)=input('输入数据::');endendendk=size(e);fori=1:(k(2)-1)x(i)=e(i);enddisp('原始序列为:')xn=size(x);m=n(2);fori=1:mx0=x(1:i);E=triu(ones(i));x1=x0*E;enddisp('累加后生成的序列为')x1forj=2:mz(j)=-0.5*(x1(j)+x1(j-1));end5fori=1:m-1c(i)=z(i+1);endd=ones(1,m-1);w=[c;d];B=w'fori=2:mf(i)=x(i);endforj=1:m-1y(j)=f(j+1);endY=y'A=((inv(B'*B))*B')*Y;a=A(1)u=A(2)u_a=u/adisp('确定的模型为:x1(k+1)=(x(1)-u_a)*exp(-k*a)+u_a')改进灰色模型代码:fori=1:infifi==1e(i)=input('输入数据:');elseife(i-1)==0break;elsee(i)=input('输入数据:');endendendk=size(e);fori=1:(k(2)-1)x(i)=e(i);enddisp('原始序列为:')xn=size(x);m=n(2);fori=1:mx0=x(1:i);E=triu(ones(i));x1=x0*E;end6disp('累加后生成的序列为')x1forj=2:mz(j)=-(x1(j)-x1(j-1))/(log(x1(j))-log(x1(j-1)));endfori=1:m-1c(i)=z(i+1);endd=ones(1,m-1);w=[c;d];B=w'fori=2:mf(i)=x(i);endforj=1:m-1y(j)=f(j+1);endY=y'A=((inv(B'*B))*B')*Y;a=A(1)u=A(2)fori=0:m-1g(i+1)=exp(-i*a);endd1=ones(1,m);g1=[g;d1];G=g1'R=((inv(G'*G))*G')*x1'C=R(1)D=R(2)disp('确定的模型为:x1(k+1)=C*exp(-a*k)+D')