zoukankan      html  css  js  c++  java
  • 灰色预测

    灰色预测适用于小样本的预测,常用来解决一些不确定性的问题。

            理论知识书上都有介绍,下面仅列出程序设计,同时方便自己比赛。

            MATLAB是实现灰色预测过程的首选,用MATLAB编写灰色预测程序时,可以完全按照预测模型的求解步骤进行,也就是下面的步骤:

     

    • 对原始数据进行累加;
    • 构造累加矩阵B与常数向量;
    • 求解灰参数;
    • 将参数代入预测模型进行数据预测。

     

           下面举例,一个公司1999到2008年的利润为[89677,99215,109655,120333,135823,159878,182321,209407,246619,300670],现在要预测该公司未来几年的利润情况。

           在程序中我们仅仅预测该公司10年以后的情况,数据可修改,把(n+10)里的10改成你需要的数字即可。

          代码:

      

    预测数据与原始数据的比较,运行结果,其中圈代表原始数据,线是预测数据拟合的结果,想看每年对应的实际数据看矩阵G值,MATLAB有输出在command window里:

     

             下面为说明该程序的模板作用,举例说明CUMCM2005A题 长江水质的预测,其中1995年到2004年的长江污水排放数据如下:

     

    1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
    174 179 183 189 207 234 220.5 256 270 285

         代码和上一样,只是数据区改了,功能是预测长江未来10年的水质情况。

     

        代码:

     

    clc;
    close all;
    clear all;
    %A=xlsread('','B3:B35');
    %A=[71.1,72.4,72.4,72.1,71.4,72.0,71.6];
    %A=[6.2 5.8 6.1 6.0 6.4 8.5 11.1 8.5 8.2 8.0 7.8 7.5 7.2 7.0 8.2 11.7 13.4 12.6 15.6 14.2 16.3];
    A=[89677,99215,109655,120333,135823,159878,182321,209407,246619,300670];
    B=[];
    D=[];
    len=length(A);

    m=input('请输入需要预测的数量:');
    year=input('请输入开始年份:');
    s=0;
    for i=1:len
        s=s+A(i);
        B=[B,s];
    end

    Y=A(2:len)';
    for i=2:len
        D=[D;-1/2*(B(i)+B(i-1)),1];
    end

    C=inv(D'*D)*D'*Y
    for i=2:len+m
        y(i)=(A(1)-C(2)/C(1))*exp(-C(1)*(i-1))+C(2)/C(1);
    end
    y(1)=A(1);
    yc(1)=A(1);
    for i=2:len+m
        yc(i)=y(i)-y(i-1);
    end
    k=year:year+len+m-1
    x=year:year+len-1;
    figure(1)
    plot(k,yc,'r');hold on;
    plot(x,A,'O');hold on;
    xlabel('年份')
    ylabel('利润')
    yc=double(yc)
    grid on;
    figure (2)
    cur=[];
    for i=1:len
    cur(i)=(A(i)-yc(i))/(A(i));
    end
    plot(x,cur,'-r');

    title('相对残差')
    line([year,year+len],[0.1 0.1],'Marker','.','LineStyle','--')
    line([year,year+len],[-0.1 -0.1],'Marker','.','LineStyle','--')
    xlabel('年份')
    ylabel('残差')
    grid on

    figure(3)
    p(1)=0;
    for i=2:len
    p(i)=1-((1-0.5*C(1))/(1+0.5*C(1)))*(A(i-1)/A(i));
    end
    plot(x,p,'-b');
    axis([year year+len -0.5 0.5])
    title('级比偏差值')
    line([year year+len],[0.1 0.1],'Marker','.','LineStyle','--')
    line([year year+len],[-0.1 -0.1],'Marker','.','LineStyle','--')
    xlabel('年份')
    ylabel('级比偏差')
    grid on;


    预测结果:

     

  • 相关阅读:
    Solaris 11 system package 安装与更新(如:assembler)
    JS实现页面内跳转
    使用Eclipse进行嵌入式软件开发
    Eclipse下C++标准库报错::mbstate_t has not been declared
    嵌入式ARM开发环境搭建
    CCS内存数据转成图片
    RESET
    Android 圆角研究
    Java 重写必须满足的条件
    android 社会化分享集成
  • 原文地址:https://www.cnblogs.com/xuxinstyle/p/9128896.html
Copyright © 2011-2022 走看看