• matlab批量灰色预测


    没事玩了一下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:MATLABGM.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:MATLABGM.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-----------------------------------

  • 相关阅读:
    HDU4348To the moon主席树,区间修改
    不修改的主席(HJT)树-HDU2665,POJ-2104;
    斐波那契数列性质
    HDU-2795Billboard+对宽度建立线段树
    BZOJ-3343教主的魔法+分块(大块排序二分)
    BZOJ4034 [HAOI2015]树上操作+DFS序+线段树
    ECfinal-D-Ice Cream Tower-二分+贪心
    codeforce617E-XOR and Favorite Number莫队+异或前缀和
    BZOJ1878[SDOI2009]HH的项链+莫队算法模板
    POJ-1222EXTENDED LIGHTS OUT-位运算枚举模板
  • 原文地址:https://www.cnblogs.com/TTyb/p/5773836.html
Copyright © 2020-2023  润新知