You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何抬升凝结高度(LCL)处的混合比与初始状态不一致?

问题

作为Metpy新手,我尝试计算温度25℃、气压950hPa、相对湿度70%的气块的抬升凝结高度(LCL):

  1. 先计算得到气块的混合比:
mr:      15.016493919350289 gram / kilogram
  1. 再计算出LCL参数:
pLCL:    871.9597894290378 hectopascal
TLCL:    17.786684840244334 degree_Celsius

但当从LCL开始计算各层参数时,用mixing_ratio_from_relative_humidity(相对湿度设为100%)计算的LCL处混合比为14.862703501798386 gram / kilogram,和初始混合比不一致。按原理,气块干绝热上升至LCL时混合比应保持不变,且LCL处相对湿度为100%,为何会出现这种差异?

相关代码及输出如下:

from metpy.calc import dewpoint_from_relative_humidity
from metpy.calc import equivalent_potential_temperature
from metpy.calc import mixing_ratio_from_relative_humidity
from metpy.calc import lcl
from metpy.calc import moist_lapse
from metpy.calc import saturation_equivalent_potential_temperature

from metpy.units import units

p = 950 * units.hPa
T = 25 * units.degC
rh = 70 * units.percent

print('p:\t', p)
print('T:\t', T)
print('RF:\t', rh)

dp = dewpoint_from_relative_humidity(T, rh)

mr = mixing_ratio_from_relative_humidity(p, T, rh).to('g/kg')
print('mr:\t', mr)

ept = equivalent_potential_temperature(p, T, dp)
print('Θe :\t', ept.to(units.degC))

mylcl = lcl(p, T, dp)

plcl = mylcl[0]
tlcl = mylcl[1]
print('pLCL:\t', plcl)
print('TLCL:\t', tlcl)

plevs = [plcl.magnitude, 800, 700, 600, 500, 400, 300, 200, 100, 50, 25] * units.hPa

ml = moist_lapse(plevs, tlcl).to('degC')

print()
print('Moist adiabatic lift, starting from LCL')
print()
rh100 = 100 * units.percent
for idx in range(len(plevs)):
    p = plevs[idx]
    T = ml[idx]
    print('-------------------------------------------------------------')
    print('p:\t', p)
    print('T(p):\t', T)
    ept = saturation_equivalent_potential_temperature(plevs[idx], ml[idx])
    print('Θe(p):\t', ept.to(units.degC))
    mr = mixing_ratio_from_relative_humidity(p, T, rh100)
    print('mr:\t', mr.to('g/kg'))

输出:

p:       950 hectopascal
T:       25 degree_Celsius
RF:      70 percent
mr:      15.016493919350289 gram / kilogram
Θe :     73.59933073452271 degree_Celsius
pLCL:    871.9597894290378 hectopascal
TLCL:    17.786684840244334 degree_Celsius

Moist adiabatic lift, starting from LCL

-------------------------------------------------------------
p:       871.9597894290378 hectopascal
T(p):    17.786684840244334 degree_Celsius
Θe(p):   73.56266438016314 degree_Celsius
mr:      14.862703501798386 gram / kilogram <--- 差异点
-------------------------------------------------------------
# 后续输出省略
原因分析

这个差异来自数值计算的精度限制:

  • Metpy的lcl函数采用迭代法求解气块干绝热上升至饱和(即温度等于露点温度)的高度,迭代过程有终止精度阈值,导致返回的pLCL和TLCL是近似解,而非理论上的精确值。
  • 用这个近似的pLCL和TLCL计算饱和混合比(即rh=100%时的混合比),就会和初始气块的混合比产生微小偏差——理论上LCL处的饱和混合比应严格等于初始混合比,但迭代的近似性打破了这个严格相等的关系。
解决方法

有两种简单的修正方式:

  1. 直接复用初始混合比:气块干绝热上升过程中混合比守恒,LCL处的混合比就是初始计算得到的15.01649... g/kg,不需要重新计算。
  2. 用初始混合比反推精确的LCL温度:如果需要严格保证LCL处饱和混合比等于初始值,可以用saturation_mixing_ratio函数,结合LCL的气压,反解出对应的温度,替代lcl函数返回的TLCL。

示例代码片段(修正LCL处混合比的输出):

# 在循环中判断是否是LCL层
for idx in range(len(plevs)):
    p = plevs[idx]
    T = ml[idx]
    print('-------------------------------------------------------------')
    print('p:\t', p)
    print('T(p):\t', T)
    ept = saturation_equivalent_potential_temperature(plevs[idx], ml[idx])
    print('Θe(p):\t', ept.to(units.degC))
    # 针对LCL层,直接使用初始混合比
    if idx == 0:
        print('mr:\t', mr)
    else:
        mr_current = mixing_ratio_from_relative_humidity(p, T, rh100)
        print('mr:\t', mr_current.to('g/kg'))

内容的提问来源于stack exchange,提问作者MichaelW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:13:10