灰色预测

来源:互联网 发布:蚁群算法的优缺点 编辑:程序博客网 时间:2024/04/28 21:34
                               **灰色预测算法简介**

1、灰色预测模型(数模必掌握)
灰色预测模型使用范围:
①数据样本点个数少,6-15个
②数据呈现指数或曲线的形式
③只适合做中短期预测,不适合长期预测。
灰色预测原理比较简单,详细的可以参考司守奎《数学建模算法与应用》。
需要注意的几点是:
(1)灰色预测的使用范围
(2)灰色预测中的“级比”如果级比不在范围要对数据进行处理。
(3)司老师书中的代码,并没有运行出后面的运行结果,如果想运行出预测的结果,看下面的说明。
(4)在使用灰色预测的时候要考虑残差等(见代码的最后三行)
(5)代码直接复制粘贴文本文档的文件就可以了。
(6)文本文档是给出了两种代码,不要复制错了,第一个是司老师书中的。第二个是实践,某城市 1986~1992 年道路交通噪声平均声级数据见表1。

                         表1 城市交通噪声数据/dB(A)

序号 年份 Leq 序号 年份 Leq
1 1986 71.1 5 1990 71.4
2 1987 72.4 6 1991 72.0
3 1988 72.4 7 1992 71.6
4 1989 72.1
该问题源代码如下:

clc,clearx0=[71.1 72.4 72.4 72.1 71.4 72.0 71.6]';%注意这里为列向量n=length(x0);lamda=x0(1:n-1)./x0(2:n) %计算级比range=minmax(lamda') %计算级比的范围x1=cumsum(x0); %累加运算B=[-0.5*(x1(1:n-1)+x1(2:n)),ones(n-1,1)];Y=x0(2:n);u=B\Ysyms x(t)x=dsolve(diff(x)+u(1)*x==u(2),x(0)==x0(1));%求微分方程的符号解xt=vpa(x,6)%以小数格式显示微分方程的解yuce1=subs(x,t,[0:n-1]);%为提高预测精度,先计算预测值,再显示微分方程的解。%%%这里,把[0:n-1]修改就可以了,如果预测后5年的,就改成n+4。yuce1=double(yuce1);%符号数转换成数值类型,否则无法做差分运算yuce=[x0(1),diff(yuce1)] %差分运算,还原数据yuce2=subs(x,t,[0:n+4]);%为提高预测精度,先计算预测值,再显示微分方程的解。Yuce2=double(yuce2);%符号数转换成数值类型,否则无法做差分运算yucexin=[x0(1),diff(yuce2)] %差分运算,还原数【直接把绿色总n-1修改,运算会提示错误,但是不影响,如果想消除错误提示,可以添加黄色区域的,计算出两个结果,一个结果是不预测的一个结果是预测的。】epsilon=x0'-yuce %计算残差delta=abs(epsilon./x0') %计算相对误差rho=1-(1-0.5*u(1))/(1+0.5*u(1))*lamda' %计算级比偏差值灰色预测模型使用简单,基本上可以实现黑箱操作。该模型在实际数学建模竞赛中,只需要把矩阵 换成自己的矩阵即可。改变“xt=vpa(x,6)”中的“6”即可改变显示精度,例如:xt=vpa(x,7)(一般六位显示精度满足数学建模数据精度的需要)。------下面是代码:-----------------------代码一----------------------clc,clearx0=[71.1 72.4 72.4 72.1 71.4 72.0 71.6]';%注意这里为列向量n=length(x0);lamda=x0(1:n-1)./x0(2:n); %计算级比range=minmax(lamda'); %计算级比的范围x1=cumsum(x0); %累加运算B=[-0.5*(x1(1:n-1)+x1(2:n)),ones(n-1,1)];Y=x0(2:n);u=B\Ysyms x(t)x=dsolve(diff(x)+u(1)*x==u(2),x(0)==x0(1));%求微分方程的符号解xt=vpa(x,6)%以小数格式显示微分方程的解yuce1=subs(x,t,[0:n-1]);%为提高预测精度,先计算预测值,再显示微分方程的解yuce1=double(yuce1);%符号数转换成数值类型,否则无法做差分运算yuce=[x0(1),diff(yuce1)]; %差分运算,还原数据epsilon=x0'-yuce; %计算残差delta=abs(epsilon./x0'); %计算相对误差rho=1-(1-0.5*u(1))/(1+0.5*u(1))*lamda';%计算级比偏差值----------------------代码二------------------------------clc,clear;  syms a b;  c=[a b]';  A=[89677,99215,109655,120333,135823,159878,182321,209407,246619,300670];  B=cumsum(A);  %原始数据累加  n=length(A);  for i=1:(n-1)      C(i)=(B(i)+B(i+1))/2; %生成累加矩阵  end  %计算待定参数的值  D=A;D(1)=[];  D=D';  E=[-C;ones(1,n-1)];  c=inv(E*E')*E*D;  c=c';  a=c(1);b=c(2);  %预测后续数据  F=[];F(1)=A(1);  for i=2:(n+10)  %只推测后10个数据,可以从此修改      F(i)=(A(1)-b/a)/exp(a*(i-1))+b/a;  end  G=[];G(1)=A(1);  for i=2:(n+10)  %只推测后10个数据,可以从此修改      G(i)=F(i)-F(i-1);  %得到预测出来的数据  end  t1=1999:2008;  t2=1999:2018;  %多10组数据  G  h=plot(t1,A,'o',t2,G,'-'); %原始数据与预测数据的比较