灰色预测的matlab实现,代码大全
- 格式:pdf
- 大小:113.15 KB
- 文档页数:6


灰⾊预测模型及MATLAB实例下⾯将主要从三⽅⾯进⾏⼤致讲解,灰⾊预测概念及原理、灰⾊预测的分类及求解步骤、灰⾊预测的实例讲解。
⼀、灰⾊预测概念及原理:1.概述:关于所谓的“颜⾊”预测或者检测等,⼤致分为三⾊:⿊、⽩、灰,在此以预测为例阐述。
其中,⽩⾊预测是指系统的内部特征完全已知,系统信息完全充分;⿊⾊预测指系统的内部特征⼀⽆所知,只能通过观测其与外界的联系来进⾏研究;灰⾊预测则是介于⿊、⽩两者之间的⼀种预测,⼀部分已知,⼀部分未知,系统因素间有不确定的关系。
细致度⽐较:⽩>⿊>灰。
2.原理:灰⾊预测是通过计算各因素之间的关联度,鉴别系统各因素之间发展趋势的相异程度。
其核⼼体系是灰⾊模型(Grey Model,GM),即对原始数据做累加⽣成(或者累减、均值等⽅法)⽣成近似的指数规律在进⾏建模的⽅法。
⼆、灰⾊预测的分类及求解步骤:1.GM(1,1)与GM(2,1)、DGM、Verhulst模型的分类⽐较:预测模型适⽤场景涉及的序列GM(1,1)模型⼀阶微分⽅程,只含有1个变量的灰⾊模型。
适⽤于有较强指数规律的序列。
累加序列均值序列GM(2,1)模型适⽤于预测预测具有饱和的S形序列或者单调的摆动发展序列缺陷。
累加序列累减序列均值序列DGM模型累加序列累减序列Verhulst模型累加序列均值序列2.求解步骤思维导图:其中预测过程可能会涉及以下三种序列、⽩化微分⽅程、以及⼀系列检验,由于⼤致都相同,仅仅是某些使⽤累加和累减,⽽另外⼀些则使⽤累加、累减和均值三个序列的差别⽽已。
于是下⾯笔者将对其进⾏归纳总结再进⾏绘制思维导图,帮助读者理解。
(1)原始序列(参考数据列):(2)1次累加序列(1-AGO):(3)1次累减序列(1-IAGO ):(也就是原始序列中,后⼀项依次减去前⼀项的值,例如,[x(2)-x(1),x(3-x(2),...,x(n)-x(n-1))]。
)(4)均值⽣成序列:(这是对累加序列"(前⼀项+后⼀项)/2"得出的结果。
利用MATLAB编程预测2003年中国蔬菜产量,并对预测结果做残差检验和后验差检验,程序如下:function [X,c,error1,error2]=GM11(X0,k)% 建立函数[X,c,error1,error2]=GM11(X0,k)% 其中X0为输入序列,k为预测长度,% X为预测输出序列,c为后验差检验数,error1为残差,error2为相对误差format long;n=length(X0);X1=[];X1(1)=X0(1);for i=2:nX1(i)=X1(i-1)+X0(i); %计算累加生成序列endfor i=1:n-1B(i,1)=-0.5*(X1(i)+X1(i+1)); %计算B,Y nB(i,2)=1;Y(i)=X0(i+1);endalpha=(B'*B)^(-1)*B'*Y'; %做最小二乘估计a=alpha(1,1);b=alpha(2,1);d=b/a; %计算时间响应函数参数c=X1(1)-d;X2(1)=X0(1);X(1)=X0(1);for i=1:n-1X2(i+1)=c*exp(-a*i)+d;X(i+1)=X2(i+1)-X2(i); %计算预测序列endfor i=(n+1):(n+k)X2(i)=c*exp(-a*(i-1))+d; %计算预测序列X(i)=X2(i)-X2(i-1);endfor i=1:nerror(i)=X(i)-X0(i);error1(i)=abs(error(i)); %计算残差error2(i)=error1(i)/X0(i); %计算相对误差endc=std(error1)/std(X0); %计算后验差检验数作业陕西省农业总产值数据如下年份 1985 1986 1987 1888 1989 1990 1991 1992 1993 1994 总产值 62.9 58.8 61.4 87.2 104.9 124.8 110.7 129.0 155.3 219.03请建立灰色系统GM (1,1)模型,并预测1995-1997三年的农业总产值 在命令行输入:X0=[62.9 58.8 61.4 87.2 104.9 124.8 110.7 129.0 155.3 219.03]; k=3;[X,c,error1,error2]=GM11(X0,k) plot(1985: 1994,X0,'g*-') hold onplot(1985:1997,X)1984198619881990199219941996199850100150200250300350奥运会金牌中国预测 X0=[15,5,16,16,28,32,51,38];[X,c,error1,error2]=GM11(X0,k) plot(1:8,X0,'g*-') hold on plot(1:9,X)123456789X0=[5,16,16,28,32,51,38]; k=1;[X,c,error1,error2]=GM11(X0,k) plot(1:7,X0,'g*-') hold on plot(1:8,X)12345678X0=[16,16,28,32,51,38]; k=1;[X,c,error1,error2]=GM11(X0,k) plot(1:6,X0,'g*-') hold onplot(1: 7,X)1234567X0=[16,28,32,51,38]; k=1;[X,c,error1,error2]=GM11(X0,k) plot(1:5,X0,'g*-') hold on plot(1:6,X)1 1.52 2.53 3.54 4.555.56X0=[28,32,51,38]; k=1;[X,c,error1,error2]=GM11(X0,k) plot(1:4,X0,'g*-') hold on plot(1:5,X)1 1.52 2.53 3.54 4.55X0=[32,51,38]; k=1;[X,c,error1,error2]=GM11(X0,k) plot(1:3,X0,'g*-') hold on plot(1:4,X)1 1.52 2.53 3.54。
MATLAB实现灰色预测程序灰色预测很好的东西呐,······~~··`~··~~~~~~~~~~~~~~~~~~~~~````````````` fon [feval,au,ec,C,P]=GM1_1(x, r)if nrgin<2myar=0;end[mx,nx]=size(x);if mx==1x=x';endn=length(x);for i=2:nz(i-1)=0.5*x1(i)+0.5*x1(i-1);endY=x(2:end);B(:,1)=-z;2)/au(1));yc(1)=x(1);for k=1:n+myear-1y1(k+1)=pm*exp(-au*k)+a(2)/au(1);yc(k+1)=y1(k+1)-y1(k);endfeval=yc';ex=ec./x;r=0;rou=0.5;for k=1:nr=r+rou* s(ec(k))+rou*max(a (ec))); endr=r/n;%%====%原始序列的标准差s1=std(x);%计算残差的标准差s2=std(ec);%计算CC=s2/s1;%计算后验概率deta=ec-mean(ec);index=fineta)<0.6745*s1);P=length(index)/n;%%if C<0.35&P>0.95disp('预测精度为一级')elsP>0.8disp('预测精度为二级')elseif >0.7disp('预测精度为三级')elsedisp('预测精度过低,需要对模型进行修正') endif r>0.6disp('关联度符合检验要求')end%%%%=========t1=1:length(x);t2=1:lengt);plot(t1,x,'b--+',t2,feval,'r-o')legend('原始数据','预测数据')另一个程序function [y,p,e]=huise_1_1(X,k)%灰色模型的malab程序%Example [y,p]=gm_1_1([200 250 300 350],2) %接口描述:X的预测的初始数列,|X|>4,K是指向后进行预测的个数%命令格式:程序保存的文件名,eg:huise.m 则命令是:huise([579.8 547.5 527.0 492.3437.0],5)if nargout>3;r('Too maoutput argument.');enif nargin==1,k=1;x_orig=X;elseif ==0|nargin>2errr('Wrong nu arguments.');endx_rig=X;predict=k; %AGO 处理,即是对初始数列进行一阶累加x=cumsum(x_orig); %计算系数(a 和u)------------------------n=leh(x_orig); %生成矩阵Bfor i=1:(n-1);B(i)=-(x(i)+x(i+1))/2;enB=[B' ones(n-1,1)]; %生成矩阵Yfor i=1:(n-1);y(i)=x_ori(i+1);edY=y'; %计算系数a=au(1) u=au(2) au=(inv(B'*B))*(B'*Y); %--------------------------------------------------------%把huise模型公式转换成符号coef1=au(2)/au(1);coef2=x_or (1)-coef1;co3=0-au(1);costr1=nm2str(coef1);costr2=numstr(abs(coef2));costr3=ntr(coef3);eq=strcat(ctr1,'+',costr2,'e^',costr3,'*(t-1))'); %计算每一个值for t=1:(n+predict)mcv(t)=co1+coef2*exp(coef3*(t-1));endx_mcv0=diff(mcv);x_mcve=[x_orig(1) x_mcv0] %输出图形中的各点x_c_error=x_orig_n-x_mcv;x_errr=mn(abs(x_c_error./x_orig_n));if x_error>0.2 %相对误差的均值disp('del disqualification!');elseif x_error>0.1dip('model check out');disp('model is perfect!');endplot(1:n,x_orig,'o',1:n+predict,x_mcve);p=x_mcve(end-predict+1:end); %画出预测模型和初始数列的点xlabel('年份(从第一个数据年份起)');ylabel('产水量(万吨)');tie('灰度模型GM(1,1)');grid ony=eq;e=x_error;p=x_mcve(end-predict+1:end);。