@数学建模

数学建模——灰色预测

灰色预测理论
灰色理论认为信息不完全系统的行为现象尽管是朦胧的,数据是复杂的,但它具备一定的潜在规律,是有整体功能的。灰色预测就是从杂乱中寻找出规律,从而对系统进行预测。
灰色模型(Grey Models,GM)
通过离散随机数经过生成变为较有规律的生成数,进而直接转化成微分方程的模型。常用模型有GM(1,1)模型、GM(1,N)模型、Verhulst模型、GM(2,1)模型,DGM模型和灰色波形预测。

1. GM(1,1)模型

知识点

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_02


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_03


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_04


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_05


例题

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_06


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_07


代码实现

上机课作业,可人为输入数据与预测年数,并作出图来。

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_08

% GM(1,1)模型
clc,clear
x0 = input('请输入一个列向量数组:')
k = input('请输入预测年数:')
% x0 = [124761 125786 126743 127627 128453 129227 129988 130756 131448]'  输入数据 注意这里为列向量
n = length(x0) %n=9
lamda = x0(1:n-1)./x0(2:n) % 级比 ——8个数据
range = minmax(lamda') %级比范围  
if range(1,1) < exp(-2/(n+2)) | range(1,2)>exp(2/(n+2))
    error('级比没有落入灰色模型的范围内')
else 
    %空行输出
    disp('         ');
    disp('可以用GM(1,1)建模')
end
x1 = cumsum(x0) %累加运算
B=[-0.5*(x1(1:n-1)+x1(2:n)),ones(n-1,1)]
Y=x0(2:n); 
u=inv(B'*B)*B'*Y   %拟合参数
%上述语句可替换为 u=B\Y 【有点不太理解】
% k=10;
forecast1 = (x1(1)-u(2)./u(1)).*exp(-u(1).*([0:n-1+k]))+u(2)./u(1);
%白化方程的离散响应
exchange = diff(forecast1)%最后10个为预测的数据
epsilon=x0(2:n)'-exchange(1:n-1)    %计算残差
delta=abs(epsilon./x0(2:n)')  %计算相对误差 
rho=1-(1-0.5*u(1))/(1+0.5*u(1))*lamda'  %计算级比偏差值
t1=1998:2006;
t2=1999:2006+k;
plot(t1,x0,'bo--');
hold on
plot(t2,exchange,'go-')
hold on;
title('预测结果');
legend('真实值','预测值');

2. GM(1,n)模型

知识点

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_09


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_10


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_11


例题

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_12


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_13


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_14


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_15


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_16


代码实现

%GM(1,N)
clc,clear
x0 = [4383 7625 10500 11316 17818 
    83 131 180 195 306 
    146 212 233 259 404];  % 录入数据
[m,n] = size(x0);
x1_d = cumsum(x0,2);  %累加序列
x11 = x1_d(1,:);  
z11=0.5*(x11(1:end-1)+x11(2:end));%紧邻均值生成
b = [-z11' x1_d(2,2:end)' x1_d(3,2:end)'];
y = x0(1,2:end)';
u = b\y   %参数矩阵
%%引入条件
x20 = [x0(2,:),400];
x30 = [x0(3,:),500];
x21 = cumsum(x20);x31 = cumsum(x30);
for k = 0:length(x21)-1
    x1(k+1) = (x0(1,1)-u(2)/u(1)*x21(k+1)-u(3)/u(1)*x31(k+1)).*exp(-u(1)*k)+u(2)/u(1)*x21(k+1)+u(3)/u(1)*x31(k+1);
end
x10hat = [x1(1),diff(x1)];        %进行差分运算
epsilon = x0(1,:) - x10hat(1:end-1);   %计算残差 
delta = abs(epsilon./x0(1,:));   %计算相对误差  
xhat = x10hat(end)  % 预测最终值

3. 灰色Verhulst模型

知识点

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_17


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_18


例题

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_19


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_20


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_21


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_22


代码实现

%灰色verhulst
clc,clear
x0 = [2.119 2.070 2.442 2.485 2.507 2.496 2.640 2.710] % 输入数据
n = length(x0)
year = 0:n-1

x1 = cumsum(x0) %累加运算
for i = 2:n
    z1(i) = 0.5*(x1(i)+x1(i-1));    % 紧邻均值序列
end
z1
B=[-z1(2:end)',z1(2:end)'.^2]
Y=x0(2:end)';

u=B\Y   %拟合参数 

forecast1 = (u(1)*x0(1))./(u(2)*x0(1)+(u(1)-u(2)*x0(1))*exp(u(1).*([2:n])))
exchange = diff(forecast1)
epsilon=x0(2:n-1)-exchange    %计算残差
delta=abs(epsilon./x0(2:n-1))  %计算相对误差

统一思路

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_23

4. 灰色波形预测

知识点

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_24


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_25


例题

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_Python灰色预测模型代码_26


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_27


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_28


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_29


灰色模型的检验

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_数据_30


Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_代码实现_31

Python灰色预测模型代码 灰色预测gm(1,n)matlab程序_拟合_32

5. GM(2,1)模型

6. DGM模型

7.案例分析