ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

风电功率预测:Jensen尾流修正与RBF-BP神经网络实战

风电功率预测:Jensen尾流修正与RBF-BP神经网络实战 简介这份PDF文献面向风电功率预测方向的研究生、电力系统调度人员及机器学习爱好者聚焦如何提升短期风电输出功率的预测精度。全文以RBF-BP组合神经网络为核心先考虑风机尾流与地势对风速的影响借助Jensen与Lissaman尾流模型重新计算风速并做预处理再建立组合网络预测模型通过历史数据仿真验证其有效性。资源包共1个PDF文件约362KB内容为完整期刊论文含摘要、尾流建模公式推导、遮挡面积计算与仿真分析等章节便于读者系统理解组合神经网络的建模思路与数据处理流程。目前已有147人学习下载适合希望将神经网络、深度学习与数据建模方法应用于新能源功率预测的读者参考也可作为相关课题的文献素材与算法复现起点。1. 风电功率预测为什么要在神经网络前面加一道尾流修正很多做短期风电功率预测的团队第一反应是直接拿 SCADA 里的风速、功率序列喂给 BP 网络跑出来的相对误差常年在 10% 以上换网络结构、调学习率、加 LSTM 都收效有限。问题往往不在网络本身而在输入量——风电场记录的自然风速和每台风机叶轮实际捕获的风速根本不是一回事。上游风机抽走动能后下游风机处在尾流区来流速度被削减再加上风机分布在山地不同海拔风速随高度按幂律变化整个风场的风速场是非均匀的。这篇 2014 年发表在《可再生能源》上的研究思路就是把物理修正放在数据建模之前先用 Jensen 尾流模型叠加 Lissaman 地势模型算出每台风机受尾流和地势影响后的实际风速再对全场求平均替代原始自然风速作为输入同时用在线运行风机台数对输出功率做归算。做完这一步再上 RBF-BP 组合神经网络。仿真结果显示考虑尾流后均方根误差下降约 24%平均绝对误差下降约 15%。这套「物理预处理 组合神经网络」的流程对今天做风电、光伏功率预测的人依然有参考价值尤其是那些数据质量一般、机组分布不均的场站。2. Jensen 与 Lissaman 尾流模型的风速修正实现2.1 平坦地势下的 Jensen 尾流衰减Jensen 模型是尾流计算里最经典也最好落地的一个。它假设尾流区是一个线性扩张的圆锥下游距离 x 处的尾流半径随距离线性增长。设上游自然风速为 V0叶轮半径为 R两台风机间距为 x则下游风机位置受尾流影响的风速 V1 为V1 V0 · [1 - (1 - √(1 - CT)) · (R / (R kx))²]其中 CT 是风机推力系数k 是尾流下降系数。k 的取值有讲究当风机接收到的是自然风时取 0.04否则取 0.08。这个细节在原文里明确写了很多人抄公式时忽略导致尾流衰减算得偏小。用 Python 把这段算清楚方便后面接进数据预处理管线import numpy as np def jensen_wake(v0, ct, R, x, k0.04): Jensen 尾流模型计算下游风机处的风速 v0: 上游自然风速 (m/s) ct: 风机推力系数典型值 0.8 左右 R : 叶轮半径 (m) x : 两台风机间距 (m) k : 尾流下降系数自然风 0.04否则 0.08 返回下游风机处风速 (m/s) # 尾流圆锥在 x 处的投影半径 r_x R k * x # 速度亏损系数 deficit (1 - np.sqrt(1 - ct)) * (R / r_x) ** 2 v1 v0 * (1 - deficit) return v1 # 示例V010m/s, CT0.8, R40m, 间距 200m v_down jensen_wake(10.0, 0.8, 40.0, 200.0, k0.04) print(f下游风机处风速: {v_down:.3f} m/s)这段代码的核心是deficit那一行它把推力系数和距离衰减耦合在一起。CT 越大尾流亏损越严重x 越大r_x 越大亏损被稀释。实际工程里 CT 不是常数随风速变化常见做法是从风机功率曲线反查或取 0.7~0.9 的均值。如果场站有每台机组的实时 CT用实时值会更准。2.2 Lissaman 模型处理山地高差风电场不可能全是平地。部分风机装在山脊上部分在低处来流经过不同海拔时风速本身就不同。Lissaman 模型的做法是先按幂律把风速从一台风机的高度换算到另一台风机的高度再叠加 Jensen 尾流衰减。假设前排风机海拔为基准 0后排风机相对海拔为 H塔筒高度为 h风速随高度变化系数 α 一般取 1/7。当前排未安装风机时后排高度处的自由风速 V0 为V0 V0 · ((h H) / h)^α当前排安装风机后再乘上 Jensen 的尾流亏损项。把两个模型串起来就得到综合尾流模型def lissaman_jensen(v0, ct, R, x, H, h, alpha1/7, k0.04): Lissaman Jensen 综合模型 H: 后排风机相对前排的海拔高差 (m) h: 塔筒高度 (m) alpha: 风速随高度变化系数一般 1/7 # 第一步幂律换算自由风速 v_free v0 * ((h H) / h) ** alpha # 第二步叠加 Jensen 尾流 r_x R k * x deficit (1 - np.sqrt(1 - ct)) * (R / r_x) ** 2 v_wake v_free * (1 - deficit) return v_wake参数说明H 为正表示后排更高风速被幂律放大H 为负表示后排更低风速被削弱。α 取 1/7 是中性大气层结下的常用值如果场站有测风塔分层数据可以拟合出更贴合本地的 α。这一步做完每台风机都有一个修正后的风速再对全场求平均就得到替代原始记录的风速序列。2.3 遮挡面积与在线台数归算实际风场里风机不是一条直线排列风向和两台风机连线有夹角时尾流投影圆和下游风轮圆只部分重叠。原文按重叠程度分了完全遮挡、准完全遮挡、部分遮挡、无遮挡四种情况部分遮挡时重叠面积 A 用两个圆相交的几何公式算def overlap_area(r_x, R, d): 计算尾流投影圆与下游风轮圆的重叠面积 r_x: 尾流在 x 处的投影半径 R : 下游风轮半径 d : 两圆心间距d x * sin(alpha) if d r_x R: return 0.0 # 无遮挡 if d abs(r_x - R): return np.pi * min(r_x, R) ** 2 # 完全遮挡 # 部分遮挡两圆相交面积 part1 r_x**2 * np.arccos((d**2 r_x**2 - R**2) / (2 * d * r_x)) part2 R**2 * np.arccos((d**2 R**2 - r_x**2) / (2 * d * R)) part3 0.5 * np.sqrt((-d r_x R) * (d r_x - R) * (d - r_x R) * (d r_x R)) return part1 part2 - part3得到重叠面积后下游风速按面积比做加权修正。另一个容易被忽略的点是风场不可能所有风机同时运行。原文提出用在线运行风机台数 n 对输出功率做归算把实际功率 P 折算成全场满发时的功率 P P · n0 / n预测完再反向折算回去。这一步在数据预处理阶段完成能显著降低因机组停机造成的功率跳变对训练的干扰。参数含义典型取值影响CT推力系数0.7~0.9越大尾流亏损越重k尾流下降系数自然风 0.04否则 0.08越大尾流恢复越快α风速高度变化系数1/7越大高差影响越明显R叶轮半径按机型决定尾流圆锥初始尺寸n / n0在线台数 / 总台数实时统计用于功率归算3. RBF-BP 组合神经网络的结构与训练流程3.1 双隐含层为什么比单用 RBF 或 BP 更稳单独用 RBF 网络做短期风电功率预测原文引用的文献里误差约 12%。RBF 的优点是局部逼近能力强、训练快但它对非标准样本的泛化能力偏弱遇到天气突变容易跑偏。BP 网络全局逼近能力好但容易陷局部极小训练慢对初始权值敏感。把两者串成一个双隐含层前馈网络第一隐含层用径向基核函数提取特征第二隐含层用 Sigmoid 型函数做非线性映射输出层线性输出等于让 RBF 先做一次特征空间变换再交给 BP 子网去拟合泛化性能明显改善。网络结构可以这样理解输入层接收风速、风向、温度、压强四个量第一个隐含层是 RBF 子网节点数按 Kolmogorov 定理和其他因素取 12第二个隐含层是 BP 子网节点数取 6输出层一个节点就是预测功率。传递函数第一层用高斯核第二层用正切 S 型输出层线性。3.2 前向传播与权值更新RBF 子网隐含层的高斯核函数φ(j) exp( -∑(x_i - c_ij)² / (2σ²) )其中 c_ij 是第 j 个 RBF 节点的中心σ 是宽度参数。BP 子网隐含层的 Sigmoid 函数F(y) 1 / (1 e^(-y))输出层第 m 个节点的值 y(m) 由第二隐含层输出加权求和得到。误差平方和 SSE 为SSE ∑ [r(m) - y(m)]²权值和阈值按误差向量 ERR 和学习率 α 调整W(m) W(m) α · ERR(m) · y(m)当 SSE 小于等于目标误差时收敛。用 MATLAB 搭这套结构比较顺手原文也是 MATLAB 仿真。核心代码骨架% 输入风速、风向、温度、压强输出功率 % 数据归一化到 [0,1] [Pn, ps] mapminmax(P, 0, 1); [Xn, xs] mapminmax(X, 0, 1); % 构建 RBF-BP 组合网络 % 第一隐含层 RBF12 节点第二隐含层 BP6 节点 net newff(Xn, Pn, [12, 6], {radbas, tansig, purelin}, traingdx); % 训练参数 net.trainParam.epochs 2000; % 最大迭代次数 net.trainParam.goal 1e-4; % 目标误差 net.trainParam.lr 0.05; % 学习率 net.trainParam.showWindow false; % 训练 [net, tr] train(net, Xn, Pn); % 预测并反归一化 Pn_pred sim(net, Xn_test); P_pred mapminmax(reverse, Pn_pred, ps);逻辑说明newff的第三个参数[12, 6]就是两个隐含层的节点数第四个参数依次对应第一隐含层径向基、第二隐含层正切 S、输出层线性。traingdx是带动量的梯度下降比纯traingd收敛稳。学习率 0.05 是原文量级实际调参时如果 SSE 震荡就降到 0.01收敛太慢就升到 0.1。目标误差 1e-4 对应归一化后的量纲别直接拿 MW 去设。3.3 训练样本组织与在线台数修正原文用某 200 MW 风电场 2013 年 6 月的数据取 15 天做训练预测 24 小时后功率。数据记录间隔 15 分钟每天 96 个点。输入量选风速、风向、温度、压强输出量是功率。这里有两个工程细节值得抄一是风向要做正余弦分解不能直接拿 0~360 度当数值输入否则 359 度和 1 度在网络看来差很远实际几乎同向二是功率归算要在归一化之前做先按 P P · n0 / n 折算再和输入量一起归一化。import numpy as np def preprocess_power(P, n, n0): 按在线台数归算功率 return P * n0 / n def wind_dir_encode(direction_deg): 风向正余弦分解避免角度跳变 rad np.deg2rad(direction_deg) return np.sin(rad), np.cos(rad)归算后的功率 P 参与训练预测出结果后再乘 n / n0 还原成实际功率。这一步在机组频繁启停的场站效果尤其明显能避免网络把停机造成的功率骤降学成「正常模式」。4. 误差评价、参数调优与常见踩坑4.1 四个误差指标怎么算、怎么看原文用了相对误差 A、平均绝对误差 MAE、均方误差 MSE、均方根误差 RMSE 四个指标。公式不复杂但要注意分母和量纲import numpy as np def evaluate(y_pred, y_true): y_pred, y_true 均为实际功率量纲 (MW) n len(y_true) A np.mean(np.abs(y_pred - y_true) / (np.abs(y_true) 1e-6)) * 100 # 相对误差 % MAE np.mean(np.abs(y_pred - y_true)) MSE np.mean((y_pred - y_true) ** 2) RMSE np.sqrt(MSE) return A, MAE, MSE, RMSE相对误差里分母加 1e-6 是防止实际功率为 0 时除零风电夜间停机时功率确实可能为 0。原文不考虑尾流时 RBF-BP 的相对误差 6.72%、MAE 4.66 MW、MSE 42.50 MW²、RMSE 6.52 MW考虑尾流后相对误差 6.12%、MAE 3.96 MW、MSE 24.19 MW²、RMSE 4.92 MW。对比 BP 网络RBF-BP 的相对误差提升了约 2 个百分点。看指标时别只盯相对误差MSE 对大幅偏差敏感RMSE 和功率同量纲汇报给调度部门时 RMSE 更直观。4.2 参数调优的实操顺序调参别一上来就网格搜索按影响从大到小来顺序参数调整方向观察指标1隐含层节点数12/6 起步±4 试RMSE2学习率0.05 起步0.01~0.1SSE 收敛曲线3目标误差1e-4 起步是否过拟合4训练样本天数15 天起步验证集误差5尾流系数 k、α按场站拟合MAE节点数先定因为结构错了调学习率没意义。学习率看 SSE 曲线震荡就降平缓不降就升。目标误差设太小会过拟合训练集误差很低但验证集 RMSE 反而上升这时候把 goal 放宽到 1e-3 往往更好。训练天数不是越多越好风电有季节性拿 15 天夏天数据预测冬天误差必然大常见做法是按季节分别建模或加入月份作为输入。4.3 几个高频踩坑第一个坑是尾流系数 k 用错。自然风和尾流风要分别取 0.04 和 0.08很多人全程用 0.04导致下游风速算高了功率预测偏大。第二个坑是风向没做正余弦分解直接当连续数值输入网络学不到方向信息。第三个坑是功率归算顺序搞反先归一化再归算量纲对不上。第四个坑是忽略机组工况原文结尾也提到风电机组工况信息接入和完备的历史运行数据对预测精度影响很大如果 SCADA 里大量缺失值直接填 0网络会把 0 当成真实功率学进去。提示尾流修正不是万能的。原文也指出天气突变时统计模型无法准确预测误差会突然放大。尾流修正解决的是场站内部风速分布不均的问题解决不了来流本身突变的问题。5. 把尾流修正接进预测管线的工程技巧真正要把这套方法用起来关键不是复现论文里的 MATLAB 脚本而是把尾流修正做成一个可复用的预处理模块接在数据采集和模型训练之间。我一般会把它拆成三步第一步从 SCADA 拉每台机组的实时风速、风向、功率、在线状态第二步按风向和机组坐标算出每台机组的上游遮挡关系用 Jensen Lissaman 算修正风速第三步全场求平均按在线台数归算功率输出成训练用的特征表。机组坐标和推力系数是这套流程的输入很多场站的历史台账里坐标不全这时候可以用机组间距的统计均值先顶上等坐标补齐再重算。推力系数如果拿不到实时值按风速分段取经验值也比全程用常数强。下面这段是把修正风速和原始风速拼在一起做特征增强的思路import pandas as pd import numpy as np def build_features(scada_df, turbine_coords, ct_table): scada_df: 含 turbine_id, wind_speed, wind_dir, power, online 的明细表 turbine_coords: {turbine_id: (x, y, hub_height)} ct_table: 按风速分段的推力系数查找表 corrected [] for tid, grp in scada_df.groupby(turbine_id): v0 grp[wind_speed].values wd grp[wind_dir].values ct np.interp(v0, ct_table[v], ct_table[ct]) # 简化只对同风向上下游机组做尾流修正 v_corr jensen_wake(v0, ct, R40.0, x200.0, k0.04) corrected.append(pd.DataFrame({ turbine_id: tid, v_raw: v0, v_corrected: v_corr, power: grp[power].values, online: grp[online].values })) feat pd.concat(corrected, ignore_indexTrue) # 全场平均修正风速 原始风速同时保留让网络自己选 agg feat.groupby(level0).agg({ v_raw: mean, v_corrected: mean, power: sum, online: sum }) return agg这段代码的工程价值在于它把修正风速和原始风速都保留下来让网络在训练中自己决定信哪个。如果尾流修正做得好网络会自然给修正风速更高的权重如果某段时间修正反而引入噪声原始风速还能兜底。这比强行只喂修正风速要稳。验证修正是否有效有个简单办法拿修正前后的风速序列分别和全场输出功率做互相关看峰值相关系数有没有提升。如果修正后相关性反而下降多半是尾流系数或机组坐标有问题先回去查这两项别急着调网络。另一个技巧是把修正风速和原始风速的差值作为一个额外特征输入这个差值本身就携带了场站内部流场的信息对网络判断当前工况有帮助。本文还有配套的精品资源点击获取
返回列表