基于Elman神经网络的负荷预测研究摘要:电力系统负荷预测是电力生产部门的重要工作之一,其负荷变化具有明显的周期性,文章采用Elman神经网络与BP神经网络建立模型,提出了一种基于神经网络的负荷预测方法。对某电网实际历史数据进行仿真预测,经研究发现,Elman模型具有收敛速度快、预测精度高的特点,同时表明利用Elman回归神经网络建模对某电网负荷进行预测是完全可行的,在负荷预测领域有着较好的应用前景。关键词:电力系统规划;神经网络;负荷预测引言经济的高速发展带来了城市化与工业生产规模的不断发展,也使得城市供电系统的供需矛盾变得日益突出起来,特别是夏季,城市电力紧缺的现象越来越普遍。进行供电量的预测不仅可以为合理分配现有的电力资源,新建或者扩建、改建电厂提供可靠的依据,而且也是影响到居民正常工作和生活基本保障的一个重要问题。因此,寻找城市供电量的规律性,预测今后几年的供电量,不仅对于城市建设与城市管理有着重要的指导意义,而且也与居民的日常工作和生活息息相关。因此电力负荷预测是电力系统运行调度中一项非常重要的内容,是保证电力系统安全经济运行和实现电网科学管理的基础。人工神经网络(ArtificialNeuralNetwork,ANN)具有很强的学习和映射能力,能够以任意精度模拟复杂的非线性关系,其关键是建立合适的数学模型,提高预测的精度。本文基于Elman神经网络的中期负荷预测模型,模型算法采用改进的BP算法,即自适应学习速率动量梯度下降反向传播算法。本文研究了某电网历史负荷数据特点,预测未来一年特殊时间点的负荷值,经仿真计算,证明了该方法的有效性和适用性。1某电网负荷特性分析应用人工神经网络进行负荷预测,也就是要依靠负荷的历史记录,对未来的负荷做出预报。建立负荷预测的人工神经网络数学模型,首先必须确定影响负荷的变化因素,也就是要确定人工神经网络的输入量。为此,要先从负荷的历史记录中,找出系统负荷变化的规律和特性。以某电网2003~2011年重要月份的历史负荷数据为例,采用Elman神经网络方法进行建模研究。通过对某电网月度负荷数据序列的分析可知,随着时间的推移,月度负荷相比于往年同一月的历史负荷具有明显的增长趋势;同时,春耕秋收、气温升降、产销旺淡、产业政策又使月度负荷随季节变化与最近相邻几个月的历史负荷呈现出某种波动趋势。而且,该电网年负荷曲线月平均最高峰多出现在冬季11、12月份;全年日平均最高,由于空调负荷较多,多出现在7、8月份;全年2月份、9月份平均负荷较低。国人的劳作受农历节气影响较大,本研究选定时间为元宵节前后各10天、端午节前后各10天、冬至前后各10天。历史供电量数据标幺化处理后(选定15亿千瓦时为参考值)见表1。表1某电网历史供电数据表年份元宵节端午节冬至20030.27760.30240.429820040.39830.45110.486620050.46910.56520.618220060.56790.60970.728620070.62880.72820.870420080.75290.96841.027620090.92311.05721.065520100.88771.03611.401620111.16831.32251.44252Elman神经网络结构与算法目前在电力系统负荷预测领域应用最广泛的是静态前馈BP神经网络,尤其是以短期负荷预测领域应用居多。利用静态前馈网络对动态系统进行辨识,实际上是将动态时间建模问题变为静态建模问题,必然会引出许多问题。目前能够更直接更生动地反映系统动态特性的网络应该是动态神经网络,即回归神经网络(RecurrentNeuralNetwork),Elman回归网络是一种典型的动态神经元网络,它是在BP人工神经网络基本结构的基础上,通过存储内部状态使其具备映射动态特征的功能,从而使系统具有适应时变特性的能力。2.1Elman神经网络结构Elman型回归神经元网络一般分为4层:输入层、中间层(隐含层)、承接层和输出层,如图1示。其输入层、隐含层和输出层的连接类似于前馈网络,输入层的单元仅起信号传输作用,输出层单元起线性加权作用。隐含层单元的传递函数可采用线性或非线性函数,承接层又称为上下文层或状态层,它用来记忆隐含层单元前一时刻的输出值,可以认为是一个一步延时算子。图1Elman网络结构示意图Elman型回归神经元网络的特点是隐藏层的输出通过结构单元的延迟、存储,自联到隐藏层的输入,这种自联方式使其对历史状态的数据具有敏感性,内部反馈网络的加入增加了网络本身处理动态信息的能力,有利于动态过程的建模。此外Elman网络的动态特性仅由内部的连接提供,无需使用状态作为输入或训练信号,这也是Elman网络相对于静态前馈网络的优越之处。2.2算法简介如图1所示,设网络的外部输入u(k-1)∈Rτ,输出为y(k)∈Rγm,若记隐含层的输出为x(k)∈Rτ,Elman神经网络的非线性状态空间表达式为:3()(())ykgxk12()(()(1))cxkfxkuk(1)()(1)cxkxk其中,k表示时刻,y,x,u,xc分别表示1维输出节点向量,1维隐含层节点单元向量,1维输入向量和1维反馈状态向量;ω3,ω2,ω1分别表示隐含层到输出层、输入层到隐含层、承接层到隐含层的连接权值矩阵;f(.)为隐含层神经元的传递函数,这里采用tansig函数表示,g(.)为输出层传递函数,采用purelin函数。由(1)式可得:()(1)cxkxk1211[((1)(2))]kckfxkuk(2)又由于xc(k-1)=x(k-2),上式可以继续展开。说明xc(k)依赖于过去不同时刻的连接权1k,2k•••,即xc(k)是一个动态递推过程。Elman神经网络学习算法采用的是优化的梯度下降算法,即自适应学习速率动量梯度下降反向传播算法,它既能提高网络的训练效率,又能有效抑制网络陷入局部极小点。学习的目的是用网络的实际输出值与输出样本值的差值来修改权值和阈值,使得网络输出层的误差平方和最小。设第k步系统的实际输出向量为yd(k),在时间段(O,T)内,定义误差函数为:211[()()]2TdkEykyk(3)以ω3,ω2分为例,将E对ω3,ω2分别求偏导,可得权值修正公式为:3'311(1)(1)(()())*(.)()()jdjjkmcykykgxkmck22(1)(1)(()())*'(.)(1)()jqdjqjqkmcykykfukmck(4)其中,j=l,2,.....,m;q=1,2,.....,n;η为学习速率,mC为动量因子,默认值为0,9。这样在进行更新时不仅考虑了当前梯度方向,还考虑了前一时刻的梯度方向,降低了网络性能对参数调整的敏感性。3模型建立利用神经网络对电力系统负荷进行预测,实际上是利用人工神经网络可以以任意精度逼近任一非线性函数的特性及通过学习历史数据建模的优点。而在各种人工神经网络中,反馈式神经网络其具有输入延迟的特点,进而适合应用于电力系统负荷预测。根据负荷的历史数据,选定反馈神经网络的输入、输出节点,来反映电力系统负荷运行的内在规律,从而达到预测未来时段负荷的目的。因此,用神经网络对电力系统进行预测,首先的问题是确定神经网络的输入、输出节点,能使其反映电力负荷的运行规律。利用2003~2011年的数据作为网络的训练样本,以每3年的负荷作为输入向量,第4年的负荷作为目标向量,可以得到5组训练样本,第9年的数据作为网络的测试样本,验证网络能否合理的预测当天的负荷数据。3.1神经网络隐含层节点数的确定隐含层神经元的数目是非常重要的,它的选取结果直接影响到网络的性能好坏。如果隐含层的神经元数量太少,网络就不能够很好地学习,即便可以学习,需要训练的次数也非常多,训练的精度也不高。当隐含层神经元的数目在一个合理的范围内时,增加神经元的个数可以提高网络训练的精度,还可能会降低训练的次数。但是,当超过这一范围后,如果继续增加神经元的数量,网络训练的时间又会增加,甚至还有可能引起其它的问题。那么,究竟要选择多少个隐含层神经元才合适呢?遗憾的是,至今为止还没有一个理想的解析式能够确定网络隐含层神经元的数目。本文通过分别取7、11、14、18这4个不同的隐藏层神经元个数,并对比结果,发现当取11时仿真结果较好。3.2MATLAB仿真训练最大迭代次数为1000时得到迭代次数为仿真结果如下:图2网络隐含层神经元数为11的仿真结果通过MATLAB实现Elman神经网络预测后,比较网络预测误差可以发现当中间神经元为11时,网络的预测误差最小,也就是预测性能最好。如图3所示。图3比较不同网络隐藏层神经元个数预测误差4结论Elman神经网络能较好的预测电力负荷趋势。但电力系统负荷是一个很复杂的非线性系统,影响用电负荷的因素很多,而且也较为复杂,要预测一年内各月用电负荷情况,就需要一年内影响负荷的资料,这些要求有时是较高的,某些因素的资料收集很困难。但实际上,把这些因素详细考虑,并不是在任何时候都能提高精度,原因是一方面有些因素和用电负荷资料的相关系数很低,另一方面是获得这些因素的资料本身精度不高。因此,中期负荷预报,应适当简化模型,抓住主要矛盾。附录:MATLAB程序%%清空环境变量clc;clearallcloseallnntwarnoff;%%数据载入loaddata;a=data;%%选取训练数据和测试数据fori=1:6p(i,:)=[a(i,:),a(i+1,:),a(i+2,:)];end%训练数据输入p_train=p(1:5,:);%训练数据输出t_train=a(4:8,:);%测试数据输入p_test=p(6,:);%测试数据输出³öt_test=a(9,:);%为适应网络结构做转置p_train=p_train';t_train=t_train';p_test=p_test';%%网络的建立和训练·%利用循环,设置不同的隐藏层神经元个数nn=[7111418];fori=1:4threshold=[01;01;01;01;01;01;01;01;01];%建立Elman神经网络隐藏层为nn(i)个神经元net=newelm(threshold,[nn(i),3],{'tansig','purelin'});%设置网络训练参数net.trainparam.epochs=1000;net.trainparam.show=20;%初始化网络net=init(net);%Elman网络训练net=train(net,p_train,t_train);%预测数据y=sim(net,p_test);%计算误差error(i,:)=y'-t_test;end%%通过作图观察不同隐藏层神经元个数时,网络的预测效果plot(1:1:3,error(1,:),'-ro','linewidth',2);holdon;plot(1:1:3,error(2,:),'b:x','linewidth',2);holdon;plot(1:1:3,error(3,:),'k-.s','linewidth',2);holdon;plot(1:1:3,error(4,:),'c--d','linewidth',2);title('Elman预测误差')set(gca,'Xtick',[1:3])legend('7','11','14','18','location','best')xlabel('时间点')ylabel('误差')holdoff;