第二章 气象数据驱动:三大核心模型实战

各位同学,今天咱们来啃一块硬骨头——气象数据驱动模型。说实话,我刚入行那会儿,觉得这些公式就是一堆纸老虎。直到有一次,我帮一个农场做灌溉决策系统,结果因为太阳辐射算偏了10%,整个方案全废了。嗯,从那以后,我再也不敢小看这些“老古董”公式了。

这一章,我带你手撕三个核心模型:太阳辐射、温度、降水。它们就像作物模型的“三驾马车”,缺一个都不行。

2.1 太阳辐射模型:Angstrom-Prescott 公式

太阳辐射是作物生长的能量来源。但问题来了——大部分气象站只测日照时数,不直接测辐射。怎么办?Angstrom-Prescott 公式就是干这个的。

核心公式:

Rs = (a + b * n/N) * Ra

其中:

  • Rs:实际太阳辐射(MJ/m²/day)
  • Ra:天文辐射(理论最大值)
  • n:实际日照时数(小时)
  • N:可照时数(昼长)
  • a, b:经验系数(通常 a=0.25, b=0.50)

说白了,这个公式就是在问:“今天太阳实际露脸的时间,占理论能露脸时间的比例是多少?”然后乘上天文辐射,再调个系数。

我个人习惯把 a、b 系数叫做“地方性格参数”。为什么?因为不同地区的大气透明度不一样。我在新疆做项目时,a 值得调到 0.30,因为空气干燥、云少;但在成都,a 值得降到 0.20,你想想看,那雾霾天...

避坑指南:我曾经在东北某项目里直接用 FAO 默认的 a=0.25, b=0.50,结果辐射值偏高 15%。后来一查,当地春季风沙大,大气浑浊度偏高。所以——能用本地率定系数就别用默认值。

天文辐射 Ra 的计算

Ra 的计算稍微复杂点,但别怕,有公式模板:

# Python 示例:计算天文辐射 Ra
import math

def calc_Ra(lat, doy):
    # lat: 纬度(弧度), doy: 年积日
    Gsc = 0.0820  # 太阳常数 MJ/m²/min
    dr = 1 + 0.033 * math.cos(2*math.pi*doy/365)
    delta = 0.409 * math.sin(2*math.pi*doy/365 - 1.39)
    ws = math.acos(-math.tan(lat) * math.tan(delta))
    Ra = (24*60/math.pi) * Gsc * dr * (
        ws * math.sin(lat) * math.sin(delta) +
        math.cos(lat) * math.cos(delta) * math.sin(ws)
    )
    return Ra

这段代码我用了不下百次。注意那个 ws——日落时角,如果算出来是 NaN,八成是纬度太高,极昼/极夜情况没处理。

2.2 温度模型:积温与有效积温

温度对作物的影响,说白了就是“攒够热量才能发育”。积温模型就是用来算这个“热量账单”的。

概念 定义 公式
活动积温 高于生长下限温度的总和 GDD = Σ(T_mean - T_base)
有效积温 高于下限且低于上限的净积温 GDD = Σ(max(min(T_max, T_upper), T_base) - T_base)
生理积温 考虑三基点温度的精细模型 分段线性或非线性函数

这里有个坑——有效积温的上限截断。我曾经在模拟水稻时,没设上限温度,结果高温天积温爆表,模型预测水稻 20 天就成熟了。现实呢?高温热害,颗粒无收。

注意:不同作物的三基点温度完全不同。小麦的 T_base 一般是 0°C,水稻是 10°C,玉米是 8°C。搞错了,整个生育期模拟就全歪了。

积温计算的工程实现

def calc_GDD(T_max, T_min, T_base=10, T_upper=35):
    T_mean = (T_max + T_min) / 2.0
    # 有效积温:截断上下限
    T_eff = max(min(T_mean, T_upper), T_base)
    return T_eff - T_base

# 逐日累加
gdd_cum = 0
for day in weather_data:
    gdd_cum += calc_GDD(day['tmax'], day['tmin'])

你看,代码就这么几行。但实际项目中,我建议你加上一个判断——如果 T_mean 低于 T_base,当天积温直接记 0,而不是负值。有些新手会算出负积温,然后累加出负数,那作物就“逆生长”了。

2.3 降水模型:Penman-Monteith 蒸散量计算

说到降水,很多人第一反应是“下了多少雨”。但作物模型更关心的是——水到底蒸发了多少?这就是蒸散量(ET₀)的用武之地。

Penman-Monteith 公式是 FAO 推荐的“黄金标准”。它把能量平衡和空气动力学结合到一起,说白了就是:

ET₀ = (0.408 * Δ * (Rn - G) + γ * (900/(T+273)) * u₂ * (eₛ - eₐ))
       / (Δ + γ * (1 + 0.34 * u₂))

看着吓人?我拆开给你看:

  • 分子第一部分:辐射项——太阳给的能量
  • 分子第二部分:空气动力学项——风把水汽吹走
  • 分母:综合阻抗项

我个人习惯把 ET₀ 叫做“大气蒸发需求”。它告诉你:如果地表有充足的水分,大气一天能抽走多少水。实际作物蒸散量 ETc 还要乘上作物系数 Kc。

实战经验:我在宁夏做灌溉系统时,发现 ET₀ 算出来 8mm/天,但实际滴灌只浇了 5mm。为什么?因为作物系数 Kc 只有 0.6。所以——别直接用 ET₀ 指导灌溉,一定要乘 Kc。

关键参数计算

参数 含义 计算要点
Δ 饱和水汽压曲线斜率 由气温计算,温度越高 Δ 越大
Rn 净辐射 由太阳辐射 Rs 减去反射和长波辐射
G 土壤热通量 逐日计算可忽略,取 0
u₂ 2米高处风速 若测的是 10 米风速,需对数转换
eₛ - eₐ 饱和水汽压差 VPD 由温湿度计算,VPD 越大蒸发越强

这里有个容易翻车的地方——风速高度转换。我曾经直接用气象站的 10 米风速代入公式,结果 ET₀ 偏大 20%。后来才想起要转成 2 米风速:

u₂ = u_z * (4.87 / math.log(67.8*z - 5.42))

其中 z 是风速仪安装高度(米)。这个公式我建议你直接写进工具函数里,别每次都手算。

2.4 三大模型的协同工作

这三个模型不是孤立的。太阳辐射影响温度,温度影响 VPD,VPD 影响蒸散。它们之间有一条隐形的链条。

下面这张图,是我自己项目里常用的数据流架构:

气象数据驱动模型协同流程图 气象数据驱动模型协同流程图 原始气象数据 Angstrom-Prescott 太阳辐射模型 积温/有效积温 温度模型 Penman-Monteith 蒸散量模型 Rs 太阳辐射 GDD 积温 ET₀ 参考蒸散 协同融合层 辐射→温度→VPD→蒸散 联动计算 作物生长模拟引擎 说明:三个模型独立计算中间变量,在协同层完成交叉校验和物理一致性检查

你看,数据流很清晰。原始气象数据分三路进入模型,算出 Rs、GDD、ET₀ 三个中间变量,然后在协同层做交叉校验。比如,如果 Rs 很高但 ET₀ 很低,那八成是湿度数据有问题。

工程建议:我在实际系统中,会在协同层加一个“物理一致性检查”:

  • Rs 不能超过 Ra(天文辐射上限)
  • GDD 不能为负
  • ET₀ 不能超过 15 mm/day(极端干旱区除外)

超出这些范围的数据,直接标记为“可疑”,不参与后续模拟。