每日一题【20200731】

灰色预测案例分析


问:预测下一次旱灾的出现的时间

matlab求解

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
(1)function.m
function [x,a,b,c,error1,error2]=GM11(x0,k)
%其中x0为输入序列,k为预测长度
%x为预测输出序列,c为后检验检验数
%error1为残差,error2为相对误差
%format long; %精度达到软件最大值
n=length(x0);
x1=[];
x1(1)=x0(1);
for i=2:n
x1(i)=x1(i-1)+x0(i); %计算累加生成序列
end
for i=1:n-1 %求紧邻矩阵
B(i,1)=-0.5*(x1(i)+x1(i+1));
B(i,2)=1;
Y(i)=x0(i+1);
end
alpha=(B'*B)^(-1)*B'*Y'; %做最小二乘估计求出参数
a=alpha(1,1);
b=alpha(2,1);
d=b/a;
c=x1(1)-d;
x2(1)=x0(1);
for i=1:n-1
x2(i+1)=c*exp(-a*i)+d;
x(i+1)=x2(i+1)-x2(i);
end %计算时间响应参数函数
for i=(n+1):(n+k)
x2(i)=c*exp(-a*(i-1))+d;
x(i)=x2(i)-x2(i-1);
end %计算预测序列
for i=1:n
error(i)=x(i)-x0(i);
error1(i)=abs(error(i)); %计算残差 <20%
error2(i)=error1(i)/x0(i); %计算相对误差
end
c=std(error1)/std(x0); %计算后验差检验数
(2)matlab操作代码
a=[390.6,412,320,559.2,380.8,542.4,553,310,561,300,632,540,406.2,313.8,576,587.6,318.5]'; %录入数据
k=1;
t0=find(a<=320);
[x,a,b,c,error1,error2]=GM11(t0,k) %执行之前已经写好的灰色系统预测函数
x=fix(x) %因为是整数,根据实际情况我们进行高斯函数(取整)处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果展示:
x =
0 7.9896 10.2960 13.2681 17.0983 22.0340
a =
-0.2536
b =
6.2585
c =
0.2302 % c<0.35优秀
error1 =
3.0000 0.0104 0.2960 0.7319 0.0983
error2 =
1.0000 0.0013 0.0296 0.0523 0.0058
x =
0 7 10 13 17 22

绘制图像

1
2
3
4
5
6
7
8
n=length(t0)
plot((1:n),t0,'k','Markersize',10)
hold on
plot((1:n+1),x)
legend('原数据函数图像','预测函数图像')
xlabel('x')
ylabel('y')
title('原始数据与预测数据图像')

列表

1
2
3
4
5
6
fprintf('%s\n','-----------------灰色系统预测值与实际值比较---------------')
fprintf(' %s %s %s %s %s\n','n','预测值','实际值','残差','相对误差');
fmt=' %d %20.4f %15.4f %15.4f %13.4f\n';
for i=2:n
fprintf(fmt,i,x(i),t0(i),error1(i),error2(i));
end

列表

1
2
3
4
5
6
-----------------灰色系统预测值与实际值比较---------------
n 预测值 实际值 残差 相对误差
2 7.0000 8.0000 0.0104 0.0013
3 10.0000 10.0000 0.2960 0.0296
4 13.0000 14.0000 0.7319 0.0523
5 17.0000 17.0000 0.0983 0.0058

参考


每日一题【20200731】
https://blog.baixf.tk/2020/07/31/每日一题/每日一题【20200731】/
作者
白小飞
发布于
2020年7月31日
许可协议