clear 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
楼主,我试了下,没错啊,这段代码你不能全部复制到matlab的命令窗口中去首先,你得把矩阵X赋值,X不是你要处理的数据么?没有X程序运行不下去,
然后,将矩阵X赋值后你只需要复制下面这段代码就OK了
clc %清屏,以使结果独立显示
format long%设置计算精度
if length(x(:,1))==1 %对输入矩阵进行判断,如不是一维列矩阵,进行转置变换
x=x'
end
n=length(x)%取输入数据的样本量
z=0
for i=1:n %计算累加值,并将值赋予矩阵be
z=z+x(i,:)
be(i,:)=z
end
for i=2:n %对原始数列平行移位
y(i-1,:)=x(i,:)
end
for i=1:n-1 %计算数据矩阵B的第一列数据
c(i,:)=-0.5*(be(i,:)+be(i+1,:))
end
for j=1:n-1 %计算数据矩阵B的第二列数据
e(j,:)=1
end
for i=1:n-1 %构造数据矩阵B
B(i,1)=c(i,:)
B(i,2)=e(i,:)
end
alpha=inv(B'*B)*B'*y%计算参数 矩阵
for i=1:n+1 %计算数据估计值的累加数列,如改为n+1为n+m可预测后m-1个值
ago(i,:)=(x(1,:)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(i-1))+alpha(2,:)/alpha(1,:)
end
var(1,:)=ago(1,:)
for i=1:n %如改n为n+m-1,可预测后m-1个值
var(i+1,:)=ago(i+1,:)-ago(i,:)%估计值的累加数列的还原,并计算出下一预测值
end
for i=1:n
error(i,:)=var(i,:)-x(i,:)%计算残差
end
c=std(error)/std(x) %调用统计工具箱的标准差函数计算后验差的比值c
结果为c,照我说的做吧,肯定能出来,我在matlab7.0上跑的
ARMA 这是一个在matlab下时间序列分析模型的建立和预测程序。它在你电脑中D:\My Documents目录下,这只是你装的一个程序所在地文件夹,如果你确定不需要这个程序了就可以卸载并删除。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)