毕业设计-基于 MATLAB 的用电负荷和价格预测的研究与实现

  • Post author:
  • Post category:其他



目录


前言


课题背景和意义


实现技术思路


一、负荷预测基本分析


二、基于 BP 神经网络的负荷预测


三、基于 BP 神经网络的 MATLAB 仿真


部分源代码


实现效果图样例


最后


前言


📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。


🚀

对毕设有任何疑问都可以问学长哦!



选题指导:



https://blog.csdn.net/qq_37340229/article/details/128243277


大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯

基于 MATLAB 的用电负荷和价格预测的研究与实现


课题背景和意义

电力市场化是全球电力系统的大趋势,国内电力市场改革也在逐步有序向前推进,电价是这个市场的核心,电价的波动影响到各种资源在电力市场中的流动和分配,有着强大的经济杠杆作用。在电力市场环境下,准确的电价预测对干市场中各个参与者而言都具有非常重要的意义。因此,有必要对电价预测问题进行深人的研究。电力短期负荷预测是近几十年来电力系统高效可靠运 行的重要研究领域之一。电价预测即在充分考虑市场供求关系,市场参与者实施市场力大小,电力成本以及电力市场体制结构、社会经济形势等电价影响因素的情况下,通过利用数学工具对相关历史数据进行分析和研究,探索电价与其影响因素之间的内在联系及电价本身发展变化规律,在满足一定精度和速度的情况下,对未来电力市场中的电力交易价格进行预测。电力的产生与利用具备不能储存的 特殊性,这样就要求用电负荷发生变化时系统的发电量紧随 着用电量的变化而变化,轻则会降低供电的质量,重则危 及系统的安全与稳定。同时,它在电力系统调度、事故分 析、潮流分析、电力系统规划与维护等领域起着非常重要的 作用 。因此,电力负荷预测对电力系统有着重要意义。


实现技术思路

一、负荷预测基本分析


负荷预测的含义

负荷预测就是通过研究气象、经济、政治、节假日、历 史负荷的数据等,来找出影响负荷的因素和负荷变化之间的 内在联系,从而对未来负荷进行精确预测的一门学科。


负荷预测的分类

负荷预测一般可分为长期、中期和短期负荷预测。⑴长 期负荷预测主要是指未来几年内或是十几年内的电力负荷 预测。⑵中期负荷预测主要是指对未来一年的电负荷进行初 步的预测。⑶短期负荷预测是对电力负荷在下一周、一天、 一小时或更短的时间内的预测。


影响负荷的因素

1)电价因素

电力销售市场中部分用户会对电价的实时变化做出反 应,大部分用户为了减少用电费用会将用电时间从高价位时 间段转移到低价位时间段。


2) 其他因素

(1)日类型:工作日、周末、法定节假日等。

(2)天气因素:最高温度、最低温度、平均温度、湿度和天气状况。

(3)特别事件:如大型的政治等特殊事件。


二、基于 BP 神经网络的负荷预测


基于误差反向传播 (Back Propagation,简称 BP) 可以看成正向传播信息与反向传播信息两个部分。当数据通过建立的 BP 神经网络模型,其输出值与实际值的误差大于我们规定的误差时,数据将反向传播。


三、基于 BP 神经网络的 MATLAB 仿真



数据的选择与处理


1)数据的选取与预处理

本次仿真选取的是某地区 2013 到 2017 年 24 小时整点的历史数据与对应的气象数据,并对数据进行预处理,把伪数据清除,使数据具有更好的平滑性。此历史数据是通过数据库自动生成的 EXCEL 表格。此表格是数据库一天的输入变量。

2)训练样本的选取

我们将 2013 年 -2016 年的数据作为训练集,来训练 BP 神经网络模型;我们将 2017 年的数据作为检测集来检 测模型的准确性。

3)网络的初始化

初始化权值与阈值,将其设置为最小的随机矩阵以保证 每个神经工作在激活区。设置 BP 神经网络为中间层有 20 个神经元单输出的经典两层神经网络。准许误差为 1%~2%


神经网络算法模型

(1)数据计算预处理

在计算各个神经元的输入值与输出值之前,数据需要进 行归一化处理。因为数据的输入输出值的量纲以及量级都不 同。需将数据转变为 [-1,1] 或 [0,1] 区间内。

(2)生成的预测矩阵

功能 genpredictors 生成作为模型的输入变量的预测。 短期预测包括:干球温度、露点、小时的一天、一周中的一天、 标志它是否是假日 / 周末、前一天平均负荷、前一天同一小 时的负荷、同一个小时和前一周的同一天负荷。

% Select forecast horizon
term = ‘short’;
[X, dates, labels] = genPredictors(data, term, holidays);

(3)拆分数据集以创建培训和测试集

数据集分为两组,一组训练集,该数据集包括 2013 到 2016 的数据,以及一组包含来自 2017 的数据的测试集。 训练集用于建立模型(估计其参数)。测试集仅用于预测, 以检验样本数据的模型性能。

% Create training set
trainInd=data.NumDate < datenum(‘2017-01-01’);
trainX = X(trainInd,:);
trainY = data.SYSLoad(trainInd);
% Create test set and save for later
testInd = data.NumDate >= datenum(‘2017-01-01’);
testX = X(testInd,:);
testY = data.SYSLoad(testInd);
testDates = dates(testInd);

(4)基于神经网络模型的预测

建立模型后,对独立测试集进行预测。
load Data\testSet
forecastLoad = sim(net, testX’)’;


(5)产生的周线图


创建测试集中每周的预测和实际负载的比较。 程序流程图如图

部分源代码

%% 利用神经网络进行电力负荷预测
% 这个例子展示了用MATLAB建立和验证一个短期的
% 本例演示了用MATLAB建立和验证短期电力负荷预测模型。这些模型考虑到了
 
load Data\DBLoadData.mat
addpath ..\Util
 
%% 从Excel电子表格中导入假期列表
[num, text] = xlsread('..\Data\Holidays.xls'); 
holidays = text(2:end,1);
%% 生成预测矩阵
% 函数*genPredictors*生成了作为模型输入的预测变量。
% 的输入。对于短期预测,这些变量包括
% * 干球温度
% * 露点
% *一天中的小时
% * 一周中的一天
% *表明是否为假日/周末的标志
% * 前一天的平均负荷
% * 前一天同一小时的负荷
% * 前一周同一小时和同一天的负荷
% 如果目标是中期或长期的负荷预测,只需输入
% 如果目标是中期或长期的负荷预测,只有一天中的小时,一周中的一天,一年中的时间和节假日可以被使用
% 确定性地使用。天气/负荷信息将需要被指定为
% 指定为一个平均数或一个分布
%% 选择预测范围
term = 'short';
[X, dates, labels] = genPredictors(data, term, holidays);
%% 讲数据集分为训练和测试集
% 该数据集被分为两组,一个是包括2004年至2007年数据的_训练_组,
% 另一个是包括2008年数据的_测试_组。
% 训练集包括2004至2007年的数据,测试集包括2008年的数据。
% 训练集用于建立模型(估计其参数)。测试集仅用于预测,以测试模型在样本外数据上的表现。
%++++++ 建立训练集++++++++++
trainInd = data.NumDate < datenum('2008-01-01');
trainX = X(trainInd,:);
trainY = data.SYSLoad(trainInd);
 
%++++++创建测试集并保存以备不时之需++++++
testInd = data.NumDate >= datenum('2008-01-01');
testX = X(testInd,:);
testY = data.SYSLoad(testInd);
testDates = dates(testInd);
 
save Data\testSet testDates testX testY
clear X data trainInd testInd term holidays dates ans num text
 
%% 构建负荷预测模型
% 接下来的几个单元建立了一个神经网络回归模型,
% 用于给定训练数据的日前负荷预测。
% 然后,该模型被用于测试数据以验证其准确性。
%% 初始化和训练网络
% 初始化一个包含 20 个神经元的两层默认网络。使用“平均
% 绝对误差”(MAE)性能指标。然后,用
% 默认的 Levenburg-Marquardt 算法。为了提高效率,预先训练
% 除非特别强制执行重新训练,否则网络会被加载。
reTrain = false;
if reTrain || ~exist('Models\NNModel.mat', 'file')
    net = newfit(trainX', trainY', 20);
    net.performFcn = 'mae';
    net = train(net, trainX', trainY');
    save Models\NNModel.mat net
else
    load Models\NNModel.mat
end
    
%% 采用神经网络模型进行预测
% 一旦建立了模型,对独立的测试集进行预测. 
 
load Data\testSet
forecastLoad = sim(net, testX')';
 
%% 比较预测负荷和实际负荷
% 创建一个图表来比较实际负荷和预测负荷以及
% 并计算出预测误差。除了可视化之外,还可以使用平均绝对值等指标来量化
% 预测器的性能,如平均绝对误差(MAE)、平均绝对百分比误差(MAPE)和每日峰值误差(MAPE)等指标。
% 误差(MAE),平均绝对误差(MAPE)和每日峰值预测
% 误差。
err = testY-forecastLoad;
fitPlot(testDates, [testY forecastLoad], err);
 
errpct = abs(err)./testY*100;
 
fL = reshape(forecastLoad, 24, length(forecastLoad)/24)';
tY = reshape(testY, 24, length(testY)/24)';
peakerrpct = abs(max(tY,[],2) - max(fL,[],2))./max(tY,[],2) * 100;
 
MAE = mean(abs(err));
MAPE = mean(errpct(~isinf(errpct)));
 
fprintf('平均绝对百分比误差 (MAPE): %0.2f%% \n平均绝对误差 (MAE): %0.2f MWh\n每日峰值 MAPE: %0.2f%%\n',...
    MAPE, MAE, mean(peakerrpct))
 
 
%% 检查误差的分布情况
% 除了报告标量误差指标(如MAE和MAPE)外,误差分布图和绝对误差也有助于建立
% 误差和绝对误差的分布图可以帮助建立
% 围绕预测者的表现建立直觉
%% 可视化图像
figure;
subplot(3,1,1); hist(err,100); title('误差分布');
subplot(3,1,2); hist(abs(err),100); title('绝对误差分布');
line([MAE MAE], ylim); legend('误差', 'MAE');
subplot(3,1,3); hist(errpct,100); title('绝对百分比误差分布');
line([MAPE MAPE], ylim); legend('误差', 'MAPE');
%% 误差的集体分析
% 为了进一步了解预报器的性能,我们可以
% 为了进一步了解预报员的表现,我们可以按一天中的每一小时、
% 一周中的每一天和一年中的每一个月来直观地显示预报误差百分比。
% 年的月份
[yr, mo, da, hr] = datevec(testDates);
 
%% 按小时计算
clf;
boxplot(errpct, hr+1);
xlabel('小时'); ylabel('误差百分比的统计');
title('按小时划分的预测误差统计数据');
% 按工作日
figure
boxplot(errpct, weekday(floor(testDates)), 'labels', {'Sun','Mon','Tue','Wed','Thu','Fri','Sat'});
ylabel('误差百分比统计');
title('按工作日划分的预测误差统计明细表');
 
% 按月份
figure
boxplot(errpct, datestr(testDates,'mmm'));
ylabel('误差百分比统计');
title('按月份划分的预测误差统计细目表');
 
 
%% 制作每周图表
%在测试集上每周建立预测负荷与实际负荷的对比。
generateCharts = true;
if generateCharts
    step = 168*2;
    for i = 0:step:length(testDates)-step
        clf;
        fitPlot(testDates(i+1:i+step), [testY(i+1:i+step) forecastLoad(i+1:i+step)], err(i+1:i+step));
        title(sprintf('MAPE: %0.2f%%', mean(errpct(i+1:i+step))));
        snapnow
        
    end

end

实现效果图样例

电力负荷管理数据分析辅助稽查系统

日电量指数比对:

户日电量数值变化图:

查看用户电流曲线变化:


我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。


毕设帮助,疑难解答,欢迎打扰!

最后



版权声明:本文为qq_37340229原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。