当前位置:首页>java>MATLAB城市用电量灰色预测(附完整代码)

MATLAB城市用电量灰色预测(附完整代码)

  • 2026-08-15 04:01:48
MATLAB城市用电量灰色预测(附完整代码)
今天简单说一下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%

最新文章

随机文章