matlab 灰色系统预测 GM(1,1) 数学建模

本文代码主要是基于邓聚龙教授在20实际80年代提出的灰色系统理论。



GM0.m
%该函数为GM(1,1)模型返回还原值 
function f=GM0(x0,t)  %数据数列 
[M,N]=size(x0);        %算出数据数列的大小 
x1(1)=x0(1);           %累加生成数列 
for i=2:N;     
    x1(i)=x1(i-1)+x0(i); 
end
x2=[];              %累加生成数列均值生成数列 
for j=1:(N-1);     
    x2(j)=(x1(j)+x1(j+1))/2; 
end
x=x0;              %数据数列镜像
x(1)=[];           %删除第一个数据 
Y=x';              %数据列向量 
global a; 
global b; 
B(:,1)=-x2';
B(:,2)=1; 
A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量 
a=A(1,1);           %求参数a 
b=A(2,1);           %求参数b  
f=(1-exp(a))*(x0(1)-b/a)*exp(-a*(t-1));
f

GM1.m:
%该函数为GM(1,1)模型中数据数列进行光滑比检验 
function f=GM1(x0)   %数据数列 
N=max(size(x0));       %算出数据数列的大小  
x1=cumsum(x0);         %累加生成数列 
global J; 
global J1;
global J2; 
x0(1)=[]; 
x1(N)=[]; 
global r;
r=x0./x1;  
for j=2:(N-1);           %判断数据数列是否满足准光滑条件1   
   if(r(j)>=0.5||r(j)<0)         
       J1=0;         
       break;     
   else
       J1=1;     
   end
end
for l=1:(N-2);           %判断数据数列是否满足准光滑条件2     
    if((r(l+1)/r(l))>=1)         
        J2=0;         
        break;     
    else
        J2=1;     
    end
end
J=J1+J2;  
if(J==2)                 %判断数据数列是否为准光滑数列     
    disp('数据为准光滑数列')
else
    disp('数据不是准光滑数列') 
end

GM2.m
%该函数为GM(1,1)模型还原值参数计算 
function f=GM2(x0)  %数据数列
[M,N]=size(x0);      %算出数据数列的大小  
x1(1)=x0(1);         %累加生成数列 
for i=2:N;      
    x1(i)=x1(i-1)+x0(i); 
end
x2=[];              %累加生成数列均值生成数列 
for j=1:(N-1);      
    x2(j)=(x1(j)+x1(j+1))/2;
end
  x=x0;              %数据数列镜像      
  x(1)=[];           %删除第一个数据 
  Y=x';              %数据列向量 
  global a; 
  global b; 
  B(:,1)=-x2'; 
  B(:,2)=1;  
  A=inv(B'*B)*B'*Y;   %求参量a,b组成的参数向量 
  a=A(1,1);           %求参数a 
  disp('参数a为:') 
  a 
  b=A(2,1);           %求参数b 
  disp('参数b为:') 
  b

GM3.m
%该程序实现G(1,1)模型的精度检验 
%包括平均相对误差,绝对关联度,均方差比值,小误差概率检验
function f=GM3(x0) 
N=max(size(x0)); 
x=GM0(x0,1:N);  %利用已有程序GM2得出数据列模型估计值 
x(1)=x0(1);     %更正第一个估计值 
disp('模型模拟估计值为') 
x 
A=x-x0;         %计算绝对残差序列 
disp('模型估计值绝对残差序列为:')
A 
G=abs(A); 
Amin=min(G);    %计算最小绝对值绝对残差 
Amax=max(G);    %计算最大绝对值绝对残差 
B=A./x0;        %计算相对误差序列 
disp('模型估计值相对误差序列为:') 
B  
P=sum(abs(B))/N;     %计算平均相对误差 
disp('模型估计值平均相对误差为:')
P  
for i=1:1:N       %通过循环计算关联系数序列     
    D(i)=(Amin+0.5*Amax)/(G(i)+0.5*Amax); 
end
R=sum(D)/N;  
disp('关联度为:') 
R  
x_=sum(x0)/N;    %计算数据的均值  
S1=(sum((x0-x_).^2)/(N-1))^0.5;   %计算数据序列方均差
A_=sum(A)/N;     %计算残差平均值  
S2=(sum((A-A_).^2)/(N-1))^0.5;    %计算残差序列方均差
C=S2/S1;         %计算方均差比值 
disp('均方差比值为:') 
C  
S0=0.6745*S1;
E=A-A_; 
F=find(E



你可能感兴趣的:(Matlab)