数值天气预报基础:NWP原理简介、常用NWP数据源与预处理

大家好,我是老张。今天咱们聊聊数值天气预报——也就是NWP。这玩意儿说白了,就是风电预测的“粮食”。没有它,后面那些花里胡哨的模型全是空中楼阁。

我刚开始做风电预测那会儿,总觉得NWP数据就是“天气预报嘛,拿来用就行了”。结果呢?模型跑出来一塌糊涂。后来才明白,不懂NWP的原理和坑,预测精度根本提不上去。今天我就把这些年踩过的坑、总结的经验,一次性讲清楚。

NWP原理简介:大气是怎么“算”出来的?

数值天气预报,本质上就是解方程。把大气分成一个个小格子,然后用物理方程描述每个格子里空气的运动、温度变化、水汽凝结……说白了,就是“把大气装进计算机里跑”。

嗯,这里要注意:NWP不是“猜”天气,而是“算”天气。它基于三个核心方程:

  • 运动方程:描述空气怎么流动(牛顿第二定律的变体)
  • 热力学方程:描述温度怎么变化
  • 连续方程:描述空气质量怎么守恒

你想想看,全球大气有多少个格子?ECMWF的HRES分辨率是9公里,全球大概有……嗯,几千万个格子。每个格子每几分钟就要算一次,这计算量,啧啧。

核心要点:NWP不是“预报”,而是“模拟”。它用当前观测数据作为初始条件,通过物理方程推演未来状态。初始条件越准,预报越准。

我在项目中遇到过最头疼的问题:初始场误差。有一次用GFS数据做72小时预报,结果第三天风场完全偏离实际。后来排查发现,是初始场里一个低压系统的位置偏了50公里。你看,差之毫厘,谬以千里。

常用NWP数据源:ECMWF、GFS、CMA-MESO

市面上NWP数据源不少,但做风电预测,常用的就这三个。我一个个说。

ECMWF(欧洲中期天气预报中心)

圈内公认的“老大哥”。分辨率高、预报准,但……贵。我习惯用它的HRES产品,9公里分辨率,全球覆盖。做风电场的短期预测(0-3天),ECMWF基本是首选。

  • 优势:全球顶级,尤其是中纬度地区的风场预报
  • 劣势:收费,而且不便宜。个人用户基本别想了
  • 我的用法:做72小时以内的主模型输入

小技巧:ECMWF的开放数据(ERA5)虽然免费,但那是再分析数据,不是实时预报。别搞混了。

GFS(全球预报系统)

美国国家气象中心的产物。免费、全球覆盖、更新频率高(每6小时一次)。精度嘛……比ECMWF差一截,但胜在不要钱。

  • 优势:完全免费,数据量大,适合做ensemble
  • 劣势:分辨率偏低(13公里),中纬度地区误差较大
  • 我的用法:做对比模型,或者ECMWF数据拿不到时的备选

我曾经用GFS做过一个月的对比实验,发现它在台风路径预报上比ECMWF差不少。但日常风况,凑合能用。

CMA-MESO(中国气象局中尺度模式)

国内做风电预测,这个必须提。CMA-MESO是中国气象局自主研发的中尺度模式,分辨率3公里,覆盖中国区域。精度嘛……在东亚地区,有时候比ECMWF还准。

  • 优势:中国区域高分辨率,更新快(每3小时一次)
  • 劣势:只覆盖中国及周边,全球其他区域没有
  • 我的用法:做中国区域风电场的核心输入

避坑指南:我曾经用CMA-MESO数据做新疆某风电场的预测,发现冬季数据经常缺失。后来才知道,CMA-MESO的积雪反照率参数化方案在高海拔地区有问题。嗯,这个坑我踩过。

这三个数据源怎么选?我个人的经验是:

场景 推荐数据源 理由
短期预测(0-3天) ECMWF + CMA-MESO 精度优先
中期预测(3-7天) GFS + ECMWF ensemble ensemble降低不确定性
中国区域 CMA-MESO 高分辨率,本地优化
预算有限 GFS 免费,够用

数据下载与预处理:从原始数据到可用特征

数据拿到手,不是直接就能用的。原始NWP数据是GRIB2格式,一堆二进制,看着就头大。我刚开始做的时候,光解析GRIB2就折腾了两天。

下面是我常用的流程:

  1. 下载:用wget或Python的requests库,从各数据源FTP/API拉取
  2. 解析:用cfgrib或pygrib把GRIB2转成xarray DataFrame
  3. 插值:把网格数据插值到风电场坐标点
  4. 特征提取:提取风速、风向、温度、气压、湿度等关键变量
  5. 质量控制:检查缺失值、异常值、时间对齐

这里给一段我常用的代码,解析GRIB2并提取风速:

import xarray as xr
import cfgrib

# 读取GRIB2文件
ds = xr.open_dataset('gfs_20240101_00.grib2', engine='cfgrib')

# 提取10米风速
u10 = ds['u10']  # 东向分量
v10 = ds['v10']  # 北向分量

# 计算风速大小
ws = (u10**2 + v10**2)**0.5

# 插值到风电场坐标(经度、纬度)
ws_interp = ws.interp(latitude=40.5, longitude=116.3)

print(ws_interp.values)

小技巧:GRIB2文件里风速是分量的(u、v),不是直接给风速大小。记得自己算。我见过有人直接用u分量当风速,结果模型跑出来全是负值……

预处理这一步,我踩过最大的坑是时间对齐。NWP数据的时间是UTC,风电场SCADA数据是本地时间。有一次我忘了做时区转换,结果模型用未来数据预测过去……嗯,效果当然“好”得离谱。

避坑指南:我曾经用GFS数据做某风电场预测,发现模型精度突然下降。排查了两天,发现是GFS更新了网格分辨率,从0.25度变成了0.13度。插值参数没改,导致坐标偏移。从那以后,我每次更新数据源都会先做一次可视化检查。

知识体系总览

说了这么多,我画了一张图,把NWP的核心逻辑串起来。你看一眼就明白了:

数值天气预报(NWP)知识体系 NWP数据源 物理方程 初始条件 数值求解:网格划分 → 时间积分 → 物理参数化 预报输出(GRIB2格式) 预处理:解析→插值→特征提取 风电预测模型输入

这张图把NWP的整个链条串起来了:从数据源、物理方程、初始条件,到数值求解,再到输出和预处理,最后成为风电预测模型的输入。每一步都有坑,每一步都值得花时间打磨。

好了,NWP的基础就聊到这儿。记住一句话:NWP数据是风电预测的“粮食”,粮食不好,再好的厨子也做不出好菜。下一章咱们聊聊怎么用这些数据做具体的预测模型。


专注资料整理