
简介这是一份关于基于改进BP神经网络的光伏发电量预测研究的中文学术论文PDF面向从事神经网络、深度学习及数据建模方向的研究者和工程技术人员。论文聚焦光伏发电量受光照强度、环境温度等因素影响而难以精确预测的问题提出通过调整学习算法、优化网络结构与初始化参数等方式改进传统BP网络并选取光照强度和环境温度作为输入建立预测模型。内容涵盖光伏电池特性与数学模型、影响因素分析、改进BP网络构建过程、与传统数学模型及传统BP模型的对比实验以及多种光伏发电量预测方法的讨论可为相关课题提供研究思路与实验设计参考。压缩包包含1个PDF文件大小347KB已有235人学习下载。1. 光伏功率预测靠不靠谱一份改进BP论文能直接复现什么光伏电站的值班员每天最头疼的一件事就是上报明天的发电计划。报多了考核扣钱报少了电网不答应。而影响发电量的因素又多又杂——光照、温度、云层、安装角度随便一个波动就让预测对不上。这篇南昌航空大学学报上的论文给出的方案不是堆复杂网络而是把经典的BP神经网络做了两处改动输出层到隐含层用附加动量法隐含层到输入层用L-M算法网络结构就2个输入、4个隐含节点、1个输出在60组小样本上把平均相对误差做到了6.787%。如果你正在做新能源功率预测或者想看看改进BP到底怎么改才有效这份资料值得花半小时读完并复现。2. 输入变量为什么只选光照和温度光伏电池I-V特性里的工程依据2.1 从等效电路看懂光伏电池的输出特性光伏电池本质上就是一个大面积PN结。光照激发出光生电流Iph这个电流流经外部负载时在负载两端建立电压。论文给出的数学模型源于经典的单二极管等效电路其电流电压关系可以写成I Iph - Io [exp(qV/AKT) - 1] - (V I·Rs)/Rsh式中V是输出电压I是输出电流K是玻尔兹曼常数q是电子电荷量A是PN结理想因子取值1到5T是电池表面温度Iph是光生电流Io是反向饱和电流。实际工程中串联电阻Rs远小于并联电阻Rsh所以论文把最后一项省略简化为I Iph - Io[exp(qV/AKT) - 1]。这里有一个关键点公式里的参数Iph、Io、A、Rs、Rsh在实际电站里很难精确测量。Iph随光照强度近似线性变化Io对温度极其敏感A则取决于PN结的工艺质量。所以论文的做法很务实——不追求物理模型的绝对精确而是用神经网络去逼近这个输入到输出的映射关系。这也是为什么后面选BP网络而不是纯物理仿真来做预测。2.2 温度每升1℃输出功率掉0.35%论文用两族曲线讲清楚了温度和光照各自的影响。光强固定在811.23 W/m²时温度从-10℃升到20℃I-V曲线的开路电压明显左移光照固定在25℃时光强从597.38 W/m²升到1080.30 W/m²短路电流几乎成比例增长。具体数字更直观温度在20-100℃范围内每升高1℃电池电压大约下降2 mV光电流每升高1℃增加0.03 mA·℃⁻¹·cm⁻²也就是约千分之一的相对增量。综合下来典型光伏电池的温度系数是-0.35%/℃即温度每升高1℃输出功率降低约0.35%。这就是为什么夏季高温天光伏电站的峰值功率反而不如春秋季——板子太热了。光照的影响则简单得多光强从100变到1000 W/m²光电流线性增长而开路电压基本不变所以输出功率与光照强度近似成正比。从P-U曲线上看最大功率点随光强增加线性抬升这是后面用光强作为网络输入的最直接物理依据。2.3 为什么可以忽略安装角度和PN结参数光伏发电预测需要考察的因素确实很多安装倾角、方位角、电池PN结参数、光电转换效率、灰尘遮挡、温度、光照强度。但论文做了一个非常工程化的取舍安装角度在电站建成后就固定了属于人为设定的常量PN结参数和光电转换效率由电池制造工艺决定属于固有属性。这些因素在短期预测的时间尺度内几乎不变统一视为固定误差忽略掉只把动态变化最剧烈的光照强度和温度作为输入变量。这个取舍在工程上是站得住脚的。如果电站的安装角度会变或者光伏组件衰减快得异常那另说但对于一个运行稳定的电站光照和温度确实覆盖了发电量波动的主要来源。从建模角度讲输入变量越少网络需要学习的映射关系越简单在小样本条件下越不容易过拟合。这也是为什么这篇论文用60组数据就能训练出一个可用模型。3. 改进BP神经网络结构图附加动量与L-M算法各管哪一段3.1 传统BP的两个老毛病BP神经网络之所以用得广是因为三层网络能逼近任意连续非线性函数而且不需要显式给出映射关系的数学表达式。但它的学习规则是最速下降法按误差函数的负梯度方向调整权值这带来两个众所周知的缺陷收敛速度慢容易陷入局部极小点。梯度下降的步长由学习率控制学习率大了震荡小了磨蹭而误差曲面本身又起伏不平一旦掉进局部极小就难以爬出来。具体到光伏预测这个场景传统BP经常出现训练几千步后误差不再下降的情况。这不是网络结构的问题而是优化算法走到了某个局部谷底。论文针对的正是这个痛点不是换网络而是换权值更新策略。3.2 附加动量法给权值更新加一段惯性附加动量法的思路很直观权值调整时不仅看当前梯度还参考上一次权值变化的趋势相当于给梯度下降加了惯性。权值和阈值的调整公式为Δw(k1) (1 - mc)·η·δ mc·Δw(k)其中k为训练次数mc为动量因子论文取0.95左右η为学习率δ为梯度项。动量因子的作用在于如果前后两次梯度的方向一致本次权值变化会叠加更大的步长加速收敛如果方向相反说明可能遇到了极小点附近的振荡动量项会缓冲跳变帮助网络跃过局部极小。这里要注意动量因子的取值。0.95意味着上一次的权值变化对本次更新有95%的贡献惯性很大。这样做的好处是越过局部极小的能力强代价是对新数据的响应变慢。如果训练数据有明显的分布漂移动量因子反而会拖后腿。3.3 L-M算法在梯度和牛顿法之间取折中L-MLevenberg-Marquardt算法的核心思想是在求解权值增量时对系数矩阵主对角线加一个正数即(JᵀJ μE)P -Jᵀe其中J是误差函数对连接权值的导数矩阵雅可比矩阵e为网络误差向量P为搜索方向μ是阻尼因子E为单位矩阵。当μ取较大值时算法退化为梯度下降法收敛慢但稳定当μ取较小值时算法逼近牛顿法收敛快但对初值敏感。L-M算法在每次迭代中自适应调节μ使目标函数接近最优解时在极值点附近快速收敛。这篇论文有意思的地方在于它把两种方法做了分工附加动量法用在输出层到隐含层的权值和阈值调整L-M算法用在隐含层到输入层的权值和阈值调整。这种分层改制在常规工程里并不常见常见做法是对整个网络统一用一种优化器。按论文实验结果这种混搭方案确实拿到了更低的平均误差但复现时要注意两种算法各自涉及的学习率和阻尼因子需要分开调不能套用一个参数。3.4 隐含层神经元个数4是怎么定出来的三层网络的拓扑结构为输入层、隐含层、输出层。输入层是二维向量包含光照强度和温度输出层只有一个节点即光伏最大输出功率。隐含层神经元数量按经验公式z √(m n) a其中m为输入向量个数2n为输出向量个数1a为1到10的常数算下来隐含层神经元个数取值范围是[3, 11]。论文用试凑法在这个范围内逐个验证选取光强597.38 W/m²、温度20℃的工况结果隐含层4个神经元时预测误差最小为11.14%最终确定网络结构为2-4-1。试凑法看起来笨其实是BP网络设计最常用的方法。隐含层节点太少网络学习能力不够节点太多容易记住训练样本的噪声导致过拟合。在只有60组样本的条件下4个隐含节点是一个合理的复杂度选择。复现时可以在这个区间里多跑几轮不同随机种子得到的最优节点数可能略有差异。4. 数据归一化与训练参数60组样本怎么喂给2-4-1网络4.1 训练样本的组织方式论文的训练数据由光强和温度组合生成光强取6个点分别是1080.30、989.44、951.79、811.23、744.97、599.39 W/m²温度范围从-10℃到40℃间隔5℃共11个点。6个光强与11个温度点两两组合共得到66组输入对论文中提及60组训练数据另有少量工况用于验证。这里要提醒一个复现细节光强6个点不是均匀分布的1080.30和989.44之间的距离只有90左右而811.23到744.97之间距离接近66这种不均匀分布会影响训练时样本对误差函数的贡献比例。如果条件允许可以额外补几个光强点让分布更均匀但论文中的方案属于够用就行的典型做法。4.2 min-max归一化防止Sigmoid饱和网络输入数据具有不同的物理意义和量纲——光照强度是几百W/m²的量级温度是负几十到正几十摄氏度的量级直接喂给网络会出问题Sigmoid激励函数在输入绝对值较大时进入饱和区导数趋近于零梯度更新几乎停滞。论文采用的归一化变换式为x (x - x_min) / (x_max - x_min)将输入数据压缩到[0, 1]区间。x是原始数据x是归一化后的数据x_min和x_max分别是原始输入数据中的最小值和最大值。这是一个标准的min-max归一化计算简单保留数据分布形态。值得注意的一点是归一化的最大值和最小值应该基于训练集统计预测新数据时继续使用训练集统计的x_min和x_max而不是重新统计。否则每次运行时归一化基准不一致模型的输入分布就漂移了。论文没有明确写这一条但复现时会遇到。4.3 训练参数设置与MATLAB训练流程论文给出的关键训练参数为最大训练步数50000目标误差0.01学习速率0.5。以下是一段与论文流程对应的MATLAB训练代码框架% 输入矩阵每列为一个样本第一行光强第二行温度 P [1080.30, 989.44, 951.79, 811.23, 744.97, 599.39; 20, 25, 30, 15, 10, 25]; % 示例组合 % 目标输出对应最大输出功率 T [267.42, 244.58, 235.21, 201.83, 185.49, 149.22]; % 示例数据 % min-max归一化到[0,1] P_norm (P - min(P, [], 2)) ./ (max(P, [], 2) - min(P, [], 2)); T_norm (T - min(T)) ./ (max(T) - min(T)); % 创建2-4-1网络trainFcn选择trainlm即L-M算法 net feedforwardnet(4, trainlm); net.trainParam.epochs 50000; % 最大训练步数 net.trainParam.goal 0.01; % 目标误差 net.trainParam.lr 0.5; % 学习速率 % 训练网络 [net, tr] train(net, P_norm, T_norm); % 预测并反归一化 T_pred_norm net(P_norm); T_pred T_pred_norm * (max(T) - min(T)) min(T);代码逻辑说明先构造输入矩阵和目标输出向量分别做min-max归一化然后用feedforwardnet创建2-4-1结构的网络训练函数指定为trainlm内置L-M算法最后训练并反归一化得到真实量纲的预测值。参数说明epochs设为50000是给足训练步数上限实际收敛通常在几百步到几千步之间设置过大会拖慢训练但不会损害结果goal为0.01表示误差平方和降到这个阈值以下就提前终止lr为0.5是学习速率这个值相对偏高配合L-M算法使用是合适的如果换成纯梯度下降会震荡。这段代码里P和T的示例数值是示意性的复现时应使用论文中的60组完整数据。5. 复现中的常见问题与排查误差对比与四个踩坑点5.1 相对百分比误差APE怎么算、结果怎么读论文评价预测效果使用的指标是相对百分比误差APE公式为APE |P_model - P_bp| / P_model × 100%其中P_model是光伏电池数学模型得到的预测值P_bp是BP网络模型的预测值。这里有一个复现时容易绕晕的细节论文把数学模型输出当作真值基准来计算BP模型的误差而不是用实测数据。原因在于论文使用的是仿真数据电池数学模型的输出被当作标准答案。如果你用实测电站数据复现基准应该换成实际发电量APE的分母是真实值。论文对比了传统数学模型、传统BP模型和改进BP模型三种方案。结果显示改进BP的相对误差最大值出现在T15℃附近最大误差为13.291%论文中另一个数值14.424%对应传统BP最小值出现在T35℃左右最小误差为3.058%平均相对误差为6.787%而传统BP平均为8.706%。这个对比说明改进策略确实有效但绝对值并不低——工程上6.787%的平均误差意味着每天的发电量预测偏差接近7%。5.2 为什么T15℃附近误差最大从误差分布曲线上看误差并非均匀分布15℃附近误差最高35℃附近最低。原因主要有两点。第一训练数据的温度范围从-10℃到40℃、间隔5℃共11个点15℃附近处于温度区间的中部偏低温一侧但光强的高值点1080.30 W/m²和低值点599.39 W/m²在这个温度带的组合对比较多预测对边界工况更敏感。第二光伏电池的功率-温度关系在低温段非线性更强开路电压的温度系数在低温区间变化更剧烈神经网络在样本稀疏的非线性区域拟合能力下降。简单说误差最大的地方往往是物理特性变化最陡的区域。5.3 复现翻车的四个高频问题现象一训练了50000步误差始终停在0.05以上降不下去。原因目标误差0.01只是一个停止条件如果学习率设置过高或网络初始化权值不合理L-M算法提前收敛到局部极小。解决改用不同随机种子重新初始化网络或把学习率从0.5降到0.1-0.2再试观察trainlm的梯度变化曲线。现象二训练集误差很低但换一组输入数据预测值明显偏离。原因60组样本太少网络过拟合了训练样本尤其隐含层节点数超过4时更容易发生。解决论文取4个隐含节点不是最优真理复现时应在[3, 11]区间逐个测试用留一法或交叉验证挑选结构而不是只看训练误差。现象三归一化后预测输出反算回原始量纲结果整体偏移一个常数。原因反归一化时用了完整样本的max和min而不是训练阶段保存的max和min。解决把训练集归一化参数保存为变量预测时直接调用或写成函数统一处理别在每次运行时重新统计。现象四动量因子取0.95后网络对新增样本响应迟钝在线预测跟不上天气突变。原因动量项比例过高导致权值更新滞后。解决如果是离线预测场景0.95没问题如果要接实时数据流把mc降到0.7-0.85并配合自适应学习率响应速度会明显改善。5.4 一个值得注意的边界误差基准的选择会改变结论论文以数学模型输出为基准计算APE得到平均6.787%。如果改用实测功率为基准误差数值会因测量仪器精度、环境波动而显著放大。复现时如果看到误差和论文对不上先检查基准是哪一种。这也是很多复现者跑出来结果和论文不一致的主要原因之一——不是代码错了是比较口径不一致。6. 误差分段分析与工程落地技巧让模型在边界工况更稳论文揭示了误差分布不均的特征那我们可以利用这一点做更精细的模型评估和修正。我建议在正式使用前做两件事分段误差分析和留一交叉验证。先做分段误差分析。把温度按低温-10~5℃、中温10~25℃、高温30~40℃三段切分分别统计每段的平均APE和最大APE。论文数据中低温段的误差大概率高于高温段。如果低温段的误差在10%以上而这个时间段又是冬季光伏发电量最低的时段——绝对值小、误差占比高对考核影响反而大。处理方式是给低温段单独训练一个子模型或者在输入向量里附加一个温度区间标记让网络知道当前处于哪个工作带。再做留一交叉验证。60组样本每次拿1组做验证、59组做训练循环60次统计平均误差。这个结果比全样本训练误差更接近真实预测水平。实际操作时把训练代码包一层循环import numpy as np from sklearn.neural_network import MLPRegressor from sklearn.preprocessing import MinMaxScaler # X为[光强, 温度]y为最大输出功率 errs [] for i in range(len(X)): X_train np.delete(X, i, axis0) y_train np.delete(y, i) X_val X[i:i1] y_val y[i] scaler_X MinMaxScaler().fit(X_train) scaler_y MinMaxScaler().fit(y_train.reshape(-1, 1)) X_tr scaler_X.transform(X_train) y_tr scaler_y.transform(y_train.reshape(-1, 1)).ravel() X_va scaler_X.transform(X_val) model MLPRegressor(hidden_layer_sizes(4,), max_iter50000, learning_rate_init0.5, tol0.01) model.fit(X_tr, y_tr) y_pred scaler_y.inverse_transform( model.predict(X_va).reshape(-1, 1)).ravel() errs.append(abs(y_pred[0] - y_val[0]) / y_val[0] * 100) print(fLOO平均APE: {np.mean(errs):.2f}%)逻辑说明每次切掉一个样本作验证剩余样本训练并预测被切掉的样本循环覆盖全部样本。归一化参数只从训练部分统计验证部分用同一套参数变换模拟真实预测时的信息流。参数说明hidden_layer_sizes(4,)对应2-4-1结构的4个隐含节点learning_rate_init0.5对应论文的学习速率tol0.01对应目标误差达到后提前终止训练。从那以后我每次复现BP类模型都强制走这两步先按工作区间分段看误差分布再做留一交叉验证最后才敢把模型交到值班员手里用。分段误差能暴露模型的短板交叉验证能挤出过拟合的水分两个动作加起来不过十分钟的代码量但能挡住大部分训练集好看、现场打脸的情况。希望帮到你。本文还有配套的精品资源点击获取