1、气象预测基础:大气运动基本方程、数值天气预报原理、气象数据来源与格式(GRIB/NetCDF)

各位同学好,我是老张。在风电行业摸爬滚打了十几年,今天咱们来聊聊气象预测这个老本行。说实话,刚入行那会儿我也觉得气象预测是气象局的事,跟咱们风电工程师关系不大。直到有一次,一个台风路径预测偏差了50公里,我们场站差点没来得及做偏航保护……嗯,从那以后我就明白了,搞风电不懂气象,那就是在裸奔。

1.1 大气运动基本方程

大气运动,说白了就是空气在三维空间里怎么跑。你想想看,风是怎么来的?就是空气从高压区往低压区跑。但事情没那么简单,地球还在自转,地面还有摩擦,太阳还在加热……这些因素搅在一起,就构成了大气运动的基本方程组。

我个人习惯把这组方程分成三块来理解:

  • 动量方程(纳维-斯托克斯方程):描述空气怎么加速、减速、拐弯。我在项目中遇到过,有些同事直接用简化版方程做短期预测,结果在复杂地形区域误差大得离谱。说白了,地形对气流的抬升和绕流效应,简化方程根本抓不住。
  • 连续方程:质量守恒。空气流进来多少,就得流出去多少,不然就会堆积或稀薄。这个方程看起来简单,但实际求解时对网格精度要求很高。
  • 热力学方程:太阳辐射、水汽相变(蒸发、凝结)带来的热量变化。为什么午后风速会增强?就是因为地面加热导致大气不稳定,上下层动量交换加剧了。

核心要点:这三个方程耦合在一起,加上状态方程(气压、温度、密度的关系),就构成了数值天气预报的物理基础。你不需要会手动解这些方程,但必须理解它们的物理含义——这决定了你对预测结果的信任程度。

1.2 数值天气预报原理

数值天气预报(NWP),说白了就是把大气运动方程放到计算机里跑。怎么跑?把空间切成网格,把时间切成步长,然后一步一步往前推。

我建议你记住这个流程:

  1. 初始化:把全球观测数据(气象站、探空仪、卫星、雷达)通过数据同化技术,融合成一个初始场。这一步很关键,初始场不准,后面跑得再漂亮也是白搭。
  2. 积分计算:用超级计算机求解方程组,算出未来每个时间步的气压、温度、风速、湿度。全球模型一般跑10-16天,区域模型跑3-5天。
  3. 后处理:把原始输出插值到我们需要的点位和高度上,再做一些统计订正。

这里有个坑,我曾经踩过:NWP模型的分辨率。全球模型(如ECMWF、GFS)的水平分辨率通常在9-25公里,这个尺度对于单个风电场来说太粗了。你想想看,一个风电场可能就横跨5公里,模型里就一两个网格点,怎么可能准确?所以必须做降尺度处理,或者用中尺度模型(如WRF)做区域模拟。

我的经验:做风电功率预测,不要直接拿全球模型的10米风速用。我习惯用模型输出的100米高度风速、边界层高度、稳定度参数,再结合场站实测数据做修正。这样准确率能提升15-20%。

1.3 气象数据来源与格式

搞风电预测,你得知道数据从哪来,长什么样。我整理了一张图,帮你理清这个知识体系:

气象预测知识体系 大气运动方程 数值天气预报 数据来源与格式 动量方程 连续方程 热力学方程 初始化 积分计算 后处理 ECMWF/GFS GRIB格式 NetCDF格式 风电应用中的关键点 • 理解物理方程:判断预测结果的合理性 • 掌握NWP流程:知道误差从哪来 • 熟悉数据格式:能自己处理GRIB/NetCDF • 结合实测数据:做本地化订正

1.4 数据来源

目前风电行业常用的气象数据来源,我列个表给你看:

数据源 机构 分辨率 更新频率 风电适用场景
ECMWF HRES 欧洲中期天气预报中心 9km / 137层 12小时 中期功率预测(3-10天)
GFS 美国国家环境预报中心 13km / 127层 6小时 短期预测、免费替代方案
ERA5 ECMWF再分析数据 31km / 137层 逐小时(历史) 风资源评估、场址选址
MERRA-2 NASA 50km / 72层 逐小时(历史) 长期风资源分析

注意:ERA5虽然是再分析数据(用历史观测修正过),准确度很高,但它是历史数据,不能用于实时预测。我见过有人拿ERA5当预报用,结果吃了大亏。实时预测请用ECMWF HRES或GFS的预报场。

1.5 GRIB与NetCDF格式

这两种格式,是气象数据的"通用语言"。你搞风电预测,必须得会读写它们。

GRIB(GRIdded Binary):世界气象组织(WMO)定义的标准格式。特点是压缩率高,一个全球9km分辨率的预报文件可能只有几百MB。但它的数据结构比较"古老",用起来不太直观。

NetCDF(Network Common Data Form):更现代、更灵活的自描述格式。变量名、单位、维度信息都写在文件里,用Python读取非常方便。我个人更偏爱NetCDF,尤其是在做数据分析时。

下面是我常用的Python读取代码,你直接拿去用:

# 读取GRIB文件(需要安装cfgrib和eccodes)
import xarray as xr

# 打开GRIB文件
ds = xr.open_dataset('ecmwf_20240101.grib', engine='cfgrib')
# 查看变量
print(ds.data_vars)
# 提取10米风速
u10 = ds['u10']  # 纬向风
v10 = ds['v10']  # 经向风
ws10 = (u10**2 + v10**2)**0.5  # 合成风速

# 读取NetCDF文件
ds_nc = xr.open_dataset('wrf_output.nc')
# 查看维度
print(ds_nc.dims)
# 提取100米风速
ws100 = ds_nc['wspd100']

避坑指南:我曾经在处理GRIB文件时,发现不同来源的GRIB文件参数名不一样。比如ECMWF的10米风速叫"10u"和"10v",而GFS的叫"UGRD_10m"和"VGRD_10m"。建议你每次拿到新数据,先用print(ds)看看变量列表,别想当然。

另外,处理NetCDF时要注意坐标顺序。有些文件是(time, lat, lon),有些是(time, lon, lat)。用xarray的话,建议用.sel()方法按坐标值选取,而不是按索引,这样不容易出错。

好了,这一章的内容就这些。气象预测基础是后面所有章节的根基,你把这些概念吃透了,后面学WRF模型、做功率预测都会轻松很多。有什么问题,咱们下节课接着聊。


公众号:蓝海资料掘金营,微信deep3321