1. 项目概述:从GM(1,1)到实战应用的灰色预测进阶
如果你已经跟着上一篇文章,把GM(1,1)模型的基本流程跑通了一遍,恭喜你,你已经拿到了灰色预测的“入场券”。但就像刚学会开车,知道油门、刹车和方向盘在哪,不等于就能应对复杂的城市路况。在数学建模的赛场上,尤其是面对国赛、美赛这类高强度竞赛,评委和现实数据可不会给你一个完美的、光滑的、完全符合理论假设的序列。直接套用基础GM(1,1)公式,大概率会得到一个“看起来很美”但“用起来很糟”的结果——预测偏差巨大,模型解释力弱。
“备战数学建模33-灰色预测模型2”这个标题,核心指向的就是这个“从理论到实战”的跨越。它不再是教你“1+1=2”的基础语法,而是教你如何在实际的、充满噪声的数据环境中,让灰色预测模型真正“活”起来,成为一个可靠的分析工具。这涉及到一整套的“组合拳”:如何检验你的数据是否适合用灰色模型?模型精度不达标时,有哪些“外科手术”式的改进方法?以及,如何将灰色模型与其他方法(如马尔可夫链)结合,形成更强大的预测武器?这些才是决定你论文能否脱颖而出的关键。本文将围绕这些核心问题,结合MATLAB实操,带你深入灰色预测的进阶世界,让你在比赛中能自信地处理非平稳、小样本的预测难题。
2. 模型适用性检验与数据预处理
在拿起灰色预测这把“手术刀”之前,我们必须先确认“病人”(数据)是否适合做这个“手术”。盲目套用模型是数学建模的大忌。灰色预测模型,特别是GM(1,1),有其鲜明的适用边界:它擅长处理趋势性明显、指数增长或衰减的小样本数据。对于波动剧烈、周期性明显或完全随机的时间序列,它的效果会很差。
2.1 级比检验:数据入门的“门槛”
级比检验是判断数据序列能否建立GM(1,1)模型的第一道,也是最重要的门槛。它的原理基于GM(1,1)模型解的形式是指数函数,这就要求原始数据经过一次累加生成(1-AGO)后,具有近似指数规律。而级比σ(k)正是这种规律性的“探针”。
对于原始非负序列X⁽⁰⁾ = (x⁽⁰⁾(1), x⁽⁰⁾(2), ..., x⁽⁰⁾(n)),其级比定义为:σ(k) = x⁽⁰⁾(k-1) / x⁽⁰⁾(k), k = 2, 3, ..., n
检验准则:计算所有级比值,如果它们全部落在可容覆盖区间Θ = (e^(-2/(n+1)), e^(2/(n+1)))内,则认为该序列适合建立GM(1,1)模型。这个区间随着数据量n的增大而向1收缩,意味着数据量越大,对序列的平滑性要求越高。
MATLAB实操与解读:
function [isSuitable, sigma] = gradeRatioTest(X0) % X0: 原始数据序列,行向量或列向量 n = length(X0); sigma = X0(1:end-1) ./ X0(2:end); % 计算级比 bounds = exp([-2/(n+1), 2/(n+1)]); % 计算可容覆盖区间边界 lowerBound = bounds(1); upperBound = bounds(2); isSuitable = all(sigma > lowerBound & sigma < upperBound); fprintf('原始序列: '); disp(X0); fprintf('级比值σ(k): '); disp(sigma); fprintf('可容覆盖区间Θ: (%.4f, %.4f)\n', lowerBound, upperBound); if isSuitable fprintf('结论: 所有级比落在Θ内,序列适合建立GM(1,1)模型。\n'); else fprintf('结论: 部分级比未落在Θ内,序列不适合直接建立GM(1,1)模型。\n'); fprintf(' 需要考虑数据变换或使用其他模型(如GM(1,N)、DGM)。\n'); end end> 注意:在实际比赛中,经常会遇到级比检验不通过的情况。这不意味着灰色预测完全不可用。它只是一个预警,告诉你“直接套用基础模型有风险”。这时,数据预处理就变得至关重要。
2.2 数据预处理技巧:让“不合格”数据焕发新生
当级比检验失败时,我们不应立即放弃灰色预测,而应尝试对原始数据进行“整形”。以下是几种经过实战检验的有效方法:
1. 平移变换:这是最常用、最直观的方法。如果原始数据中存在零值或负值(GM(1,1)要求非负),或者数值整体太小导致级比波动大,可以给所有数据加上一个常数C。Y⁽⁰⁾(k) = X⁽⁰⁾(k) + C常数C的选择有技巧:通常取|min(X⁽⁰⁾)| + 1以确保全为正数,或者通过试凑,使变换后的序列级比落入容差区间。在MATLAB中,可以写一个简单的循环来搜索合适的C。
2. 对数变换:如果原始数据呈现指数增长趋势,但其增长速率不稳定,对数变换可以将其压缩为近似线性趋势,更容易被GM(1,1)捕捉。Y⁽⁰⁾(k) = ln(X⁽⁰⁾(k))要求X⁽⁰⁾(k) > 0。 变换后对Y⁽⁰⁾建立GM模型,得到预测值后,别忘了通过exp()函数反变换回原始尺度。
3. 方根变换:当数据波动较大时,开方运算(如平方根、四次方根)可以平滑数据,削弱极端值的影响。Y⁽⁰⁾(k) = (X⁽⁰⁾(k))^(1/p), p=2,4,...同样,预测后需要做Y^p的逆运算。
> 实操心得:数据预处理后必须重新进行级比检验。很多时候,一个简单的平移就能让序列“起死回生”。我个人的经验是,优先尝试平移变换,因为它不改变数据的相对增长结构,物理意义明确。对数变换和方根变换会改变数据的分布特性,在论文中需要额外说明其合理性。
2.3 异常值与缺失值处理
小样本数据中,一个异常值就足以“带偏”整个模型。常见的处理方法是:
- 识别:使用3σ准则或箱线图(虽然小样本下箱线图可能不敏感)。
- 处理:对于明显偏离的异常点,可以用前后数据的均值、中位数或插值(如线性插值)替代。切忌直接删除,因为灰色模型对数据顺序和完整性非常敏感。
对于缺失值,如果位置在序列中间,必须使用插值法补全(如拉格朗日插值、样条插值)。MATLAB的interp1函数可以方便地完成这个任务。
3. 核心模型改进与优化策略
即使数据通过了检验,基础GM(1,1)模型也可能因为其固有的“齐次指数”假设而精度不足。这时,就需要动用我们的“模型工具箱”进行改进。
3.1 背景值优化:GM(1,1)的“阿喀琉斯之踵”
在GM(1,1)的白化方程dx⁽¹⁾/dt + ax⁽¹⁾ = b中,参数a和b是通过最小二乘法估计的,其推导过程中用到了一个关键近似:背景值z⁽¹⁾(k) = 0.5 * (x⁽¹⁾(k) + x⁽¹⁾(k-1))。这个取前后两点平均值的做法,是假设在区间[k-1, k]内,一次累加生成序列X⁽¹⁾是线性变化的。但X⁽¹⁾本身是指数趋势,这种线性近似在数据变化剧烈时会产生较大误差。
优化思路:将固定的0.5权重改为一个可变的权重系数ω,即:z⁽¹⁾(k) = ω * x⁽¹⁾(k) + (1-ω) * x⁽¹⁾(k-1), k=2,3,...,n通过智能优化算法(如粒子群PSO、遗传算法GA)寻找最优的ω,使得模型拟合误差(如平均相对误差)最小。
MATLAB实现示例(结合fmincon):
function [a_opt, b_opt, omega_opt, error] = optimizeBackgroundValue(X0) % 定义目标函数:最小化平均相对误差 n = length(X0); X1 = cumsum(X0); % 1-AGO fun = @(omega) calcError(omega, X0, X1); % 约束:omega在(0,1)之间 lb = 0.01; ub = 0.99; omega0 = 0.5; % 初始值 options = optimoptions('fmincon', 'Display', 'off'); [omega_opt, fval] = fmincon(fun, omega0, [], [], [], [], lb, ub, [], options); % 使用最优omega重新计算参数a,b [a_opt, b_opt] = estimateParams(omega_opt, X1); % 计算拟合值与误差 X0_sim = simulateGM(a_opt, b_opt, X0(1), n); error = mean(abs((X0 - X0_sim) ./ X0)) * 100; % 平均相对误差百分比 fprintf('优化背景值权重ω: %.4f\n', omega_opt); fprintf('优化后参数: a=%.6f, b=%.6f\n', a_opt, b_opt); fprintf('优化后平均相对误差: %.2f%%\n', error); end function err = calcError(omega, X0, X1) n = length(X0); [a, b] = estimateParams(omega, X1); X0_sim = simulateGM(a, b, X0(1), n); % 使用均方根误差(RMSE)作为优化目标更稳定 err = sqrt(mean((X0 - X0_sim).^2)); end function [a, b] = estimateParams(omega, X1) n = length(X1); Z1 = zeros(1, n-1); for k = 2:n Z1(k-1) = omega * X1(k) + (1-omega) * X1(k-1); end Y = X1(2:n) - X1(1:n-1); % 实际上是X0(2:n) B = [-Z1(:), ones(n-1,1)]; params = B \ Y(:); a = params(1); b = params(2); end> 注意事项:背景值优化虽然能提升精度,但也增加了模型复杂度和过拟合风险。在论文中,如果使用了优化方法,必须与原始固定权重(ω=0.5)的结果进行对比,展示精度提升的显著性,否则改进就失去了意义。
3.2 残差修正模型:针对性的“精准修补”
如果模型整体趋势拟合得不错,但个别点偏差较大,残差修正模型是一把“手术刀”。其核心思想是:对原始序列建立GM(1,1)模型后,计算残差序列ε⁽⁰⁾(k) = x⁽⁰⁾(k) - x̂⁽⁰⁾(k)。如果残差序列的级比检验通过(或可通过预处理通过),则对残差序列再建立一个GM(1,1)模型,用这个残差模型的预测值去修正原始模型的预测值。
修正步骤:
- 建立原始序列
X⁽⁰⁾的GM(1,1)模型,得到拟合值x̂⁽⁰⁾和残差ε⁽⁰⁾。 - 选取部分显著非零的残差(例如绝对值较大的前m个),构成残差序列
E⁽⁰⁾ = (ε⁽⁰⁾(k₁), ε⁽⁰⁾(k₂), ..., ε⁽⁰⁾(kₘ))。 - 对
E⁽⁰⁾建立GM(1,1)模型,得到其预测值ε̂⁽⁰⁾。 - 最终修正预测值为:
x̂⁽⁰⁾_corrected(k) = x̂⁽⁰⁾(k) ± ε̂⁽⁰⁾(k)(符号与原残差相同)。
> 实操心得:残差修正并非万能。它适用于残差序列本身有规律的情况。如果残差是纯随机白噪声,强行对其建模反而会引入额外误差。因此,在应用前,建议画图观察残差是否具有趋势性,或计算其自相关系数进行判断。
3.3 新陈代谢模型:动态更新的“滚动预测”
基础GM(1,1)是静态建模,用全部历史数据建一个模型,预测未来所有点。而新陈代谢模型的核心是“用最新信息,淘汰最旧信息”,保持建模序列长度不变(通常为4-7个数据点),像滑窗一样向前滚动。
建模过程:
- 设原始序列为
X⁽⁰⁾ = (x⁽⁰⁾(1), x⁽⁰⁾(2), ..., x⁽⁰⁾(n))。 - 取前
L个数据(L为建模维数,如L=4)建立第一个GM(1,1)模型:M₁: (x⁽⁰⁾(1), x⁽⁰⁾(2), x⁽⁰⁾(3), x⁽⁰⁾(4)),预测第5个值x̂⁽⁰⁾(5)。 - 加入真实值
x⁽⁰⁾(5),剔除最老的x⁽⁰⁾(1),形成新序列(x⁽⁰⁾(2), x⁽⁰⁾(3), x⁽⁰⁾(4), x⁽⁰⁾(5)),建立模型M₂,预测x̂⁽⁰⁾(6)。 - 如此循环,直至预测完所有点或进行外推预测。
MATLAB实现关键循环:
function X0_pred = metabolicGM(X0, L) % X0: 原始全序列, L: 建模维数(窗口长度) n = length(X0); X0_pred = zeros(1, n); X0_pred(1:L) = X0(1:L); % 前L个点为已知,不预测 for k = L+1:n % 取当前窗口数据 windowData = X0(k-L : k-1); % 对windowData建立GM(1,1)模型,并预测下一个点 [a, b] = estimateGM11Params(windowData); pred_next = predictGM11(a, b, windowData(1), L+1); % 预测第L+1个点,即原序列的第k个点 X0_pred(k) = pred_next(end); % 记录预测值 % 注意:这里没有用预测值更新窗口,窗口始终用真实值滑动 end % 如果需要外推未来m步 m = 3; % 外推3步 future_pred = zeros(1, m); currentWindow = X0(end-L+1:end); % 用最后L个真实值作为初始窗口 for step = 1:m [a, b] = estimateGM11Params(currentWindow); pred_next = predictGM11(a, b, currentWindow(1), L+1); future_pred(step) = pred_next(end); % 更新窗口:加入预测值,剔除最旧值(用于连续外推) currentWindow = [currentWindow(2:end), future_pred(step)]; end fprintf('未来%d步预测值: ', m); disp(future_pred); end> 注意事项:新陈代谢模型能更好地反映系统的最新变化,尤其适用于趋势可能发生转折的场景。但其缺点是计算量较大(需要建立多个模型),且对窗口长度L敏感。L太小则模型不稳定,L太大则失去了“新陈代谢”的意义。通常需要通过试算,选择一个使预测误差最小的L。
4. 模型精度检验与评估体系
建立一个模型后,我们不能“王婆卖瓜,自卖自夸”,必须有一套客观、严格的检验标准。在数学建模论文中,模型检验部分是评委重点审视的内容。
4.1 残差检验:逐点精度评估
这是最直观的检验。计算每个点的绝对残差Δ(k) = |x⁽⁰⁾(k) - x̂⁽⁰⁾(k)|和相对残差ε(k) = Δ(k) / x⁽⁰⁾(k) * 100%。
评价标准:
- 平均相对误差:
ε(avg) = mean(ε(k))。通常,ε(avg) < 5%可认为模型精度较高,< 10%为合格,> 20%则模型精度较差。 - 最大相对误差:
ε(max) = max(ε(k))。这个指标能反映模型是否存在某个点的预测严重失准。
在MATLAB中,可以轻松计算并可视化:
function performResidualTest(X0, X0_pred) abs_residual = abs(X0 - X0_pred); rel_error = abs_residual ./ X0 * 100; avg_rel_error = mean(rel_error); max_rel_error = max(rel_error); fprintf('平均相对误差: %.2f%%\n', avg_rel_error); fprintf('最大相对误差: %.2f%%\n', max_rel_error); % 绘制对比图与残差图 figure; subplot(2,1,1); plot(1:length(X0), X0, 'bo-', 'DisplayName', '原始值'); hold on; plot(1:length(X0_pred), X0_pred, 'r*-', 'DisplayName', '预测值'); legend; title('原始序列与预测序列对比'); xlabel('序号'); ylabel('值'); grid on; subplot(2,1,2); bar(1:length(rel_error), rel_error); title('相对误差百分比'); xlabel('序号'); ylabel('相对误差(%)'); yline(5, '--r', '5%线'); yline(10, '--g', '10%线'); grid on; end4.2 后验差检验:整体分布评估
后验差检验比残差检验更综合,它同时考虑了原始数据的波动和残差的波动。
- 计算原始序列
X⁽⁰⁾的均值X̄和标准差S1。S1 = sqrt( sum( (x⁽⁰⁾(k) - X̄)^2 ) / n ) - 计算残差序列
ε的均值ε̄和标准差S2。S2 = sqrt( sum( (ε(k) - ε̄)^2 ) / n ) - 计算后验差比值
C:C = S2 / S1 - 计算小误差概率
P:P = P{ |ε(k) - ε̄| < 0.6745 * S1 }
精度等级对照表:
| 精度等级 | 后验差比值 C | 小误差概率 P |
|---|---|---|
| 优秀 (1级) | C ≤ 0.35 | P ≥ 0.95 |
| 合格 (2级) | 0.35 < C ≤ 0.50 | 0.80 ≤ P < 0.95 |
| 勉强 (3级) | 0.50 < C ≤ 0.65 | 0.70 ≤ P < 0.80 |
| 不合格 (4级) | C > 0.65 | P < 0.70 |
> 实操心得:在论文中,必须同时汇报残差检验和后验差检验的结果。后验差检验的“优秀”或“合格”结论,是模型有效性的重要佐证。如果检验结果不理想,应回到前面章节,分析是数据问题还是模型选择问题,并给出改进尝试的说明,这体现了建模过程的严谨性。
4.3 滚动检验与预测效果图
对于新陈代谢模型或需要评估模型滚动预测能力的场景,可以计算滚动预测的均方根误差(RMSE)和平均绝对百分比误差(MAPE)。同时,一张包含历史拟合值和未来预测值(用不同线型或颜色区分)的效果图,比大段文字更有说服力。
% 绘制最终预测效果图示例 figure; t_history = 1:length(X0); t_future = length(X0)+1 : length(X0)+m; plot(t_history, X0, 'ks-', 'LineWidth', 1.5, 'MarkerSize', 8, 'DisplayName', '历史真实值'); hold on; plot(t_history, X0_fitted, 'b^-', 'LineWidth', 1.2, 'MarkerSize', 6, 'DisplayName', '模型拟合值'); plot(t_future, X0_forecast, 'ro--', 'LineWidth', 1.5, 'MarkerSize', 10, 'DisplayName', '未来预测值'); legend('Location', 'best'); xlabel('时间/序号'); ylabel('指标值'); title('GM(1,1)模型拟合与预测效果'); grid on; % 可以添加置信区间(如果需要)5. 灰色组合模型实战:GM(1,1)-马尔可夫链
当单一灰色模型的预测误差波动呈现出某种状态性(如“高估”、“低估”交替)时,可以引入马尔可夫链(Markov Chain)对残差进行状态划分和预测,从而修正灰色预测结果。这是数学建模比赛中一个非常经典的“组合拳”,能显著提升预测精度。
5.1 为什么需要结合马尔可夫链?
GM(1,1)给出的是确定性的预测趋势线,但实际系统的波动往往受到随机因素影响。马尔可夫链擅长描述状态之间的随机转移过程。将两者结合,就是用GM(1,1)捕捉趋势,用马尔可夫链修正随机波动。
5.2 建模步骤详解
步骤1:建立基础GM(1,1)模型并计算相对残差首先,对原始序列X⁽⁰⁾建立标准GM(1,1)模型,得到拟合序列X̂⁽⁰⁾。计算相对残差序列:q(k) = (x⁽⁰⁾(k) - x̂⁽⁰⁾(k)) / x⁽⁰⁾(k), k=1,2,...,n通常q(1)=0,从k=2开始分析。
步骤2:划分残差状态根据相对残差q(k)的分布范围,将其划分为s个状态。例如:
- 状态1:
q(k) ∈ [-20%, -10%)(严重低估) - 状态2:
q(k) ∈ [-10%, 0%)(轻微低估) - 状态3:
q(k) ∈ [0%, 10%](轻微高估) - 状态4:
q(k) ∈ (10%, 20%](严重高估) 状态区间划分需要根据实际残差分布情况调整,确保每个状态都有一定的样本数。
步骤3:计算状态转移概率矩阵统计残差状态序列中,从状态i转移到状态j的频数Mᵢⱼ。则从状态i转移到状态j的概率为:Pᵢⱼ = Mᵢⱼ / Σⱼ Mᵢⱼ所有Pᵢⱼ构成状态转移概率矩阵P,它是一个s×s的矩阵,且每行之和为1。
步骤4:预测未来状态并修正假设我们要预测第n+1期的值。首先,查看第n期残差所处的状态E(n)。根据状态转移矩阵P中第E(n)行,选择概率最大的那个状态作为第n+1期的预测状态E(n+1)。 然后,取该预测状态E(n+1)的代表值(通常取该状态区间的中值,如状态2[-10%,0%)的中值为-5%),记为q̂(n+1)。 最后,GM(1,1)对第n+1期的预测值为x̂⁽⁰⁾(n+1),则修正后的预测值为:x̂⁽⁰⁾_corrected(n+1) = x̂⁽⁰⁾(n+1) / (1 - q̂(n+1))注意公式符号:如果q定义为(真实值-预测值)/真实值,则修正公式为预测值 = 预测值 / (1 - 状态中值)。如果q定义相反,公式也需要调整。
5.3 MATLAB代码实现核心框架
function [X0_pred_corrected, state_series, P] = GM11_Markov(X0, num_states) % X0: 原始序列 % num_states: 划分的状态数,例如4 % 1. 建立标准GM(1,1)模型,获取拟合值和相对残差 n = length(X0); [X0_fit, a, b] = standardGM11(X0); % 假设有这个函数 q = (X0 - X0_fit) ./ X0; % 相对残差 q = q(2:end); % 通常从第二期开始,q(1)=0 % 2. 划分残差状态 % 确定状态边界(这里使用等分区间,更优做法是根据分位数) q_min = min(q); q_max = max(q); boundaries = linspace(q_min, q_max, num_states+1); state_series = zeros(size(q)); for i = 1:length(q) for s = 1:num_states if q(i) >= boundaries(s) && q(i) < boundaries(s+1) state_series(i) = s; break; elseif s == num_states && q(i) == boundaries(s+1) % 处理右端点 state_series(i) = s; end end end % 3. 计算状态转移概率矩阵P P = zeros(num_states); for t = 1:length(state_series)-1 from_state = state_series(t); to_state = state_series(t+1); P(from_state, to_state) = P(from_state, to_state) + 1; end % 归一化,得到概率矩阵 row_sums = sum(P, 2); row_sums(row_sums == 0) = 1; % 防止除零 P = P ./ row_sums; fprintf('状态转移概率矩阵P:\n'); disp(P); % 4. 进行预测修正(以预测下一期为例) last_state = state_series(end); [~, next_state] = max(P(last_state, :)); % 选择概率最大的状态 % 计算预测状态的代表值(取状态区间中值) state_center = (boundaries(next_state) + boundaries(next_state+1)) / 2; % 使用GM(1,1)外推下一期 next_fit = predictGM11(a, b, X0(1), n+1); next_fit = next_fit(end); % 第n+1期的预测值 % 修正预测值 X0_pred_corrected = next_fit / (1 - state_center); fprintf('最后一期残差状态: %d\n', last_state); fprintf('预测下一期残差状态: %d (中心值=%.4f)\n', next_state, state_center); fprintf('GM(1,1)预测值: %.4f\n', next_fit); fprintf('马尔可夫修正后预测值: %.4f\n', X0_pred_corrected); end> 注意事项与心得:
- 状态划分是关键:不要机械地等分区间。最好根据残差序列的分布直方图或分位数(如四分位数)来划分,使每个状态包含的数据点数量大致均衡。
- 状态代表值的选取:除了中值,也可以考虑用该状态下所有残差的均值,这样更能反映该状态的“平均水平”。
- 多步预测:对于多步预测,马尔可夫链需要多次状态转移。例如预测第
n+2期,需要基于预测的第n+1期状态,再次查找转移矩阵中概率最大的状态。多次转移后,状态预测的准确性会下降。 - 论文呈现:在论文中,务必清晰地画出状态划分的示意图、列出状态转移概率矩阵,并对比展示单纯GM(1,1)预测与GM-Markov组合预测的误差,用数据证明组合模型的有效性。
6. 完整MATLAB实战案例:城市用电量预测
让我们用一个模拟的案例,串联起上述所有知识点。假设我们有某城市2015-2024年的年度用电量数据(单位:亿千瓦时):X0 = [125, 138, 142, 150, 158, 170, 185, 200, 220, 245]
任务:建立灰色预测模型,预测2025-2027年的用电量。
步骤一:级比检验与数据预处理
X0 = [125, 138, 142, 150, 158, 170, 185, 200, 220, 245]; [isSuitable, sigma] = gradeRatioTest(X0);运行后发现级比σ部分落在可容覆盖区间Θ=(0.8338, 1.1994)之外,序列不适合直接建模。我们尝试平移变换。
C = abs(min(X0)) + 1; % 本例中min=125,C=126 Y0 = X0 + C; [isSuitable_Y, sigma_Y] = gradeRatioTest(Y0);平移后序列Y0的级比全部落入Θ内,适合建模。记住这个常数C=126,最后预测结果需要减去它。
步骤二:建立优化背景值的GM(1,1)模型对Y0使用背景值优化函数optimizeBackgroundValue,得到最优权重ω、参数a, b和拟合值。计算平均相对误差。
步骤三:模型精度检验对拟合结果进行残差检验和后验差检验。假设检验结果为:平均相对误差1.5%,后验差比C=0.28,小误差概率P=1.0。模型精度为优秀(1级)。
步骤四:预测与反变换利用得到的a, b和Y0(1),预测未来3期(对应2025-2027)的Y⁽⁰⁾值,然后减去常数C,得到原始尺度下的用电量预测值。
% 假设从优化模型得到参数 a_opt = -0.08; % 发展系数 b_opt = 130.5; % 灰色作用量 Y0_1 = Y0(1); n = length(Y0); m = 3; % 预测3期 % 预测累加序列 Y1_pred = zeros(1, n+m); Y1_pred(1) = Y0_1; for k = 2:n+m Y1_pred(k) = (Y0_1 - b_opt/a_opt)*exp(-a_opt*(k-1)) + b_opt/a_opt; end % 累减还原得到预测的Y0 Y0_pred = [Y0_1, diff(Y1_pred)]; % 提取未来3期的预测值(对应第11,12,13项) Y0_forecast = Y0_pred(end-m+1:end); % 反变换,得到原始用电量预测值 X0_forecast = Y0_forecast - C; fprintf('2025-2027年用电量预测值(亿千瓦时): '); disp(X0_forecast);步骤五(可选):GM-Markov组合模型修正计算标准GM(1,1)对历史数据的拟合残差,划分状态,计算转移矩阵。假设当前年(2024)残差处于“轻微高估”状态,根据转移矩阵预测下一年残差状态为“轻微低估”,用其状态中值(如-2.5%)修正2025年的预测值。重复此过程(或使用更复杂的多步状态预测)修正2026、2027年预测。
步骤六:结果分析与论文表述将两种方法的预测结果进行对比,分析其差异。在论文中,应包含以下图表和内容:
- 原始序列与平移后序列的级比检验结果表。
- 背景值优化过程与结果(可展示ω寻优的迭代曲线)。
- 模型拟合效果对比图(含历史拟合与未来预测)。
- 残差分布图与后验差检验结果表。
- (如果使用)马尔可夫状态划分图与状态转移概率矩阵。
- 最终预测结果对比表。
- 对模型预测结果进行合理性分析,例如结合经济增长率、政策影响等进行讨论。
通过这样一个完整的案例,你不仅掌握了灰色预测模型从数据预处理、模型建立、优化、检验到预测的全流程,更具备了将其清晰、严谨地呈现在数学建模论文中的能力。记住,在比赛中,清晰的逻辑、完整的步骤、严谨的检验和深入的分析,比追求一个极其复杂的模型更重要。灰色预测模型以其对小样本、贫信息的强大处理能力,在众多赛题中都有用武之地,熟练掌握其进阶技巧,必将成为你获奖路上的利器。