[负荷预测]基于灰色GM(1,1)模型的中长期电力负荷预测

article/2025/10/31 0:32:34

目  录

一、灰色模型GM(1,1)原理    

二、模型构建前检验

三、预测精度的检验

3.1 残差检验

3.2 后验差检验

四、灰色模型GM(1,1)算法

五、Matlab编程实现

5.1 程序代码

5.2 输出结果

5.3 结果检验

5.4 预测泛化

 六、Python编程实现

6.1 程序代码

6.2 程序输出

6.3 往后 10 年负荷为:(2021-2030年)


一、灰色模型GM(1,1)原理    

       灰色预测的主要特点是模型使用的不是原始数据序列,而是生成的数据序列。其核心体系是灰色模型(Grey Model,简称GM),即对原始数据作累加生成(或其它方法生成)得到近似的指数规律再进行建模的方法。灰色预测模型对于不同问题采用不同模型,GM(1,1)模型主要解决生成序列是有指数变化规律,只能描述单调的变化过程。

       对于生成的数列,我们可以设想用一个指数曲线乃至一条直线来逼近这个生成的数列。于是我们构建一个一阶常微分方程来求解这个拟合曲线函数表达式。设:

       给定观测数据列

 

       经一次累加得 

      满足一阶常微分方程

       灰色预测模型求解的途径是一次累加序列通过最小二乘法来估计常数a与u.

       最小二乘法的作用是计算未知数个数小于方程个数的情况下,未知数的使误差最小的取值,这里用于求u和a。从最后的结果可以看出,GM(1,1)只要针对指数变化且单调规律进行拟合,对于摆动序列就不行。

二、模型构建前检验

        给定序列能否建立较高精度的GM(1,1)模型,一般用序列的级比lamda的大小与所属区间来判断。序列的级比定义为:

 

        若满足:

       例如n=4,

 

       则认为序列x(0)是可作为GM(1,1)建模的。

三、预测精度的检验

       模型对原始数据列进行预测,与原始结果比较,看看拟合度怎么样。残差指的是预测值与实际值的差值,即绝对误差。

3.1 残差检验

     分为残差检验后验差检验关联度检验。

3.2 后验差检验

     一个模型是否满足实际的需要,就要对模型进行检验。一个好的模型,要求C(后验差比值)越小越好;P(小误差概率)越大越好。按照P和C的大小,可将精度分为4个等级,如表1所示。

表4.1 预测精度等级

       详细原理请阅读:https://heaven.blog.csdn.net/article/details/120639012

四、灰色模型GM(1,1)算法

五、Matlab编程实现

5.1 程序代码

%GM(1,1)灰色理论模型,2021.8.1
clc
clear
syms a u;
c=[a,u]';%构成矩阵
A_SG= [30.9250   32.5390   35.2270   34.6940   34.5060   36.0510   38.7450   42.3610   44.5360 45.783 47.52];%输入数据,可以修改
A = A_SG; 
Ago=cumsum(A);%原始数据一次累加,得到1-AGO序列xi(1)。
n=length(A);%原始数据个数
for k=1:(n-1)Z(k)=(Ago(k)+Ago(k+1))/2; %Z(i)为xi(1)的紧邻均值生成序列
end
Yn =A;%Yn为常数项向量
Yn(1)=[]; %从第二个数开始,即x(2),x(3)...
Yn=Yn';
E=[-Z;ones(1,n-1)]';%累加生成数据做均值
c=(E'*E)\(E'*Yn);%利用公式求出a,u
c= c';
a=c(1);%得到a的值
u=c(2);%得到u的值
F=[];
F(1)=A(1);
%n=n+1
for k=2:(n)F(k)=(A(1)-u/a)/exp(a*(k-1))+u/a;%求出GM(1,1)模型公式
end
G=[];
G(1)=A(1);
for k=2:(n)G(k)=F(k)-F(k-1);%两者做差还原原序列,得到预测数据
end
%t1=1:(n-1);
t1=1:n;
t2=1:n;
plot(t1,A,'bo--');
hold on;
plot(t2,G,'r*-'); 
title('predict result');
legend('real value','predict value')

5.2 输出结果

        F(k)=(A(1)-u/a)/exp(a*(k-1))+u/a

        G(k)=F(k)-F(k-1)

5.3 结果检验

%后验差检验
e=A-G;
q=e/A;%相对误差
s1=var(A);
s2=var(e);
c=s2/s1;%方差比
len=length(e);
p=0;  %小误差概率
for i=1:lenif(abs(e(i))<0.6745*s1)p=p+1;end
end
p=p/len

         输出结果:

c = 0.045

p = 1#故预测模型可用

u= 29.6891

a= -0.0447

5.4 预测泛化

(1) GM(1,1)模型

F(k)=(A(1)-u/a)/exp(a*(k-1))+u/a

F(12)=(30.925+29.6891/0.0447)*exp(0.0447*11)+29.6891/(-0.0447)= 472.3853

F(11)=(30.925+29.6891/0.0447)*exp(0.0447*10)+29.6891/(-0.0447)= 422.6993

(2)数据预测

G(k)=F(k)-F(k-1)

Y2021 =G(12)=F(12)-F(11)

=(30.925+29.6891/0.0447)/exp(-0.0447*11)-(30.925+29.6891/0.0477)/exp(-0.0477*10)

=(30.925+29.6891/0.0447)*(1/exp(-0.0447*11)-1/exp(-0.0447*10))

=49.6860

 Y2021  = G(12) = F(12)-F(11)

             = 472.3790 - 422.6942=49.6848

Y2022  = G(13) = F(13)-F(12)

            = 524.3351-472.3790 = 51.9561

 六、Python编程实现

6.1 程序代码

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 21 20:51:43 2021
@author: zcq
"""
import matplotlib.pyplot as plt
import numpy as np
#载入math,提供对浮点数的数学运算函数
import math#年用电量
A_SG = [30.9250,32.5390,35.2270,34.6940,34.5060,36.0510,38.7450,42.3610,44.5360,45.783,47.52]
history_data = A_SG
#获取人口数据长度
n = len(history_data)
#将数据转换为数组
X0 = np.array(history_data)
#累加生成
history_data_agg = [sum(history_data[0:i+1]) for i in range(n)]
X1 = np.array(history_data_agg)
#计算数据矩阵B 和数据向量Y
B = np.zeros([n-1,2]) #初始化矩阵B
Y = np.zeros([n-1,1]) #初始化矩阵Y
for i in range(0,n-1):#用循环计算矩阵的每个元素B[i][0] = -0.5*(X1[i]+X1[i+1])B[i][1] = 1Y[i][0] = X0[i+1]
#计算GM(1,1)微分方程的参数a和u
A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
#np.linalg.inv用于求逆矩阵,.T用于矩阵转置,使用最小二乘法估计微分方程的参数
'''
try:A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)#np.linalg.inv用于求逆矩阵,.T用于矩阵转置,使用最小二乘法估计微分方程的参数print(A)BB=np.linalg.inv(A)
except:print("矩阵不存在逆矩阵")
else:print(BB)
'''
a = A[0][0]
u = A[1][0]
#建立灰色预测模型
XX0 = np.zeros(n)#初始化预测结果矩阵XX0
XX0[0] = X0[0] #设置结果矩阵的第一项
for i in range(1,n): #循环预测结果矩阵的每一个值XX0[i] = (X0[0]-u/a)*(1-math.exp(a))*math.exp(-a*(i))
#模型精度的后验差检验
e = 0 #求残差平均值
for i in range(0,n):e += ( X0[i]- XX0[i])e /= n
print('残差均值为',np.round(e,2))
#求历史数据平均值
aver = 0;
for i in range( 0,n):aver += X0[i]aver /= n
print('历史数据平均值为',np.round(aver,2))
#求历史数据方差
s12 = 0;
for i in range( 0,n):s12 += (X0[i]-aver)**2s12 /= n
print('历史数据方差为',np.round(s12,2))
#求残差方差
s22 = 0;
for i in range(0,n):s22 += ( ( X0[i]-XX0[i]) - e)**2s22 /= n
print('残差方差为',np.round(s22,2))
#求后验差比值
C = s22 / s12
print('后验差比值为C=',np.round(C,2))
#求小误差概率
cout = 0
'''
服从标准正态分布,让误差概率落在25%到75%区域内。
由正态分布表可知,对应为25%和75%的值分别为-0.6745 和+0.6745。
'''
for i in range(0,n):    if abs((X0[i]-XX0[i])-e)<0.6754*math.sqrt(s12):cout = cout+1else:cout = cout
P = cout / n
print('小误差概率为P=',np.round(P,2))if ( C < 0.35 and P>0.95): #是否满足一级预测精度m = 10 #需要预测的年数print('往后',m,'年,各年负荷为:')f = np.zeros(m)for i in range(0,m):#预测结果的值f[i] = (X0[0]-u/a)*(1-math.exp(a))*math.exp(-a*(i+n))print(np.round(f[i],2)) #取两位小数
else:print('灰色预测法不适用')
#y = history_data
y = np.append(history_data,f)
x_num = m+n
plt.plot(y,"b.")
plt.grid()

6.2 程序输出

残差均值为 0.0

历史数据平均值为 4.73

历史数据方差为 181.63

残差方差为 0.0

后验差比值为C= 0.0

小误差概率为P= 1.0

6.3 往后 10 年负荷为:(2021-2030年)

往后10年,各年负荷为:

49.68     51.96    54.33     56.81     59.41     62.13      64.97     67.94     71.04      74.29

图1 2011-2030年SGCC全社会用电量电力负荷预测 


http://chatgpt.dhexx.cn/article/b5GGFkEG.shtml

相关文章

基于注意力机制的 CNN-BiGRU 短期电力负荷预测方法

提出了一种基于 Attention 机制的CNN -BiGRU&#xff08;卷积神经网络双向GRU注意力机制&#xff09;短期电力负荷预测方法&#xff0c;该方法将历史负荷数据作为输入&#xff0c;搭建由一维卷 积层和池化层等组成的 CNN 架构&#xff0c;提取反映负荷复杂动态变化的高维特征…

电力负荷预测任务(基于GRU模型)

数据&#xff1a;2000-2002三年每小时的电力负载 程序以及数据链接&#xff08;如果受益&#xff0c;请给个关注和star&#xff09;&#xff1a;https://github.com/xzdLYL/electrical_load_prediction 任务目标&#xff1a;以2000&#xff0c;2001年数据训练模型&#xff0c…

机器学习练手---负荷数据预测

纸上得来终觉浅&#xff0c;得知此事要躬行 文章目录 前言一、数据清洗查看特征与label的关联程度查看特征自身的差异性。特征筛选 二、引入模型1.选择多元线性回归模型2.尝试预测 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 简单记录一下机器…

电力负荷短期预测模型(基于ARIMA)

电力负荷预测 电力分析与预测一.导入数据二.数据的预处理三.基本描述性统计四.构建特征&#xff0c;模型准备①系统聚类法②K-means聚类 五.构建特征&#xff0c;建立预测模型①预测未来一天&#xff0c;各时段的电力负荷②预测未来几天总体电力负荷 电力分析与预测 根据提供的…

深度学习方法在负荷预测中的应用综述(论文阅读)

前言   本篇论文主要介绍了当下用于智能电网电力负荷预测的多种DL方法&#xff0c;并对它们的效果进行了比较。对于RMSE的降低效果上&#xff0c;集成DBN和SVM的方法RMSE降低显著&#xff0c;达到了21.2%。此外&#xff0c;PDRNN方法与ARIMA方法相比有很大的降低&#xff0c;…

电气论文:负荷区间预测(机器学习简单实现)

个人电气博文目录链接: 学好电气全靠它,个人电气博文目录(持续更新中…) 代码图 效果图 论文解锁,是解锁这个专栏。可以看这个专栏的所有文章。 讲解 本文:简单写的模型(未对数据进行降噪,降噪可以看我的小波分解博客。未对区间预测效果进行度量。自己写个公式就可以…

【负荷预测】长短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

基于BiGRU短期电力负荷预测方法

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

[负荷预测]基于线性回归模型的中长期电力负荷预测

目录 一、中长期电力负荷预测 二、国家电网电力数据集 三、 Matlab编程实现 3.1 程序代码 3.2 多元线性回归模型 3.3 对2020年数据预测 一、中长期电力负荷预测 电力负荷预测是电力系统规划的重要组成部分&#xff0c;也是电力系统经济运行的基础&#xff0c;其对电力系…

【负荷预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

目录 1 概述 2 基于神经网络的负荷预测&#xff08;Matlab实现&#xff09; 2.1 代码 2.2 结果 2.3 回归树模型的进一步改进 3 基于神经网络的价格预测&#xff08;Matlab代码实现&#xff09; 4 阅读全文&#xff08;Matlab代码&#xff09; 1 概述 这个例子演示了…

LSTM-多变量-单时间步-pytorch-负荷预测(多时间步采用滚动预测)

问题描述 使用LSTM做负荷预测问题&#xff0c;数据共计456行&#xff0c;每一行3个特征&#xff0c;用过去N个时间段特征&#xff0c;预测未来第N1个时间点的特征&#xff0c;数据格式如下&#xff0c;用00:00:00-04:00:00的[feature1&#xff0c;feature2&#xff0c;feature…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Charles抓包web、手机、小程序配置

一、下载地址 二、web抓包 Charles Web抓包&#xff0c;启动Charles会自动与浏览器设置成代理&#xff0c;不需要进行过多的设置。接下来就是通过浏览器发送网络请求&#xff0c;Charles就会直接抓取到这些信息和响应信息。 1、抓取HTTPS协议 Charles配置 点击顶部菜单栏【He…

Charles抓包使用及常用问题

简介 Charles其实是一款代理服务器&#xff0c;通过成为电脑或者浏览器的代理&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0c;能够在Windows&#xff0c;Mac&#xff0c;Linux上使用&#xff0c;安装Charles的时候要先装好Java环境。 …

Charles抓包显示<unknown>解决方案

上篇 &#xff1a;Charles抓包微信小程序数据 charles抓包会出现&#xff0c;请求前都加了锁&#xff0c;具体地址为<unknown>的情况。 解决<unknown>问题 首先电脑上需要安装charles&#xff0c;然后需要设置手机上的WiFi设置&#xff0c;修改配置中的代理设置&a…

charles抓包配置具体操作步骤

Charles主要功能 截取Http和Https网络封包 支持重发网络请求&#xff0c;方便后端调试 支持修改网络请求参数 支持网络请求的截获并动态修改 支持模拟慢速网络 Charles下载安装 charles下载地址&#xff1a;https://www.charlesproxy.com/download/ 注&#xff1a; 浏览…

Charles抓包https接口指南

Charles抓包https接口 作为一名iOS攻城狮&#xff0c;如果你没有听说过青花瓷这款软件&#xff0c;我只能说你还是回家洗洗睡吧。 最近在写一个需求&#xff0c;服务端不知道怎么设计接口。我只好找来了一个又类似功能的app&#xff0c;想要一睹芳容。于是主角Charles软件开始…

Charles抓包 - 手机

目的&#xff1a;抓IOS、Android端接口数据&#xff0c;保证IOS、Android和电脑在同一网络下&#xff1a; 1、首先需要将 Charles 的代理功能打开&#xff0c;在 Charles 的菜单栏上选择 “Proxy”–>“Proxy Settings”&#xff0c;填入代理端口 8888&#xff0c;并且勾上…

抓包工具-Charles

目录 1.环境搭建 2.Charles的界面&功能介绍 2.1提供两种封包视图&#xff1a;Structure和Sequence 2.2模拟网速 2.3重复发送请求 2.4修改服务器返回内容 2.4.1断点功能Breakpoints 2.4.2重写功能Rewrite 2.4.3重定向MAP&#xff08;后面在介绍&#xff09; 2.5修改…

Charles抓包微信小程序数据

本文中使用的是mac上的抓包工具charles进行抓包&#xff0c;手机是apple11。 Charles 上的设置&#xff1a; 要截取 iPhone 上的网络请求&#xff0c;我们首先需要将 Charles 的代理功能打开。 在 Charles 的菜单栏上选择 Proxy – Proxy Settings 点击进入如下界面 填入代…