• 数学建模:灰色预测模型


    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

    数学建模:灰色预测模型

    灰色预测

    三个基本方法:

    累加数列:计算一阶累加生成数列

    x ( 1 ) ( k ) = ∑ i = 1 k x ( 0 ) ( i ) , k = 1 , 2 , ⋯   , n , x^{(1)}(k)=\sum_{i=1}^kx^{(0)}(i),k=1,2,\cdots,n, x(1)(k)=i=1kx(0)(i),k=1,2,,n,

    在这里插入图片描述


    累减数列:计算一阶累减生成数列

    x ( 0 ) ( k ) = x ( 1 ) ( k ) − x ( 1 ) ( k − 1 ) , k = 2 , 3 , ⋯   , n , x^{(0)}(k)=x^{(1)}(k)-x^{(1)}(k-1),k=2,3,\cdots,n, x(0)(k)=x(1)(k)x(1)(k1),k=2,3,,n,
    在这里插入图片描述


    加权累加:计算一阶等权邻接生成数,图片描述有误,此处计算的是一次累加的加权邻值生成

    z ( 0 ) ( k ) = 0.5 x ( 1 ) ( k ) + 0.5 x ( 1 ) ( k − 1 ) , k = 2 , 3 , ⋯   , n , z^{(0)}(k)=0.5x^{(1)}(k)+0.5x^{(1)}(k-1),k=2,3,\cdots,n, z(0)(k)=0.5x(1)(k)+0.5x(1)(k1),k=2,3,,n,

    在这里插入图片描述


    算法步骤

    1. 进行级比检验,检查是否满足建立微分方程的前提条件。

    λ ( k ) = x ( 0 ) ( k − 1 ) x ( 0 ) ( k ) \lambda(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)} λ(k)=x(0)(k)x(0)(k1)

    1. 对原数据做一次累加,计算加权邻值生成数
    2. 构造数据矩阵 B B B ,与数据向量 Y Y Y

    B   = [ − 1 2 ( x ( 1 ) ( 1 ) + x ( 1 ) ( 2 ) − 1 2 ( x ( 1 ) ( 2 ) + x ( 1 ) ( 3 ) ) 1 ⋮ ⋮ − 1 2 ( x ( 1 ) ( n − 1 ) + x ( 1 ) ( n ) ) ] , Y   = [ x ( 0 ) ( 2 ) x ( 0 ) ( 3 ) ⋮ x ( 0 ) ( n ) ] B~=\left[

    12(x(1)(1)+x(1)(2)12(x(1)(2)+x(1)(3))112(x(1)(n1)+x(1)(n))" role="presentation">12(x(1)(1)+x(1)(2)12(x(1)(2)+x(1)(3))112(x(1)(n1)+x(1)(n))
    \right],Y~=\left[
    x(0)(2)x(0)(3)x(0)(n)" role="presentation">x(0)(2)x(0)(3)x(0)(n)
    \right] B = 21(x(1)(1)+x(1)(21(x(1)(2)+x(1)(21(x(1)(n1)+x(1)(2)3)n)))1 ,Y = x(0)(x(0)(x(0)(2)3)n)

    1. 计算 a a a b b b 的值

    u ^ = ( a ^ , b ^ ) T = ( B T ⋅ B ) − 1 B T Y \hat{u}=(\hat{a},\hat{b})^T=(B^T\cdot B)^{-1}B^TY u^=(a^,b^)T=(BTB)1BTY

    1. 构建模型

    x ( 1 ) ( t ) = ( x ( 0 ) ( 1 ) − b a ) e − a ( t − 1 ) + b a . x^{(1)}(t)=(x^{(0)}(1)-\frac ba)e^{-a(t-1)}+\frac ba. x(1)(t)=(x(0)(1)ab)ea(t1)+ab.

    1. 计算生成模型值 x ^ ( 1 ) ( k ) \hat{x}^{(1)}(k) x^(1)(k) 和模型还原值 x ^ ( 0 ) ( k ) \hat{x}^{(0)}(k) x^(0)(k) 并且带入预测

    x ^ ( 0 ) ( k ) = x ^ ( 1 ) ( k ) − x ^ ( 1 ) ( k − 1 ) \hat{x}^{(0)}(k)=\hat{x}^{(1)}(k)-\hat{x}^{(1)}(k-1) x^(0)(k)=x^(1)(k)x^(1)(k1)

    1. 检验预测值

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    代码实现

    %95至04年数据
    clc;clear;
    data = [174 179 183 189 207 234 220.5 256 270 285];
    n = length(data);
     
    %% 级比检验通过
    check = [];
    for k = 2:n
        lambda(k) = data(k-1)/data(k);
        if (exp(-2/(n+1))<lambda(k))&&(lambda(k)<exp(2/(n+1)))
            check(end+1) = 1;
        else check(end+1) = 0;
        end
    end 
     
    %% 计算累加数列
    X1 = cumsum(data);
    
    %% 计算加权
    for i=2:n
        z(i) = 0.5*(X1(i-1)+X1(i));
    end
     
    %% 数据矩阵B及数据向量Y
    Y = data(2:n)';
    B = [-z(2:n)',ones(n-1,1)];
    u = (B'*B)\B'*Y;
    % u = B\Y; 表示B的逆 乘以 Y
    a = u(1,1);
    b = u(2,1);
     
    %% 构造模型并且带入预测值
    % 生成预测一次累加数列
    f_X1 = [];
    f_X0 = [];
    for k=1:n-1
        f_X1(1)=data(1);
        f_X1(k+1) = (data(1)-b/a)*exp(-a*k) + b/a;
    end
    % 前缀和反推原始数据
    for k=2:n
        f_X0(1)=data(1);
        f_X0(k)=f_X1(k)-f_X1(k-1);
    end
     
    %% 残差检验 与 级比偏差值检验
    for k=1:n-1
        sigma(k)=abs((data(k)-f_X0(k))/data(k));
        rho(k+1)=abs(1-((1-0.5*a)*lambda(k+1))/(1+0.5*a));
    end
    
    %% 预测下n个值
    test = input('nums:');
    nums = 5;
    n=n+test;
    f_f_X1 = [];
    f_f_X0 = [];
    for k=1:n-1
        f_f_X1(1)=data(1);
        f_f_X1(k+1) = (data(1)-b/a)*exp(-a*k) + b/a;
    end
    for k=2:n
        f_f_X0(1)=data(1);
        f_f_X0(k)=f_f_X1(k)-f_f_X1(k-1);
    end
    
    %% 绘图
    xAxis = 1995:2004;
    xAxisPredict = 1995:1995+n-1; 
    h = plot(xAxis,data,'o',xAxisPredict,f_f_X0,'-');
    set(gca, 'XScale', 'log', 'YScale', 'log');
    set(h,'LineWidth',1.5);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
  • 相关阅读:
    分别用c++,python,java写一个解决约瑟夫环问题的代码
    nodejs+vue电影在线预定与管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
    Pandas数据类型-DataFrame之创建和访问
    5.1获取物理内存容量
    leetcode 热题 100_搜索二维矩阵
    面试碰壁15次!作为一个已经27岁的测试工程师,未来在何方....
    深度学习--基础语法
    RabbitMQ 入门系列:4、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
    vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板(vite+vue3+ts+qiankun项目)
    mysql存储过程批量插入数据,构造 15w,150w,600w表
  • 原文地址:https://blog.csdn.net/jj6666djdbbd/article/details/132646184