气象大数据

风电功率曲线的空气密度订正:被忽视的发电量偏差

· 南京运梦科技算法团队 · 评审 算法负责人

风电功率曲线的空气密度订正:被忽视的发电量偏差 封面

做风电资源评估或短期功率预测的人,迟早会被同一个隐蔽的系统偏差咬一口:明明风速预报得很准,把它代入厂家给的功率曲线,算出来的发电量却和实发对不上——尤其在内蒙古高原、云贵山区,或者夏季高温时段,偏差能稳定地往一个方向跑好几个百分点。罪魁祸首往往不是风速,而是空气密度。厂家功率曲线默认标注在 1.225 kg/m³ 的标准海平面密度下,可现实里的空气密度随海拔、气温、气压、湿度持续变化,从来不是这个值。这篇文章面向风电工程师,把空气密度对风功率的物理机理、IEC 标准里的两种订正方法,以及在运梦气象 API 上逐时订正功率曲线的落地路径讲清楚。

关键要点

  • 风功率密度正比于空气密度:风功率密度 $P = \frac{1}{2}\rho v^3$,密度 $\rho$ 进入一次项,密度偏 5% 发电量就偏约 5%——这是纯粹的系统偏差,不会像随机噪声那样在年累计里被抵消掉。
  • 标准 1.225 kg/m³ 几乎从不成立:海拔每升 1000 m 密度约降 10%,内蒙古高原(10001500 m)常年在 1.051.12 kg/m³;气温每升 10 ℃ 密度约降 3.5%,夏季正午相对冬夜可差 5% 以上。
  • IEC 61400-12 给了两条订正路径:定桨距失速机型按 $v_=v,(\rho/\rho_0)^{1/3}$ 做风速归一化;变桨变速(现代主流)机型按功率归一化 $P_=P,(\rho_0/\rho)$,两者机理不同不能混用。
  • 湿度有影响但通常是二阶量:湿空气比干空气轻(水汽摩尔质量小于干空气),高温高湿可让密度再降约 1%;常规工程可先用干空气近似,精细化场景再叠加水汽订正。
  • 历史与实时分工:训练/回测用 ERA5(运梦平台历史范围 1950 年至今,含逐时气温气压;ERA5 数据集本身可追溯到 1940 年),实时预报用德国气象局数据源,逐时计算 $\rho$ 后订正功率曲线,比固定密度假设直接收窄系统偏差。

一个被默认值掩盖的偏差

风能的本质是动能。穿过扫风面的气流,单位面积携带的功率为风功率密度 $P = \tfrac{1}{2}\rho v^3$,其中 $\rho$ 是空气密度、$v$ 是风速。风速以三次方进入,所以行业里所有人都盯着风速——外推、廓线、湍流订正,做得很细。可密度 $\rho$ 是一次项,它对发电量的影响是线性、单调、不抵消的:密度系统性偏高 5%,发电量估计就系统性偏高约 5%。风速误差有正有负、年累计里部分相互抵消;密度偏差却是一个常年偏向同一侧的乘子,长期下来积累的电量误差比很多人直觉里的大。

问题出在功率曲线的"出厂设定"。厂家在样本测试台或参考场地测得功率曲线,按 IEC 惯例归一化到标准空气密度 $\rho_0 = 1.225\ \text{kg/m}^3$(15 ℃、海平面、干空气)。这条曲线被原样写进设计文档、资源评估软件和功率预测模型,仿佛 1.225 是一个物理常数。但它只是一个参考态。真实场址的空气密度由理想气体状态方程决定:

$$\rho = \frac{p}{R_d,T}$$

其中 $p$ 是气压(Pa)、$T$ 是开尔文温度、$R_d = 287.05\ \text{J/(kg·K)}$ 是干空气比气体常数。把场址的真实气压和气温代进去,你会发现 1.225 这个数几乎从不成立。

海拔、温度、湿度:密度到底偏多少

海拔是最大的系统项。 气压随高度近指数衰减,海拔每升高约 1000 m,气压(进而密度)下降约 10%。一座 1200 m 海拔的内蒙古风场,年均密度通常落在 1.05~1.10 kg/m³,比 1.225 低了 10%~14%。如果直接套标准曲线,发电量会被系统性高估一成左右——这在投资测算阶段足以让一个边际项目的 IRR 由负转正,是危险的。

温度带来季节和昼夜的摆动。 在固定气压下,密度反比于绝对温度,气温每升高约 10 ℃,密度约下降 3.5%。北方风场冬季夜间气温可低到 −20 ℃、夏季正午可达 35 ℃,对应密度差超过 5%。这意味着即便在同一座风场、同一台机组,冬天和夏天"应有"的功率曲线是不一样的:冷而密的空气在相同风速下能榨出更多功率。用一条年均曲线,会同时高估夏季、低估冬季。

湿度通常是二阶量,但别完全忽略。 一个常见的直觉误区是"湿空气更重",其实相反——水汽的摩尔质量(约 18 g/mol)小于干空气(约 29 g/mol),相同温压下湿空气比干空气。湿空气密度可写成 $\rho = \frac{p_d}{R_d T} + \frac{p_v}{R_v T}$,把干空气分压 $p_d$ 与水汽分压 $p_v$ 分开计。常温常压下水汽订正量级约在 1% 以内,高温高湿(如东南沿海盛夏)可达约 1%~1.5%。工程上可先用干空气近似快速落地,对沿海、热带等高湿场址再叠加水汽订正提精度。

把三者放在一起:一座高原风场夏季正午的真实密度,相对标准值的偏差可以轻松超过 12%。这早已不是可以"抹平在误差棒里"的小量。

IEC 怎么订正:两类机型,两条公式

IEC 61400-12 系列标准(功率特性测量与基于机舱风速计的验证)给出了把功率曲线在不同空气密度间换算的规范方法,关键是要按机型的控制方式分两条路,不能一刀切。

定桨距失速(stall-regulated)机型——订正风速。 这类老式机型靠叶片失速被动限功率,气动响应直接跟着来流动能走。标准做法是把实测风速归一化到目标密度:

$$v_ = v\left(\frac{\rho}{\rho_0}\right)^{1/3}$$

三次方根来自 $P\propto\rho v^3$——把密度变化"折算"成等效风速,再去查标准密度下的曲线。

变桨变速(pitch-regulated, variable-speed)机型——订正功率。 现代主流机型在额定风速以下用变桨和变速维持最优叶尖速比、追踪最大功率系数,输出功率近似正比于密度。标准做法是直接对功率归一化:

$$P_ = P\left(\frac{\rho_0}{\rho}\right)$$

两条公式机理不同:一个动作在横轴(风速),一个动作在纵轴(功率)。对现代变速机组误用风速订正、或对老式失速机组误用功率订正,都会引入新的偏差。落地时务必先确认机型控制方式。还要注意,订正只在功率曲线的上升段有意义;机组到达额定功率后受额定功率限制(以及高风速段的限功率/切出逻辑),密度的影响被控制策略吸收,不应再线性外推。这一点在实现里很容易忽略,会把额定平台段也错误缩放。

它和限电、湍流订正的区别

空气密度订正常和别的几类订正混在一起,有必要划清边界。限电截顶是功率-风速散点图顶端的水平截断带,由电网调度造成,属于数据清洗范畴,要在拟合前剔除(这一点在 风机功率曲线机器学习建模与性能监控 里展开过)。湍流强度订正关心的是同一平均风速下能量分布的离散,影响功率曲线在拐点附近的形状。风切变 / 转子等效风速关心扫风面上风速廓线的不均匀(见 风切变与威布尔分布:轮毂高度风速外推实战)。

密度订正与这三者是正交的:它不改变风速测量、不改变扫风面廓线、不动数据清洗,只把"相同风速下空气携带多少能量"这件事算对。正因为正交,它可以独立叠加,也正因为独立,它最容易被整条流水线漏掉——风速、湍流、切变都订正了,唯独密度还在用 1.225。

落地:在运梦气象 API 上逐时订正

订正密度需要逐时的气温和气压,这正是气象数据要补上的环节。运梦气象 API 的 era5 数据源提供 tas(近地面气温)与 sp(地面气压)的逐时再分析序列,运梦平台对外提供的历史范围为 1950 年至今(ERA5 数据集本身可追溯到 1940 年),适合做资源评估和功率曲线回测的训练基准;实时预报口径用 ger(德国气象局)数据源,覆盖未来数天的逐时预报,字段口径与 ERA5 一致,订正逻辑一套代码两处复用。

下面用 downloadSync 拉取气温气压,逐时算出空气密度,再对一台变桨变速机组的功率做密度订正:

import os, requests
import numpy as np

API = "https://console.yun-meng.top/api/energy-weather/search/weather/action/downloadSync"
TOKEN = os.environ["YUNMENG_TOKEN"]

payload = {
    "dataSourceId": "era5",          # 历史回测用 era5;实时预报改 "ger"(德国气象局)
    "lat": 41.5, "lon": 111.2,        # 内蒙古高原某风场
    "stime": "2023-01-01 00:00",
    "etime": "2023-12-31 23:00",
    "timezone": "8",                  # 必填,东八区
    "fields": ["tas", "sp"],          # 近地面气温(℃) 与 地面气压(hPa)
}
r = requests.post(API, headers={"Authorization": f"Bearer {TOKEN}"},
                  json=payload, timeout=600)
r.raise_for_status()
result = r.json()
if not result.get("success"):
    raise RuntimeError(result.get("msg", "查询失败"))
data = result["data"]

Rd = 287.05                                   # 干空气比气体常数 J/(kg·K)
T = np.asarray(data["tas"], float) + 273.15   # ℃ → K
p = np.asarray(data["sp"],  float) * 100.0    # hPa → Pa
rho = p / (Rd * T)                            # 逐时空气密度 kg/m³

rho0 = 1.225                                   # 厂家曲线参考密度
print(f"年均密度={rho.mean():.3f} kg/m³(标准值 {rho0}),平均偏差={ (rho.mean()/rho0-1)*100:.1f}%")

# 变桨变速机型:功率订正 P_corr = P * (rho0/rho),仅作用于上升段
# P_measured 为同一时间戳下实测/预报功率(kW),P_rated 为额定功率
def correct_power(P_measured, P_rated):
    below_rated = P_measured < 0.99 * P_rated         # 额定平台段不缩放
    P_corr = np.where(below_rated, P_measured * (rho0 / rho), P_measured)
    return np.clip(P_corr, 0, P_rated)

如果是定桨距失速机型,则改为对风速做 $v_=v,(\rho/\rho_0)^{1/3}$,再去查标准密度下的功率曲线。对沿海、热带高湿场址,可额外取水汽相关字段,把干空气近似升级为湿空气密度,再榨出约 1% 的精度。

落地与小结

空气密度订正是风电链路里"投入产出比"极高的一环:它不需要测风塔、不需要额外硬件,只要一份逐时的气温气压序列和一条公式,就能把一个常年偏向同一侧、却长期被默认值掩盖的系统偏差扳正。对资源评估,它直接影响 P50/P90 的中枢;对短期功率预测,它能稳定削减偏差电量,对应"两个细则"考核里实打实的考核分。它和限电清洗、湍流、切变订正彼此正交,可以作为独立模块叠加进现有流水线,改动小、收益确定。

落到运梦气象 API 上,era5 负责历史回测的密度序列(运梦平台历史范围 1950 年至今的逐时气温气压,ERA5 数据集本身可追溯到 1940 年),ger(德国气象局)负责实时预报口径,同一套 $\rho = p/(R_d T)$ 逻辑两处复用——把"相同风速下空气到底带多少能量"这件被忽视的小事算对,往往就是精细化运营与粗放估算之间,那几个百分点的差距。