1. 从“信息贫瘠”到“趋势洞察”:灰色模型的独特价值
在数学建模的世界里,我们常常面临一个尴尬的境地:手头的数据少得可怜,或者数据本身充满了不确定性,就像雾里看花。传统的统计模型,比如回归分析、时间序列预测,往往要求数据量大、样本分布规律,甚至需要数据服从特定的概率分布。但现实中,尤其是在经济预测、环境评估、设备故障诊断等领域,我们拿到的数据可能只有寥寥几个年份的观测值,或者数据本身带有强烈的“灰色”特征——信息不完全、内涵不明确。这时候,如果你硬套那些“高大上”的统计模型,结果要么是模型根本建不起来,要么就是预测结果离谱到连自己都不信。
灰色系统理论,以及它的核心武器——灰色模型,就是为解决这类“小样本、贫信息”的预测问题而生的。我第一次在国赛里用上GM(1,1)模型,是处理一个关于城市短期用电负荷预测的题目。主办方只给了过去五年的月度数据,而且数据有明显的波动和缺失。用ARIMA?样本量不够,阶数都定不准。用神经网络?数据量喂不饱,妥妥的过拟合。最后,正是灰色模型帮我们团队稳住了基本盘,拿到了不错的分数。它的核心思想非常巧妙:不是去纠结数据背后复杂的、难以捉摸的随机过程,而是通过对原始数据序列进行某种“生成处理”(比如累加),弱化其随机性,挖掘出数据中隐藏的确定性趋势,然后用一个简单的微分方程去拟合这个新序列的趋势,最后再通过“逆生成”还原得到预测值。
简单来说,它不试图解释“为什么”,而是专注于描述“会怎样”。对于数学建模竞赛,尤其是数据量有限、侧重短期趋势预测的题目(比如很多国赛C题、亚太杯的某些小题),灰色模型是一个性价比极高的工具。它原理相对直观,计算过程可以通过Excel或几行MATLAB/Python代码实现,论文里也容易讲清楚,非常适合在时间紧迫的比赛中快速构建一个可靠的预测基线模型。
2. GM(1,1)模型:从原理到实现的完整拆解
灰色模型家族中最经典、应用最广泛的就是GM(1,1)模型,其中G代表Grey(灰色),M代表Model(模型),第一个1表示一阶方程,第二个1表示单变量。它是整个灰色预测体系的基石。下面,我将结合一个具体的、简化过的例子,带你走一遍从原理到手算,再到代码实现的全过程。
2.1 核心思想与数据处理:累加生成(AGO)
假设我们有一个原始数据序列,反映某地区2019-2023年的年度用电量(单位:亿千瓦时):X⁽⁰⁾ = (x⁽⁰⁾(1), x⁽⁰⁾(2), x⁽⁰⁾(3), x⁽⁰⁾(4), x⁽⁰⁾(5)) = (120, 135, 150, 170, 195)
上标(0)代表原始序列。这个序列看起来有增长趋势,但不够平滑,直接建模困难。灰色模型的第一步,就是进行一次累加生成,得到一个新序列:x⁽¹⁾(k) = Σᵢ₌₁ᵏ x⁽⁰⁾(i), k=1,2,...,5
计算如下:
x⁽¹⁾(1) = 120x⁽¹⁾(2) = 120 + 135 = 255x⁽¹⁾(3) = 255 + 150 = 405x⁽¹⁾(4) = 405 + 170 = 575x⁽¹⁾(5) = 575 + 195 = 770
于是,我们得到一次累加生成序列:X⁽¹⁾ = (120, 255, 405, 575, 770)
为什么这么做?累加操作就像一个“滤波器”,能够将原始序列中可能存在的随机波动相互抵消一部分,使新序列X⁽¹⁾呈现出更强的指数增长规律,变得更为平滑。从图像上看,X⁽¹⁾的曲线会比X⁽⁰⁾平滑得多,更接近某种确定的函数形式(如指数函数),这就为后续用微分方程拟合创造了条件。
2.2 构建灰微分方程与白化方程
对于光滑性增强的X⁽¹⁾序列,灰色系统理论认为其变化规律可以用一个一阶线性微分方程来近似描述,这个方程被称为GM(1,1)模型的白化方程(也叫影子方程):dx⁽¹⁾(t)/dt + a * x⁽¹⁾(t) = u
这里,a称为发展系数,反映了x⁽¹⁾的增长趋势;u称为灰色作用量,可以理解为系统内的背景值或外部影响。a和u是我们需要通过数据来估计的未知参数。
但是,我们只有离散的数据点,没有连续的x⁽¹⁾(t)函数。因此,我们需要将连续的白化方程离散化,得到用于参数估计的灰微分方程。这里用到一个关键技巧:用均值生成序列来近似表示x⁽¹⁾(t)。
定义一次累加序列的紧邻均值生成序列Z⁽¹⁾:z⁽¹⁾(k) = 0.5 * [x⁽¹⁾(k) + x⁽¹⁾(k-1)], k=2,3,...,5
计算如下:
z⁽¹⁾(2) = 0.5*(120+255) = 187.5z⁽¹⁾(3) = 0.5*(255+405) = 330z⁽¹⁾(4) = 0.5*(405+575) = 490z⁽¹⁾(5) = 0.5*(575+770) = 672.5
于是,Z⁽¹⁾ = (187.5, 330, 490, 672.5)。
那么,灰微分方程可以写为:x⁽⁰⁾(k) + a * z⁽¹⁾(k) = u, k=2,3,4,5
注意,这里x⁽⁰⁾(k)就是原始序列在k时刻的值。这个方程的直观意义是:原始序列的变化量(x⁽⁰⁾(k)近似于导数dx⁽¹⁾/dt)与累加序列的背景值(z⁽¹⁾(k))之间存在线性关系。
2.3 参数估计与时间响应式
现在我们有4个方程(k=2,3,4,5),但只有两个未知数a和u,这是一个超定方程组。我们采用最小二乘法来求解。
将方程组写成矩阵形式Y = B * [a, u]ᵀ: 其中,Y = [x⁽⁰⁾(2), x⁽⁰⁾(3), x⁽⁰⁾(4), x⁽⁰⁾(5)]ᵀ = [135, 150, 170, 195]ᵀB = [[-z⁽¹⁾(2), 1], [-z⁽¹⁾(3), 1], [-z⁽¹⁾(4), 1], [-z⁽¹⁾(5), 1]] = [[-187.5, 1], [-330, 1], [-490, 1], [-672.5, 1]]
利用最小二乘法公式求解参数:[a, u]ᵀ = (Bᵀ * B)⁻¹ * Bᵀ * Y
我们一步步计算:
计算
Bᵀ * B:Bᵀ * B = [[187.5²+330²+490²+672.5², -(187.5+330+490+672.5)], [-(187.5+330+490+672.5), 4]] = [[1200625, -1680], [-1680, 4]](注:实际为近似值,187.5²+330²+490²+672.5² ≈ 1200625)
计算
(Bᵀ * B)⁻¹(2x2矩阵的逆): 行列式det = 1200625*4 - (-1680)*(-1680) = 4802500 - 2822400 = 1980100逆矩阵为:(Bᵀ * B)⁻¹ = (1/1980100) * [[4, 1680], [1680, 1200625]]计算
Bᵀ * Y:Bᵀ * Y = [[-187.5*135 -330*150 -490*170 -672.5*195], [135+150+170+195]] = [[-653062.5], [650]]最终求解:
[a, u]ᵀ = (1/1980100) * [[4, 1680], [1680, 1200625]] * [[-653062.5], [650]]计算后可得(为简化展示,此处直接给出近似结果):a ≈ -0.124u ≈ 110.5
注意:这里的计算过程展示了原理,在实际建模或编程中,我们绝不会手算这个逆矩阵。直接使用MATLAB的
pinv(B)*Y或Python NumPy的np.linalg.lstsq(B, Y, rcond=None)[0]即可一键求解,既快又准。
得到参数a和u后,我们就可以写出白化方程dx⁽¹⁾/dt - 0.124 * x⁽¹⁾ = 110.5的解,即时间响应式:x̂⁽¹⁾(k+1) = [x⁽⁰⁾(1) - u/a] * e^(-a*k) + u/a
代入我们的数值:x⁽⁰⁾(1)=120,u=110.5,a=-0.124。 首先计算-u/a = -110.5 / (-0.124) ≈ 891.13那么x⁽⁰⁾(1) - u/a = 120 - 891.13 = -771.13
因此,我们的一次累加序列预测模型为:x̂⁽¹⁾(k+1) = -771.13 * e^(0.124*k) + 891.13(因为-a=0.124)
2.4 预测值还原与模型检验
时间响应式给出的是累加序列X⁽¹⁾的预测值。我们需要通过累减生成(IAGO)还原得到原始序列X⁽⁰⁾的预测值:x̂⁽⁰⁾(k+1) = x̂⁽¹⁾(k+1) - x̂⁽¹⁾(k), 其中定义x̂⁽¹⁾(1) = x⁽⁰⁾(1) = 120。
我们来计算拟合值(k从1开始):
- 当k=1:
x̂⁽¹⁾(2) = -771.13*e^(0.124*1)+891.13 ≈ 255.8x̂⁽⁰⁾(2) = 255.8 - 120 = 135.8(原始值135) - 当k=2:
x̂⁽¹⁾(3) = -771.13*e^(0.124*2)+891.13 ≈ 406.7x̂⁽⁰⁾(3) = 406.7 - 255.8 = 150.9(原始值150) - 当k=3:
x̂⁽¹⁾(4) = -771.13*e^(0.124*3)+891.13 ≈ 573.2x̂⁽⁰⁾(4) = 573.2 - 406.7 = 166.5(原始值170) - 当k=4:
x̂⁽¹⁾(5) = -771.13*e^(0.124*4)+891.13 ≈ 756.2x̂⁽⁰⁾(5) = 756.2 - 573.2 = 183.0(原始值195)
得到拟合序列:(135.8, 150.9, 166.5, 183.0)。
模型检验至关重要,不能跳过!常用的检验方法有:
- 残差检验:计算绝对残差
ε(k)=|x⁽⁰⁾(k)-x̂⁽⁰⁾(k)|和相对残差δ(k)=ε(k)/x⁽⁰⁾(k)。- 对于k=2: δ=0.8/135≈0.59%
- k=3: δ=0.9/150≈0.60%
- k=4: δ=3.5/170≈2.06%
- k=5: δ=12/195≈6.15% 平均相对残差约为2.35%。通常,平均相对残差小于5%可以认为模型拟合精度较高,小于10%一般可以接受。本例前四点很好,第五点偏差较大,需要关注。
- 后验差检验:这是一个更综合的检验。
- 计算原始序列均值
X̄ = 154 - 计算原始序列标准差
S1 = sqrt(Σ(x⁽⁰⁾(k)-X̄)²/(n-1)) ≈ 26.38 - 计算残差序列均值
ε̄ = (0.8+0.9+3.5+12)/4 = 4.3 - 计算残差序列标准差
S2 = sqrt(Σ(ε(k)-ε̄)²/(n-1)) ≈ 4.97 - 计算后验差比值
C = S2 / S1 ≈ 4.97/26.38 ≈ 0.188 - 计算小误差概率
P = P(|ε(k)-ε̄| < 0.6745*S1)0.6745*S1 ≈ 17.79。所有|ε(k)-ε̄|的值都远小于17.79,因此P=1。
- 计算原始序列均值
根据后验差检验标准:
- 当
P>0.95且C<0.35,模型精度为“优”(一级)。 - 当
P>0.80且C<0.50,模型精度为“合格”(二级)。 - 当
P>0.70且C<0.65,模型精度为“勉强合格”(三级)。 - 否则为“不合格”(四级)。
本例中P=1>0.95,C=0.188<0.35,因此模型精度为一级(优)。尽管第五个点相对残差稍大,但综合检验结果很好,模型可用于预测。
- 预测未来值: 预测k=5(即2024年)的用电量:
x̂⁽¹⁾(6) = -771.13*e^(0.124*5)+891.13 ≈ 957.2x̂⁽⁰⁾(6) = 957.2 - 756.2 = 201.0(亿千瓦时)
3. 从理论到代码:MATLAB与Python实战
理解了手算原理,在实际应用和数学建模竞赛中,我们肯定是用代码快速实现。下面给出MATLAB和Python的核心代码模板,并附上关键注释和避坑点。
3.1 MATLAB实现模板
function [predict, a, u, C, P] = gm11(x0, predict_num) % GM(1,1)灰色预测模型 % 输入: % x0: 原始数据行向量,例如 [120, 135, 150, 170, 195] % predict_num: 需要预测的后续期数,例如预测未来2期则输入2 % 输出: % predict: 预测值(包括历史拟合值和未来预测值),与x0同维度开头 % a: 发展系数 % u: 灰色作用量 % C: 后验差比值 % P: 小误差概率 n = length(x0); % 1. 累加生成 x1 = cumsum(x0); % 2. 构造数据矩阵B和数据向量Y B = [-0.5*(x1(1:end-1)+x1(2:end))', ones(n-1,1)]; Y = x0(2:end)'; % 3. 最小二乘法估计参数 a, u params = pinv(B) * Y; % 使用伪逆更稳定 a = params(1); u = params(2); % 4. 计算时间响应式(累加序列预测值) x1_hat = zeros(1, n + predict_num); x1_hat(1) = x0(1); for k = 1:(n + predict_num - 1) x1_hat(k+1) = (x0(1) - u/a) * exp(-a * k) + u/a; end % 5. 累减还原,得到原始序列预测值 predict = zeros(1, n + predict_num); predict(1) = x0(1); for k = 1:(n + predict_num - 1) predict(k+1) = x1_hat(k+1) - x1_hat(k); end % 6. 模型检验(仅对历史数据部分) fit_values = predict(1:n); % 历史拟合值 residuals = x0 - fit_values; % 残差 relative_errors = abs(residuals) ./ x0; % 相对误差 % 后验差检验 S1 = std(x0); % 原始序列标准差 S2 = std(residuals); % 残差序列标准差 C = S2 / S1; % 后验差比值 mean_residual = mean(residuals); temp = abs(residuals - mean_residual); S0 = 0.6745 * S1; P = sum(temp < S0) / n; % 小误差概率 % 7. 输出信息 fprintf('发展系数 a = %.4f\n', a); fprintf('灰色作用量 u = %.4f\n', u); fprintf('后验差比值 C = %.4f\n', C); fprintf('小误差概率 P = %.4f\n', P); if P > 0.95 && C < 0.35 fprintf('模型精度等级:一级(优)\n'); elseif P > 0.80 && C < 0.5 fprintf('模型精度等级:二级(合格)\n'); elseif P > 0.70 && C < 0.65 fprintf('模型精度等级:三级(勉强合格)\n'); else fprintf('模型精度等级:四级(不合格)\n'); end fprintf('平均相对误差:%.2f%%\n', mean(relative_errors(2:end))*100); % 通常从第二期开始算 endMATLAB实操要点:
pinv(B)比inv(B'*B)*B'或B\Y在数值计算上更稳定,特别是当B病态时。- 累加生成用
cumsum函数非常方便。 - 输出结果中,
predict的前n个是历史拟合值,后predict_num个是未来预测值,方便绘图对比。 - 模型检验部分务必做,这是论文中模型可信度的关键支撑。
3.2 Python实现模板(使用NumPy)
import numpy as np import matplotlib.pyplot as plt def gm11(x0, predict_num): """ GM(1,1)灰色预测模型 Args: x0: 原始数据列表或一维数组,如 [120, 135, 150, 170, 195] predict_num: 需要预测的后续期数 Returns: predict: 预测值数组(包括历史拟合和未来预测) a: 发展系数 u: 灰色作用量 C: 后验差比值 P: 小误差概率 """ x0 = np.array(x0, dtype=np.float64) n = len(x0) # 1. 累加生成 x1 = np.cumsum(x0) # 2. 构造数据矩阵B和数据向量Y B = np.column_stack((-0.5 * (x1[:-1] + x1[1:]), np.ones(n-1))) Y = x0[1:].reshape(-1, 1) # 3. 最小二乘法估计参数 a, u # 使用np.linalg.lstsq求解最小二乘问题,更专业 params, _, _, _ = np.linalg.lstsq(B, Y, rcond=None) a = params[0, 0] u = params[1, 0] # 4. 时间响应式,计算累加序列预测值 x1_hat = np.zeros(n + predict_num) x1_hat[0] = x0[0] for k in range(1, n + predict_num): x1_hat[k] = (x0[0] - u/a) * np.exp(-a * k) + u/a # 5. 累减还原,得到原始序列预测值 predict = np.zeros(n + predict_num) predict[0] = x0[0] predict[1:] = np.diff(x1_hat) # 使用np.diff做累减,更简洁 # 6. 模型检验 fit_values = predict[:n] residuals = x0 - fit_values relative_errors = np.abs(residuals) / x0 # 后验差检验 S1 = np.std(x0, ddof=1) # 样本标准差 S2 = np.std(residuals, ddof=1) C = S2 / S1 mean_residual = np.mean(residuals) temp = np.abs(residuals - mean_residual) S0 = 0.6745 * S1 P = np.sum(temp < S0) / n # 输出信息 print(f"发展系数 a = {a:.4f}") print(f"灰色作用量 u = {u:.4f}") print(f"后验差比值 C = {C:.4f}") print(f"小误差概率 P = {P:.4f}") if P > 0.95 and C < 0.35: print("模型精度等级:一级(优)") elif P > 0.80 and C < 0.5: print("模型精度等级:二级(合格)") elif P > 0.70 and C < 0.65: print("模型精度等级:三级(勉强合格)") else: print("模型精度等级:四级(不合格)") print(f"平均相对误差:{np.mean(relative_errors[1:]) * 100:.2f}%") return predict, a, u, C, P # 示例使用 if __name__ == '__main__': data = [120, 135, 150, 170, 195] predict_num = 2 # 预测未来两期 predict_vals, a, u, C, P = gm11(data, predict_num) # 绘图 plt.figure(figsize=(10, 6)) original_index = np.arange(len(data)) predict_index = np.arange(len(data) + predict_num) plt.plot(original_index, data, 'bo-', label='原始数据', markersize=8) plt.plot(predict_index, predict_vals, 'rs--', label='拟合及预测值', markersize=6) plt.axvline(x=len(data)-0.5, color='gray', linestyle=':', linewidth=1) # 分隔历史与预测 plt.text(len(data)-1, max(data)*0.9, '历史拟合', ha='right') plt.text(len(data), max(data)*0.9, '未来预测', ha='left') plt.xlabel('时间序列') plt.ylabel('指标值') plt.title('GM(1,1)模型拟合与预测结果') plt.legend() plt.grid(True, linestyle='--', alpha=0.5) plt.show()Python实操要点:
- 使用
np.linalg.lstsq求解最小二乘参数,这是标准做法,比手动求逆更稳定。 np.diff函数可以方便地实现累减生成。- 务必注意
np.std中ddof=1的参数,这表示计算样本标准差(除以n-1),与MATLAB的std默认行为一致。如果使用ddof=0(总体标准差),计算出的C值会略有不同,可能导致精度等级误判。 - 绘图时用竖线区分历史拟合和未来预测,能让图表在论文中更专业。
4. 竞赛实战:如何用好、用对灰色模型?
在数学建模竞赛中,灰色模型很少作为唯一的解决方案,更多是作为基准模型、趋势分析工具或与其他模型结合的一部分。用对了是加分项,用错了或滥用则显得不专业。
4.1 适用场景与典型赛题分析
灰色模型最适合以下特征的问题:
- 数据量少:通常要求原始数据序列不少于4期,但也不宜过多(一般不超过20期)。数据太多,其“贫信息”特性减弱,其他模型可能更优。
- 趋势性明显:数据最好呈现指数增长或衰减趋势。对于剧烈震荡、有周期性或非常平稳的数据,灰色模型效果不佳。
- 短期预测:由于其本质是拟合指数曲线,外推预测的期数不宜过长,通常预测未来1-3期较为可靠。
结合近年赛题看:
- 2024年高教社杯国赛C题“货运量预测”:题目可能给出过去几年(比如5-8年)的月度或季度货运量数据。如果数据整体呈增长趋势且波动不大,GM(1,1)可以用来做一个简单的趋势基线预测。但更合理的做法是,用灰色模型预测趋势项,再结合其他方法(如季节性分解、ARIMA)处理周期项和随机项。
- 2023年国赛A题、2022年国赛C题等涉及“评价”或“预测”的题目:灰色模型可以衍生出灰色关联分析。这是灰色系统理论另一大利器,用于分析不同因素对目标的影响程度。例如,分析影响粮食产量的多个因素(降雨量、化肥用量、播种面积等)中,哪个与产量关联最密切。这在多指标评价、系统分析类题目中非常有用。
- 亚太杯、美赛等国际赛题中涉及新兴领域预测:比如预测某种新型技术的市场渗透率、某种社交媒体的用户增长等。这些领域历史数据短,正符合灰色模型的用武之地。
4.2 模型优化与改进策略
原始GM(1,1)模型有时精度不够,论文中如果直接套用基础模型会显得单薄。掌握一两种优化方法能显著提升论文深度。
背景值优化: 原始模型用紧邻均值
z⁽¹⁾(k)=0.5*(x⁽¹⁾(k)+x⁽¹⁾(k-1))生成背景值。这实际上是假设累加序列在区间内是线性变化的。但理论上它更接近指数变化。因此,可以引入一个优化系数p,将背景值改为:z⁽¹⁾(k) = p * x⁽¹⁾(k) + (1-p) * x⁽¹⁾(k-1)通过智能优化算法(如粒子群PSO、遗传算法GA)寻找使平均相对误差最小的p值。我在一次比赛中优化后,将p从0.5调整到0.62,模型平均相对误差从3.1%降到了1.8%。初始条件优化: 传统时间响应式使用
x⁽⁰⁾(1)作为初始条件。可以考虑使用x⁽¹⁾序列的最后一个值x⁽¹⁾(n),或中间某个值作为初始条件,构建新的时间响应式,有时能提高尾部拟合精度。残差修正GM(1,1)模型: 如果原始模型拟合后,残差序列
ε本身还具有明显趋势(不是随机波动),说明模型未完全提取信息。可以对残差序列ε再建立一个GM(1,1)模型,用其预测值去修正原始模型的预测值。这相当于进行了二次拟合。最终预测值 = 原始GM(1,1)预测值 ± 残差GM(1,1)预测值注意残差序列可能有正有负,建模前需先取绝对值,预测后再根据原残差符号赋予正负。与其他模型结合(最推荐的做法):
- 灰色-马尔可夫模型:用GM(1,1)预测趋势,用马尔可夫链修正预测值的波动状态。适用于数据有增长趋势但伴有随机波动的情况。
- 灰色-神经网络组合模型:用GM(1,1)捕捉数据的确定性趋势,用BP神经网络学习残差中的非线性波动。这种“白+黑”的组合思路在论文中很有说服力。
- 灰色-Verhulst模型:当数据序列呈“S”型增长(即增长有上限,如人口预测、产品生命周期预测)时,应使用GM(1,1)的衍生模型——Verhulst模型,其白化方程是非线性的,能更好地拟合饱和趋势。
4.3 论文写作要点与避坑指南
在论文中书写灰色模型部分,切忌只贴代码和公式。要体现建模思维。
必须写清楚的内容:
- 模型适用性分析:在选用灰色模型前,先用一两句话说明“由于本题数据样本量有限(仅N期),且初步观察呈单调增长/衰减趋势,符合灰色系统‘小样本、贫信息’的特点,故考虑采用灰色预测模型”。这是画龙点睛之笔,表明你不是随便选的模型。
- 完整的建模步骤:按照“数据检验与处理 -> 构建GM(1,1)模型 -> 参数求解 -> 模型检验 -> 预测”的逻辑链来写。数据检验可以包括“级比检验”,即计算序列的级比
σ(k)=x⁽⁰⁾(k-1)/x⁽⁰⁾(k),所有级比落在区间(e^(-2/(n+1)), e^(2/(n+1)))内时,数据适合用GM(1,1)。如果不在,需要对数据做平移变换(所有数据加一个常数C)。 - 结果可视化:一定要有“原始数据-模型拟合值-未来预测值”的对比折线图,并用竖虚线区分历史与未来,图表务必清晰美观。
- 模型评价:必须汇报后验差检验结果(C和P值)和精度等级,以及平均相对误差。这是衡量模型好坏的定量依据。
常见坑点与应对:
- 坑点一:数据出现零或负数。原始GM(1,1)要求数据为非负序列。如果数据有负数,可以采用“数据平移”法,将所有数据加上一个常数,使全序列为正,建模预测后再减去该常数。
- 坑点二:预测结果出现负数或急剧发散。这通常是因为发展系数
a的符号或大小不合理。a为负时,模型预测增长;a为正时,预测衰减。如果a的绝对值很大(如>1),预测曲线会很快发散,模型失效。此时应检查数据是否真的适合GM(1,1),或考虑使用Verhulst等模型。 - 坑点三:过度外推。反复强调,灰色模型只适合短期预测。在论文中预测未来1-3期是合理的,如果预测5期以上,必须给出强烈的可靠性警示,或者只将长期预测结果作为一种趋势性参考。
- 坑点四:把灰色模型当作“黑箱”。很多队伍直接调用工具箱函数,然后贴出结果,对中间过程一无所知。评委提问时一问三不知。务必理解每一步的数学含义,至少能手工算一个简单例子。
我个人在带队和评审中的体会是,一个能把灰色模型原理讲清楚、适用性分析到位、并且知道其局限性的队伍,在基础模型运用上就已经超过了大部分对手。如果再能结合一种优化方法或组合模型,并给出令人信服的结果对比,这部分的分数就会非常扎实。记住,在数学建模竞赛中,对模型深刻的理解和恰当的运用,远比堆砌复杂的模型更重要。灰色模型正是展示这种能力的绝佳工具。