今天简单说一下MATLAB灰色预测,在灰色系统理论认为,尽管系统的行为现象可能模糊不清、数据复杂,但它本质上是有序且具有整体功能的。在构建灰色预测模型前,需要对原始时间序列进行预处理。这种处理并非寻求数据的统计规律或概率分布,而是通过特定方法将杂乱无章的原始数据转换成有规律的时间序列,即探索数据自身的内在规律,进而建立动态模型。常用的预处理方式是累加生成(或累减生成),其中累加生成最为普遍。 灰色预测的核心在于,通过辨别系统各因素间发展趋势的差异,对原始数据进行生成处理以发掘变动规律,形成规律性更强的数据序列。随后,基于此序列建立相应的微分方程模型(通常是GM(1,1)模型,即单序列一阶线性微分方程模型),以此预测事物的未来趋势。最终的预测值是通过对生成数据模型的预测结果进行逆向处理(如累减还原)得到的。因此,灰色预测是以灰色模型,尤其是GM(1,1)模型为基础的。
当然要说明的是,下面程序数据全部是模拟的(自己做着玩的,),并非真实数据!!!无任何实际参考价值,仅供学习!
fprintf('=== 包头市用电量灰色预测分析 ===\n');
% 包头市近5年用电量数据(单位:亿千瓦时)
% 数据基于包头市工业城市特点和经济发展趋势模拟
electricity_data = [220, 235, 248, 262, 275]; % 2019-2023年用电量
years = 2019:2023;
fprintf('包头市历史用电量数据(2019-2023年):\n');
for i = 1:length(years)
fprintf('%d年: %.1f亿千瓦时\n', years(i), electricity_data(i));
end
% 灰色预测GM(1,1)模型核心算法
x0 = electricity_data;
predict_num = 3; % 预测未来3年
n = length(x0);
% 1. 生成累加序列x1
x1 = cumsum(x0);
% 2. 构造数据矩阵B和数据向量Y
B = zeros(n-1, 2);
Y = zeros(n-1, 1);
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
% 3. 计算参数向量[a, b] - 使用最小二乘法
ab = (B' * B) \ (B' * Y);
a = ab(1);
b = ab(2);
% 4. 建立预测模型
% x1(k+1) = (x0(1) - b/a) * exp(-a*k) + b/a
predict_result = zeros(1, n + predict_num);
predict_result(1:n) = x0; % 前n个是原始数据
% 计算预测值(累减还原)
x1_predict = zeros(1, n + predict_num);
for k = 1:n+predict_num
x1_predict(k) = (x0(1) - b/a) * exp(-a*(k-1)) + b/a;
if k == 1
predict_result(k) = x1_predict(k);
else
predict_result(k) = x1_predict(k) - x1_predict(k-1);
end
end
% 5. 计算模型精度
% 计算拟合值(用于精度评估)
x0_fit = zeros(1, n);
x1_fit = zeros(1, n);
for k = 1:n
x1_fit(k) = (x0(1) - b/a) * exp(-a*(k-1)) + b/a;
if k == 1
x0_fit(k) = x1_fit(k);
else
x0_fit(k) = x1_fit(k) - x1_fit(k-1);
end
end
% 计算残差和精度
residual = abs(x0 - x0_fit);
relative_error = residual ./ abs(x0);
avg_relative_error = mean(relative_error);
accuracy = 1 - avg_relative_error; % 精度 = 1 - 平均相对误差
% 显示预测结果
predict_years = 2024:2026;
fprintf('\n预测结果(2024-2026年):\n');
for i = 1:length(predict_years)
fprintf('%d年: %.2f亿千瓦时\n', predict_years(i), predict_result(5+i));
end
fprintf('\n模型评估:\n');
fprintf('预测精度: %.2f%%\n', accuracy*100);
% 计算年均增长率
growth_rate = ((predict_result(8)/electricity_data(1))^(1/8) - 1) * 100;
fprintf('8年期年均增长率: %.2f%%\n', growth_rate);
% 绘制预测图表
figure('Name', '包头市用电量灰色预测', 'NumberTitle', 'off');
plot(years, electricity_data, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
hold on;
plot(predict_years, predict_result(6:8), 'r*-', 'LineWidth', 2, 'MarkerSize', 8);
% 添加数据点标签
for i = 1:length(years)
text(years(i), electricity_data(i), sprintf('%.1f', electricity_data(i)), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center', 'FontSize', 9);
end
for i = 1:length(predict_years)
text(predict_years(i), predict_result(5+i), sprintf('%.2f', predict_result(5+i)), ...
'VerticalAlignment', 'top', 'HorizontalAlignment', 'center', 'FontSize', 9);
end
legend('历史数据', '预测数据', 'Location', 'northwest');
title('包头市用电量灰色预测模型 (2019-2026年)');
xlabel('年份');
ylabel('用电量 (亿千瓦时)');
grid on;
fprintf('\n灰色预测模型参数:\n');
fprintf('发展灰数 a = %.6f\n', a);
fprintf('内生控制灰数 b = %.6f\n', b);
fprintf('预测模型: x^(k+1) = (%.4f - (%.4f)/%.4f) * exp(-%.4f*k) + (%.4f)/%.4f\n', ...
x0(1), b, a, a, b, a);
% 预测置信区间(简单估计)
fprintf('\n预测置信区间估计 (±5%%):\n');
for i = 1:length(predict_years)
pred_val = predict_result(5+i);
lower_bound = pred_val * 0.95;
upper_bound = pred_val * 1.05;
fprintf('%d年: [%.2f, %.2f] 亿千瓦时\n', predict_years(i), lower_bound, upper_bound);
end
% 计算预测趋势分析
fprintf('\n趋势分析:\n');
if a < 0
fprintf('发展系数a=%.4f < 0,系统呈增长趋势\n', a);
else
fprintf('发展系数a=%.4f > 0,系统呈衰减趋势\n', a);
end
% 计算3年预测总量
total_predict = sum(predict_result(6:8));
fprintf('2024-2026年三年用电量预测总和: %.2f亿千瓦时\n', total_predict);
% 与历史同期对比
historical_avg = mean(electricity_data);
predict_avg = mean(predict_result(6:8));
change_rate = (predict_avg - historical_avg) / historical_avg * 100;
fprintf('预测期平均用电量较历史平均变化: %.2f%%\n', change_rate);
``` [ ](t)
=== 包头市用电量灰色预测分析 ===
包头市历史用电量数据(2019-2023年):
2019年: 220.0亿千瓦时
2020年: 235.0亿千瓦时
2021年: 248.0亿千瓦时
2022年: 262.0亿千瓦时
2023年: 275.0亿千瓦时
预测结果(2024-2026年):
2024年: 290.21亿千瓦时
2025年: 305.85亿千瓦时
2026年: 322.35亿千瓦时
模型评估:
预测精度: 99.89%
8年期年均增长率: 4.89%
灰色预测模型参数:
发展灰数 a = -0.052520
内生控制灰数 b = 217.540410
预测模型: x^(k+1) = (220.0000 - (217.5404)/-0.0525) * exp(--0.0525*k) + (217.5404)/-0.0525
预测置信区间估计 (±5%):
2024年: [275.70, 304.72] 亿千瓦时
2025年: [290.56, 321.15] 亿千瓦时
2026年: [306.23, 338.46] 亿千瓦时
趋势分析:
发展系数a=-0.0525 < 0,系统呈增长趋势
2024-2026年三年用电量预测总和: 918.41亿千瓦时
预测期平均用电量较历史平均变化: 23.44%