非原创,转载出处 https://blog.csdn.net/WuchangI/article/details/79214882
一、 灰 {MOD}模型GM(1,1)
1. 问题
请以下表的数据为依据,预测2005-2014年长江的污水排放量(单位:亿吨)。
1995-2004年的长江污水排放量
年份 |
1995 |
1996 |
1997 |
1998 |
1999 |
2000 |
2001 |
2002 |
2003 |
2004 |
污水量/亿吨
174
179
183
189
207
234
220.5
256
270
285
2. 分析
此问题为一个复杂的非线性系统,样本数据量少,但需要预测的时间较长,且污水排放量的变化规律是一个不确定的系统。如果使用神经网络算法很难取得理想的效果,故考虑采用GM预测来预测未来的污水排放量。
3. MATLAB实现源代码
GM(1,1).m
syms a b;
c = [a b]';
A = [174, 179, 183, 189, 207, 234, 220.5, 256, 270, 285];
n = length(A);
B = cumsum(A);
for i = 2:n
C(i) = (B(i) + B(i - 1))/2;
end
C(1) = [];
B = [-C;ones(1,n-1)];
Y = A; Y(1) = []; Y = Y';
c = inv(B*B')*B*Y;
c = c';
a = c(1); b = c(2);
F = []; F(1) = A(1);
for i = 2:(n+10)
F(i) = (A(1)-b/a)/exp(a*(i-1))+ b/a;
end
G = []; G(1) = A(1);
for i = 2:(n+10)
G(i) = F(i) - F(i-1);
end
disp('预测数据为:');
G
H = G(1:10);
epsilon = A - H;
delta = abs(epsilon./A);
disp('相对残差Q检验:')
Q = mean(delta)
disp('方差比C检验:')
C = std(epsilon, 1)/std(A, 1)
S1 = std(A, 1);
tmp = find(abs(epsilon - mean(epsilon))< 0.6745 * S1);
disp('小误差概率P检验:')
P = length(tmp)/n
t1 = 1995:2004;
t2 = 1995:2014;
plot(t1, A,'ro'); hold on;
plot(t2, G, 'g-');
xlabel('年份'); ylabel('污水量/亿吨');
legend('实际污水排放量','预测污水排放量');
title('长江污水排放量增长曲线');
grid on;
- 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
- 73
- 74
运行结果:
预测数据为:
G =
1 至 14 列
174.0000 172.8090 183.9355 195.7785 208.3839 221.8010 236.0820 251.2825 267.4616 284.6825 303.0122 322.5221 343.2881 365.3912
15 至 20 列
388.9175 413.9585 440.6118 468.9812 499.1772 531.3174
相对残差Q检验:
Q =
0.0234
方差比C检验:
C =
0.1870
小误差概率P检验:
P =
1
4. MATLAB绘制的曲线图
二、 灰 {MOD}Verhulst模型(即Logistic模型)
1. 问题
将一定量的大肠杆菌菌种接种在液体培养基中,在一定条件下进行培养,观察其生长繁殖规律。细菌悬液的浓度与混浊度成正比,故可用分光亮度计测定细菌悬液的光密度来推知菌液的浓度。每隔5h记录OD600的值,得到下表。请你预测大肠杆菌的数量。
时间点均匀采样/5h |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
细菌培养液吸光度/OD600
0.025
0.023
0.029
0.044
0.084
0.164
0.332
0.521
0.97
1.6
2.45
3.11
3.57
3.76
3.96
4
4.46
4.4
4.49
4.76
5.01
2. 分析
此问题涉及生物的生长和繁殖规律,其曲线一般呈S型或变异S型,故考虑使用GM Verhulst模型来预测。
3. MATLAB实现源代码
(以下程序预测到时间点41)
GM_Verhulst.m
syms a b;
c = [a b]';
A = [0.025, 0.023, 0.029, 0.044, 0.084, 0.164, 0.332, 0.521, 0.97, 1.6, 2.45, 3.11, 3.57, 3.76, 3.96, 4, 4.46, 4.4, 4.49, 4.76, 5.01];
n = length(A);
for i = 2:n
H(i) = A(i) - A(i - 1);
end
H(1) = [];
for i = 2:n
C(i) = (A(i) + A(i-1))/2;
end
C(1) = [];
D = [-C; C.^2];
Y = H; Y = Y';
c = inv(D*D')*D*Y;
c = c';
a = c(1); b = c(2);
F = []; F(1) = A(1);
for i = 2:(n+n)
F(i) = (a*A(1))/(b*A(1)+(a - b*A(1))*exp(a*(i-1)));
end
disp('预测数据为:');
F
t1 = 0:n-1;
t2 = 0:2*n-1;
plot(t1, A, 'ro'); hold on;
plot(t2, F);
xlabel('时间点均匀采样/5h'); ylabel('细菌培养液吸光度/OD600');
legend('实际数量','预测数量');
title('大肠杆菌培养S形增长曲线');
grid on;
- 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
运行结果:
预测数据为:
F =
1 至 14 列
0.0250 0.0416 0.0691 0.1143 0.1880 0.3059 0.4900 0.7658 1.1551 1.6603 2.2492 2.8555 3.4051 3.8485
15 至 28 列
4.1738 4.3963 4.5412 4.6326 4.6891 4.7236 4.7445 4.7571 4.7647 4.7692 4.7720 4.7736 4.7746 4.7752
29 至 42 列
4.7755 4.7757 4.7759 4.7759 4.7760 4.7760 4.7760 4.7760 4.7760 4.7760 4.7760 4.7760 4.7760 4.7760
4. MATLAB绘制的曲线图