zoukankan      html  css  js  c++  java
  • GM(1,1)程序设计

    GM(1,1)是灰色模型中较为常见的模型,下面是程序,x0是数据,可更改。

    之前编辑忘了说了,一般就是给定一组数据,自己根据这些数据拟合一个灰色模型,底下的代码可以得到该模型对应的公式。

    代码:

    % GM(1,1)
    % 程序有详尽注释
    clc;
    clear all;
    x0=[92.810 97.660 98.800 99.281 99.537 99.537 99.817 100.000];
    
    n=length(x0);
    % 做级比判断,看看是否适合用GM(1,1)建模
    lamda=x0(1:n-1)./x0(2:n);
    range=minmax(lamda);
    % 判定是否适合用一阶灰色模型建模
    if range(1,1)<exp(-(2/(n+2)))| range(1,2)>exp(2/(n+2))
        error('级比没有落入灰色模型的范围内,不适合用GM(1,1)建模');
    else
        % 空行输出
        disp('            ');
        disp('可用GM(1,1)建模');
    end
    
    %做AGO累加处理
    x1=cumsum(x0);
    for i=2:n
        %计算紧邻均值,也就是白化背景值
        z(i)=0.5*(x1(i)+x1(i-1));
    end
    B=[-z(2:n)',ones(n-1,1)];
    Y=x0(2:n)';
    % 矩阵做除法,计算发展系数和灰色作用量
    % 注意:这里是右除不是左除
    u=BY;
    % 在MATLAB中,用大写字母D表示导数,dsolve函数用来求解符号常微分方程
    x=dsolve('Dx+a*x=b','x(0)=x0');
    % subs函数的作用是替换元素,这里是把常量a,b,x0换成具体u(1),u(2),x(1)数值
    x=subs(x,{'a','b','x0'},{u(1),u(2),x1(1)});
    disp('函数:');
    vpa(x,6)
    forecast1=subs(x,'t',[0:n-1]);
    % digits和vpa函数用来控制计算的有效数字的位数
    digits(6)
    % y值是AGO形式的(还是累加的)
    y=vpa(x);
    % 把AGO输出值进行累减
    % diff用于对符号表达时进行求导
    % 但是如果输入的是向量,则表示计算原向量相邻元素的差
    exchange=diff(forecast1);
    % 输出灰色模型预测的值
    disp('输出预测模型预测的值:');
    forecast=[x0(1),exchange]
    % 计算残差
     epsilon=x0-forecast;
    % 计算相对误差
    delta=abs(epsilon./x0);
    
    % 检验模型的误差
    % 检验方法一:相对误差Q检验法
    disp('相对误差Q检验值:');
    Q=mean(delta)
    
    % 检验方法二:方差比C检验法
    % 计算标准差函数为std(x,a)
    % 如果后面一个参数a取0表示的是除以n-1,如果是1就是最后除以n
    disp('方差比C检验值:');
    C=std(epsilon,1)/std(x0,1)
    
    % 检验方法三:小误差概率P检验法
    S1=std(x0,1);
    S1_new=S1*0.6745;
    temp_P=find(abs(epsilon-mean(epsilon))<S1_new);
    disp('小误差概率P检验值:');
    P=length(temp_P)/n
    
    %绘制原始数列和灰色模型预测得出的数列差异折线图
    plot(1:n,x0,'ro','markersize',11);
    hold on
    plot(1:n,forecast,'k-','LineWidth',2.5);
    grid on;
    axis tight;
    xlabel('x');
    ylabel('y');
    title('保有量比例与时间序列的时间关系');
    legend('原始数列','模型数列');

    运行结果,程序输出的图形如下所示:


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    修复ecshop商品重量BUG小数位增至五位
    ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号
    php数字补零的两种方法
    PHP获取当前时间的毫秒数(yyyyMMddHHmmssSSS)
    ajax 设置Access-Control-Allow-Origin实现跨域访问
    MySQL Master High Available 源码篇
    MHA 报错:There is no alive slave. We can't do failover
    cdid
    mha error
    mysql relay log参数汇总
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965346.html
Copyright © 2011-2022 走看看