没事玩了一下matlab
发现现在网上的代码都是一组数据预测
所以我就写个批量数据的预测
顺便学习下matlab
----------------------------------我是快乐的分割线------------------------------------
灰色预测的主要思想是:
1、给定一组数据
2、进行累加,即
X(1)1=x(0)1
X(1)2=x(0)1+x(0)2
X(1)3=x(0)1+x(0)2+x(0)3
…
3、最终目的是为了构造预测方程:
其中:
而为了求得上式,需要:
好的,就是这样子灰色预测就写完了,下面就是各种循环各种写了
----------------------------------我是快乐的分割线------------------------------------
为了批量对多组数据进行预测
所以加入了一个打开excel:
%读取excel的数据,data = xlsread(filename, sheet, range) data=xlsread('D:\MATLAB\GM.xlsx', 1, 'A1:E2');
然后写个大大的for循环:
m=ndims(data);%维度 for i = 1:m ... end
省略号里面就是一组数据的预测程序了
灰色预测的思想很简单
我就不分段解释了
全部代码如下
function GM(t) clc; %清屏,以使计算结果独立显示 format long g; %设置计算精度 %读取excel的数据,data = xlsread(filename, sheet, range) data=xlsread('D:\MATLAB\GM.xlsx', 1, 'A1:E2'); %fprintf(data(1,:)); %x=data(1,:) %n=length(data)%长度 %加了;分号表示不将结果显示出来 m=ndims(data);%维度 t=input('你要预测多少期?'); for i = 1:m z=0; x=data(i,:); %下面的全部内容都在这个循环里面进行 %注意下面的那个end %每一行的长度 n=length(data); for j = 1:n z = z + x(j); be(j,:)=z; end %matlab的变量定义好乱,可以随便定义,都是局部变量 %本文这里除了i之外其他都算局部变量吧 %计算数据矩阵B的第一列和第二列数据 for j = 1:n-1 %第一列 c(j,:)=-0.5*(be(j,:)+be(j+1,:)); %第二列 e(j,:)=1; %代入矩阵B中 B(j,1)=c(j,:); B(j,2)=e(j,:); end %对原始数列平行移位 for j=2:n y(j-1,:)=x(1,j); end %计算参数α、μ矩阵 alpha=inv(B.'*B)*B.'*y; %计算数据估计值的累加数列 for k = 0:n-1+t ago(k+1,:)=(be(1)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(k))+alpha(2,:)/alpha(1,:); end %估计值的累加数列的还原,并计算出下一预测值 for j=1:n-1+t var(j+1,:)=ago(j+1,:)-ago(j,:); end %给出预测结果 result(i,:)=var(n+t,1); %计算残差 for j=2:n error(j,:)=var(j,:)-x(1,j); end %调用统计工具箱的标准差函数计算后验差的比值c S1=std(x) S2=std(error) c=S2/S1 end disp('预测结果为:') disp(result(:,1))
花了一个下午复习了一下matlab
发现编写m文件不是很难
但是matlab的语言逻辑有点乱
要不是我的逻辑有点乱
---------------------------------------orz-----------------------------------