灰色预测

                               **灰色预测算法简介**

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,clear
x0=[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\Y
syms 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,clear
x0=[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\Y
syms 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,'-'); %原始数据与预测数据的比较  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值