第1章:数值天气预报基础
各位同学,大家好。我是老张,在风能行业摸爬滚打了十几年。今天咱们开始聊一个绕不开的话题——数值天气预报,简称NWP。
说白了,NWP就是让计算机去算未来天气会怎么变。你可能会问,这跟风能预测有啥关系?关系大了去了。风功率预测,本质上就是先预测风,再算功率。而风的预测,全靠NWP撑着。
核心观点:没有好的NWP数据,风功率预测就是空中楼阁。我见过太多项目,算法模型搞得花里胡哨,结果输入数据质量不行,预测结果一塌糊涂。
1.1 NWP的基本原理
NWP的原理,其实不复杂。它把大气分成一个个网格,每个网格里记录温度、气压、湿度、风速风向这些物理量。然后,用一组偏微分方程——也就是大气运动方程——去推算下一时刻这些网格的状态。
嗯,这里要注意。这些方程没有解析解,只能靠数值方法去逼近。所以叫「数值」天气预报。
我个人习惯把NWP理解成「用数学模拟天气」。你想想看,地球那么大,我们把它切成小块,每个小块里算一算,最后拼起来就是全球的天气图。
一个小经验:网格越细,预报越准,但计算量也越大。我曾经在项目里试过把网格从10公里加密到3公里,计算时间翻了十几倍,但精度提升只有5%左右。所以,不是越细越好,要找到平衡点。
1.2 全球模型 vs 区域模型
NWP模型分两类:全球模型和区域模型。
全球模型,顾名思义,覆盖整个地球。它的网格比较粗,一般在10-50公里左右。优点是能提供全球范围的预报,缺点是局部细节不够。
区域模型,只覆盖某个区域,比如中国东部、欧洲西部。网格可以很细,1-5公里甚至更密。优点是局部精度高,缺点是需要全球模型提供边界条件。
我举个例子你就明白了。全球模型就像一张世界地图,你能看到大陆轮廓,但看不清你家门口那条路。区域模型就像城市地图,街道、小区都清清楚楚,但你看不到隔壁城市。
| 对比项 | 全球模型 | 区域模型 |
|---|---|---|
| 覆盖范围 | 全球 | 特定区域 |
| 网格分辨率 | 10-50 km | 1-10 km |
| 计算资源 | 极高 | 中等 |
| 局部精度 | 一般 | 较高 |
| 典型代表 | GFS, ECMWF | WRF, COSMO |
避坑指南:我曾经犯过一个错误——直接用全球模型的数据做风电场微观选址。结果发现,由于网格太粗,它根本捕捉不到山谷里的狭管效应。后来改用区域模型降尺度,才把问题解决。所以,做风能预测,区域模型几乎是必须的。
1.3 WRF模型简介
WRF,全称Weather Research and Forecasting,是目前最流行的区域模型之一。它是开源的,由美国国家大气研究中心(NCAR)主导开发。
为什么WRF在风能领域这么火?原因有三:
- 开源免费——你可以随便改代码,定制自己的参数化方案
- 社区活跃——遇到问题,网上搜一搜,基本都有答案
- 精度可控——通过嵌套网格,能把分辨率做到几百米
我自己的项目里,WRF用得最多。比如在内蒙古的一个风电场,我们用WRF做了3公里嵌套1公里的预报,效果比直接用GFS好了不止一个档次。
不过,WRF也有门槛。它需要Linux环境,需要编译,需要处理大量的输入数据。我第一次跑WRF的时候,光配置就折腾了两天。嗯,但一旦跑通了,后面就顺了。
WRF的核心流程:预处理(WPS)→ 主程序(WRF)→ 后处理(UPP/ARWpost)。WPS负责准备地形、土地利用、气象初始场等数据;WRF负责积分计算;后处理负责把结果转成我们需要的格式。
1.4 GFS/ECMWF数据获取
做NWP,首先得有初始场数据。全球模型的数据,就是我们的「原材料」。
GFS(Global Forecast System)是美国国家环境预报中心(NCEP)的产品。免费,分辨率约13公里,每天更新4次(00, 06, 12, 18 UTC)。
ECMWF(European Centre for Medium-Range Weather Forecasts)是欧洲的产品。分辨率更高(约9公里),但需要付费。不过,有些历史数据可以通过公开渠道获取。
我个人习惯:日常预报用GFS,因为免费、稳定。做研究或者高精度项目,会用ECMWF。毕竟,一分钱一分货。
数据获取的方式,主要有两种:
- 直接下载——通过NCEP或ECMWF的FTP/HTTP服务器
- API接口——比如CDS(Climate Data Store)的API,可以编程批量下载
下面是一个用Python下载GFS数据的示例:
import requests
import datetime
# 设置时间
now = datetime.datetime.utcnow()
date_str = now.strftime('%Y%m%d')
hour_str = '00' # 00, 06, 12, 18 UTC
# GFS数据URL示例
url = f'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t{hour_str}z.pgrb2.0p25.f000&dir=%2Fgfs.{date_str}%2F{hour_str}%2Fatmos'
# 下载
response = requests.get(url, stream=True)
with open(f'gfs_{date_str}_{hour_str}.grib2', 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
f.write(chunk)
print('下载完成')
小技巧:GFS数据是GRIB2格式,需要用专门的库(比如pygrib、cfgrib)来读取。我建议你提前装好这些库,不然数据下载下来也读不了。
1.5 预报误差分析
NWP不是完美的。误差永远存在。我们需要知道误差有多大,以及它怎么影响我们的预测。
常见的误差来源有:
- 初始场误差——观测数据本身就有误差,比如探空仪、卫星的测量偏差
- 模式误差——大气方程是近似的,参数化方案也不完美
- 地形误差——网格化之后,复杂地形被平滑了,比如山脊、峡谷
我做过一个统计:在平坦地形上,GFS的10米风速预报误差大约在1.5-2.5 m/s;在复杂地形上,这个误差会翻倍,达到3-5 m/s。你想想看,如果风速是8 m/s,误差3 m/s,那功率预测的偏差就大了去了。
所以,做风功率预测,一定要做误差修正。常用的方法有:
- MOS(Model Output Statistics)——用历史数据建立统计关系,修正模式输出
- 卡尔曼滤波——实时更新误差,动态修正
- 机器学习——用神经网络、随机森林等模型,学习误差模式
重要提醒:不要以为有了NWP数据就万事大吉。我见过有人直接把GFS的风速输入到功率曲线里,结果预测误差大得离谱。记住,NWP只是起点,不是终点。误差分析和修正,才是真正体现功力的地方。
知识体系总览
下面这张图,是我自己画的NWP知识体系框架。你可以把它当作本章的「地图」:
这张图把NWP的核心内容串起来了。从基本原理出发,到模型分类、数据获取,再到误差分析和修正,最后指向风功率预测。你学完这一章,应该能对着这张图,把整个流程讲清楚。
好了,这一章就到这里。记住,NWP是风能预测的基石。打好这个基础,后面的路就好走了。
公众号:蓝海资料掘金营,微信deep3321