主题050:大气辐射传输与温室效应

摘要

大气辐射传输是地球气候系统的核心过程,决定了地球的能量平衡和表面温度。本主题从辐射换热的基本原理出发,系统讲解大气辐射传输的物理机制,包括太阳短波辐射在大气中的散射和吸收、地球长波辐射的大气传输、温室气体的辐射特性及其对气候的影响。通过建立大气辐射传输模型,分析不同温室气体浓度变化对地球辐射平衡的影响,探讨全球变暖的物理机制。结合Python仿真程序,模拟一维大气辐射传输过程,计算辐射通量廓线和辐射强迫,预测气候变化趋势,为理解全球气候变化提供科学依据。

关键词: 大气辐射、温室效应、辐射传输、辐射平衡、气候变化、温室气体、辐射强迫


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 地球辐射平衡概述

1.1 地球能量平衡的基本概念

地球作为一个整体,其能量平衡决定了气候系统的基本状态。地球能量平衡方程可以表示为:

S0(1−α)⋅πRE2=4πRE2⋅σTE4S_0(1-\alpha) \cdot \pi R_E^2 = 4\pi R_E^2 \cdot \sigma T_E^4S0(1α)πRE2=4πRE2σTE4

其中:

  • S0=1361S_0 = 1361S0=1361 W/m²:太阳常数(大气层顶接收的太阳辐射通量)
  • α≈0.30\alpha \approx 0.30α0.30:地球行星反照率
  • RER_ERE:地球半径
  • σ=5.67×10−8\sigma = 5.67 \times 10^{-8}σ=5.67×108 W/m²·K⁴:斯蒂芬-玻尔兹曼常数
  • TET_ETE:地球有效辐射温度

简化后得到有效辐射温度:

TE=[S0(1−α)4σ]1/4T_E = \left[\frac{S_0(1-\alpha)}{4\sigma}\right]^{1/4}TE=[4σS0(1α)]1/4

代入数值计算:

TE=[1361×(1−0.30)4×5.67×10−8]1/4≈255 K≈−18°CT_E = \left[\frac{1361 \times (1-0.30)}{4 \times 5.67 \times 10^{-8}}\right]^{1/4} \approx 255 \text{ K} \approx -18°CTE=[4×5.67×1081361×(10.30)]1/4255 K18°C

这个温度远低于地球表面平均温度(约15°C),差值约33°C就是由温室效应造成的。温室气体吸收地表发射的长波辐射,并向各个方向再辐射,其中向下辐射的部分加热了地表和近地面大气。

1.2 大气层的辐射分层结构

大气层根据温度垂直分布可分为若干层次,每层对辐射传输的作用不同:

对流层(0-10-12 km):

  • 包含约75%的大气质量和大部分水汽
  • 温度随高度递减(约6.5°C/km)
  • 主要的天气现象发生在此层
  • 对长波辐射有强烈的吸收和发射作用

平流层(10-12 km至50 km):

  • 含有臭氧层(20-30 km高度)
  • 温度随高度递增(臭氧吸收紫外辐射)
  • 对紫外辐射有强烈的吸收作用
  • 水汽含量极低,对长波辐射相对透明

中间层(50-85 km):

  • 温度再次随高度递减
  • 大气密度很低,辐射传输以分子散射为主

热层(85 km以上):

  • 温度随高度急剧升高
  • 大气极其稀薄,辐射传输接近真空

1.3 太阳辐射与地球辐射的光谱特征

太阳辐射(短波辐射):

太阳辐射近似于温度为5778 K的黑体辐射,其光谱分布遵循普朗克定律:

Bλ(T)=2hc2λ51ehc/λkBT−1B_\lambda(T) = \frac{2hc^2}{\lambda^5} \frac{1}{e^{hc/\lambda k_B T} - 1}Bλ(T)=λ52hc2ehc/λkBT11

太阳辐射的主要特征:

  • 峰值波长:约0.5 μm(可见光范围,绿色光)
  • 波长范围:0.1-4 μm
  • 紫外辐射(<0.4 μm):约占7%
  • 可见光(0.4-0.7 μm):约占43%
  • 近红外(0.7-4 μm):约占50%

地球辐射(长波辐射):

地球表面温度约288 K,其辐射峰值波长约10 μm,位于红外波段:

λmax=2898 μm⋅KT≈10 μm\lambda_{max} = \frac{2898 \text{ μm·K}}{T} \approx 10 \text{ μm}λmax=T2898 μm⋅K10 μm

地球长波辐射的特征:

  • 波长范围:4-100 μm
  • 峰值波长:约10 μm
  • 主要处于大气窗口(8-13 μm)和水汽、CO₂吸收带

这种光谱分离(太阳辐射主要在短波,地球辐射主要在长波)是温室效应能够发生的前提条件。大气对短波辐射相对透明(吸收较少),但对长波辐射有强烈的吸收作用。


2. 大气辐射传输基础

2.1 辐射传输方程

辐射传输方程描述了辐射在介质中传播时的强度变化。对于平面平行大气(一维近似),辐射传输方程为:

μdIνdz=−kνρaIν+kνρaBν(T)\mu \frac{dI_\nu}{dz} = -k_\nu \rho_a I_\nu + k_\nu \rho_a B_\nu(T)μdzdIν=kνρaIν+kνρaBν(T)

或写成光学深度的形式:

μdIνdτν=−Iν+Bν(T)\mu \frac{dI_\nu}{d\tau_\nu} = -I_\nu + B_\nu(T)μdτνdIν=Iν+Bν(T)

其中:

  • IνI_\nuIν:频率为ν\nuν的辐射强度(W/m²·sr·Hz)
  • μ=cos⁡θ\mu = \cos\thetaμ=cosθ:天顶角的余弦
  • zzz:高度
  • kνk_\nukν:质量吸收系数(m²/kg)
  • ρa\rho_aρa:吸收气体密度(kg/m³)
  • Bν(T)B_\nu(T)Bν(T):普朗克函数
  • τν\tau_\nuτν:光学深度

光学深度定义为:

τν(z1,z2)=∫z1z2kνρadz\tau_\nu(z_1, z_2) = \int_{z_1}^{z_2} k_\nu \rho_a dzτν(z1,z2)=z1z2kνρadz

光学深度是衡量介质对辐射不透明程度的无量纲参数:

  • τ≪1\tau \ll 1τ1:介质对辐射几乎透明
  • τ≈1\tau \approx 1τ1:介质对辐射部分吸收
  • τ≫1\tau \gg 1τ1:介质对辐射几乎不透明

2.2 比尔-朗伯定律

当不考虑发射项(如太阳短波辐射在冷大气中的传输),辐射传输方程简化为:

dIνdτν=−Iνμ\frac{dI_\nu}{d\tau_\nu} = -\frac{I_\nu}{\mu}dτνdIν=μIν

其解为比尔-朗伯定律:

Iν(τν)=Iν(0)exp⁡(−τν/μ)I_\nu(\tau_\nu) = I_\nu(0) \exp(-\tau_\nu/\mu)Iν(τν)=Iν(0)exp(τν/μ)

或写成透射率形式:

Tν=Iν(τν)Iν(0)=exp⁡(−τν/μ)T_\nu = \frac{I_\nu(\tau_\nu)}{I_\nu(0)} = \exp(-\tau_\nu/\mu)Tν=Iν(0)Iν(τν)=exp(τν/μ)

吸收率为:

Aν=1−Tν=1−exp⁡(−τν/μ)A_\nu = 1 - T_\nu = 1 - \exp(-\tau_\nu/\mu)Aν=1Tν=1exp(τν/μ)

比尔-朗伯定律在以下情况适用:

  • 单色辐射(单一频率)
  • 无散射或散射可忽略
  • 介质处于热力学平衡或温度足够低(发射可忽略)

2.3 大气吸收光谱与吸收线

大气气体的吸收光谱由大量离散的谱线组成,这些谱线源于分子能级跃迁:

分子能级跃迁类型:

  1. 电子跃迁:能量差大,对应紫外和可见光波段

    • 例:臭氧在紫外波段的强吸收(哈特利带、哈金斯带)
  2. 振动跃迁:能量差中等,对应红外波段

    • 例:CO₂在4.3 μm和15 μm的吸收带
    • 水汽在6.3 μm的振动-转动带
  3. 转动跃迁:能量差小,对应远红外和微波波段

    • 例:水汽的转动带(>15 μm)

谱线形状:

由于各种展宽机制,单条吸收线具有一定的宽度:

  1. 自然展宽:由海森堡不确定性原理决定,宽度极小

  2. 多普勒展宽:由分子热运动引起的多普勒频移
    ΔνD=ν0c2kBTm\Delta\nu_D = \frac{\nu_0}{c}\sqrt{\frac{2k_BT}{m}}ΔνD=cν0m2kBT
    在对流层顶以上(气压低、温度低)占主导

  3. 压力展宽(碰撞展宽):由分子碰撞引起
    ΔνL∝P⋅T−n\Delta\nu_L \propto P \cdot T^{-n}ΔνLPTn
    在对流层(气压高)占主导

实际谱线形状由福伊特轮廓描述,是多普勒线型和洛伦兹线型的卷积。

主要吸收带:

气体 主要吸收带(μm) 吸收机制
H₂O 0.94, 1.13, 1.38, 1.87, 2.7, 6.3, >15 振动-转动
CO₂ 1.4, 2.0, 2.7, 4.3, 15 振动-转动
O₃ 0.2-0.3(紫外), 0.6, 9.6 电子+振动
CH₄ 3.3, 7.7 振动
N₂O 4.5, 7.8 振动
O₂ 0.69, 0.76, 1.27 电子

2.4 大气窗口

尽管大气有许多吸收带,但也存在一些相对透明的波段,称为"大气窗口":

可见光窗口(0.3-0.7 μm):

  • 大气对可见光几乎透明
  • 允许太阳辐射到达地表
  • 臭氧在紫外区有吸收,但可见光区吸收很弱

近红外窗口(0.7-1.3 μm):

  • 水汽在0.94、1.13 μm有弱吸收带
  • 太阳辐射能量约30%位于此窗口

大气红外窗口(8-13 μm):

  • 最重要的长波窗口
  • 水汽连续吸收较弱
  • 臭氧在9.6 μm有吸收线
  • 允许地表长波辐射部分逃逸到太空

微波窗口(>1 mm):

  • 大气对微波几乎完全透明
  • 用于卫星遥感和通信

大气窗口的存在对气候系统至关重要:

  • 短波窗口允许太阳能量进入气候系统
  • 长波窗口允许地球能量向太空散失
  • 温室气体增加会部分"关闭"长波窗口,导致全球变暖

3. 温室效应的物理机制

3.1 温室效应的基本原理

温室效应是指大气中的某些气体吸收地表发射的长波辐射,并向各个方向再辐射,其中向下辐射的部分加热地表的现象。其物理过程可以分解为:

步骤1:太阳辐射进入

  • 太阳短波辐射(主要是可见光)大部分穿过大气到达地表
  • 大气对短波辐射的吸收相对较弱(约20%被吸收)

步骤2:地表吸收和加热

  • 地表吸收太阳辐射,温度升高
  • 根据斯蒂芬-玻尔兹曼定律,地表发射长波辐射

步骤3:大气吸收长波辐射

  • 温室气体(水汽、CO₂、CH₄等)吸收地表发射的长波辐射
  • 大气层被加热

步骤4:大气再辐射

  • 被加热的大气向各个方向发射长波辐射
  • 向上辐射的部分逃逸到太空
  • 向下辐射的部分(大气逆辐射)返回地表

步骤5:地表能量平衡

  • 地表接收太阳辐射和大气逆辐射
  • 地表温度调整到能量平衡状态

如果没有温室效应,地表温度将是约-18°C。实际地表温度约15°C,温室效应使地表升温约33°C。

3.2 主要温室气体的辐射特性

水汽(H₂O):

水汽是最重要的温室气体,贡献了约60%的自然温室效应:

  • 浓度:0.1-4%(体积比),随高度和地理位置变化很大
  • 主要吸收带:6.3 μm(振动带),>15 μm(转动带)
  • 相变潜热大,通过凝结释放热量
  • 正反馈机制:温度升高→蒸发增加→更多水汽→更强温室效应

二氧化碳(CO₂):

CO₂是第二重要的温室气体,贡献了约26%的自然温室效应:

  • 浓度:工业革命前约280 ppm,目前约420 ppm
  • 主要吸收带:15 μm(最强),4.3 μm,2.7 μm
  • 大气寿命长(约100年)
  • 混合均匀,全球浓度差异小

甲烷(CH₄):

甲烷是强效温室气体:

  • 浓度:工业革命前约700 ppb,目前约1900 ppb
  • 全球增温潜势(GWP):在100年时间尺度上是CO₂的28-30倍
  • 主要吸收带:3.3 μm,7.7 μm
  • 大气寿命约12年

氧化亚氮(N₂O):

  • 浓度:工业革命前约270 ppb,目前约330 ppb
  • GWP:在100年时间尺度上是CO₂的265-298倍
  • 主要吸收带:4.5 μm,7.8 μm
  • 大气寿命约120年

臭氧(O₃):

  • 对流层臭氧:污染物,温室气体
  • 平流层臭氧:吸收紫外辐射,保护生物
  • 主要吸收带:9.6 μm(红外),紫外波段

卤代烃(CFCs、HCFCs等):

  • 人造温室气体
  • GWP极高(数千倍于CO₂)
  • 大气寿命长(数十年到数百年)
  • 《蒙特利尔议定书》限制使用

3.3 辐射强迫的概念与计算

辐射强迫(Radiative Forcing, RF)是衡量外部因素对地球辐射平衡扰动的指标,定义为:

辐射强迫是由于外部驱动因素的变化(如温室气体浓度变化、太阳辐射变化等)造成的对流层顶净辐射通量的变化(单位:W/m²)。

正辐射强迫表示气候系统获得能量(变暖),负辐射强迫表示气候系统失去能量(变冷)。

辐射强迫的计算方法:

对于CO₂浓度变化的辐射强迫,常用简化公式:

ΔFCO2=5.35×ln⁡(CC0)\Delta F_{CO_2} = 5.35 \times \ln\left(\frac{C}{C_0}\right)ΔFCO2=5.35×ln(C0C)

其中:

  • CCC:当前CO₂浓度(ppm)
  • C0C_0C0:参考CO₂浓度(ppm)
  • ΔF\Delta FΔF:辐射强迫(W/m²)

示例计算:

从工业革命前(280 ppm)到现在(420 ppm):

ΔF=5.35×ln⁡(420280)=5.35×0.405=2.17 W/m2\Delta F = 5.35 \times \ln\left(\frac{420}{280}\right) = 5.35 \times 0.405 = 2.17 \text{ W/m}^2ΔF=5.35×ln(280420)=5.35×0.405=2.17 W/m2

主要辐射强迫因子(IPCC AR6,1750-2019):

因子 辐射强迫(W/m²) 不确定性
CO₂ +2.16 ±0.12
CH₄ +0.54 ±0.11
N₂O +0.21 ±0.03
卤代烃 +0.41 ±0.04
臭氧 +0.47 ±0.19
水汽(平流层) +0.05 ±0.05
地表反照率(土地利用) -0.20 ±0.10
气溶胶(直接效应) -0.50 ±0.40
气溶胶(云反照率) -0.84 ±0.70
太阳辐射 +0.01 ±0.05
总人为辐射强迫 +2.72 ±0.45

3.4 气候敏感度与温度响应

辐射强迫与温度变化之间的关系由气候敏感度描述:

ΔT=λ⋅ΔF\Delta T = \lambda \cdot \Delta FΔT=λΔF

其中:

  • ΔT\Delta TΔT:全球平均表面温度变化(°C)
  • λ\lambdaλ:气候敏感度参数(°C/(W/m²))
  • ΔF\Delta FΔF:辐射强迫(W/m²)

平衡气候敏感度(ECS):

ECS定义为CO₂浓度加倍(从280 ppm到560 ppm)并达到平衡状态时的全球平均表面温度变化。

ECS=λ⋅ΔF2×CO2ECS = \lambda \cdot \Delta F_{2\times CO_2}ECS=λΔF2×CO2

其中ΔF2×CO2≈3.7\Delta F_{2\times CO_2} \approx 3.7ΔF2×CO23.7 W/m²。

IPCC AR6给出的ECS最佳估计值为3°C,可能范围2.5-4°C(66%置信度)。

瞬态气候响应(TCR):

TCR定义为CO₂浓度以每年1%的速率增加,在浓度加倍时的温度变化。TCR通常小于ECS,因为海洋热惯性延迟了温度响应。

IPCC AR6给出的TCR最佳估计值为1.8°C,可能范围1.4-2.2°C。

反馈机制:

实际气候系统存在各种反馈机制,使温度响应复杂化:

  1. 水汽反馈(正反馈):温度升高→蒸发增加→更多水汽→更强温室效应→进一步升温

  2. 冰雪反照率反馈(正反馈):温度升高→冰雪融化→地表反照率降低→吸收更多太阳辐射→进一步升温

  3. 云反馈(不确定)

    • 低云:通常冷却效应,反馈符号不确定
    • 高云:温室效应,正反馈
  4. 海洋热吸收(负反馈):海洋吸收热量,减缓表面升温


4. 大气辐射传输模型

4.1 一维辐射对流平衡模型

一维辐射对流平衡模型是理解大气垂直温度廓线和辐射传输的基础工具。该模型假设大气在水平方向上是均匀的,只考虑垂直方向的变化。

基本方程:

辐射传输方程(向上和向下):

dF↑dτ=F↑−πB(T)\frac{dF^\uparrow}{d\tau} = F^\uparrow - \pi B(T)dτdF=FπB(T)

dF↓dτ=−F↓+πB(T)\frac{dF^\downarrow}{d\tau} = -F^\downarrow + \pi B(T)dτdF=F+πB(T)

其中F↑F^\uparrowFF↓F^\downarrowF分别是向上和向下的辐射通量,πB(T)\pi B(T)πB(T)是普朗克辐射(乘以π转换为通量)。

边界条件:

  • 地表(τ=τ_s):F↑=σTs4F^\uparrow = \sigma T_s^4F=σTs4F↓F^\downarrowF由大气计算得到
  • 大气层顶(τ=0):F↓=0F^\downarrow = 0F=0(无向下辐射),F↑F^\uparrowF是出射长波辐射(OLR)

对流调整:

纯辐射平衡计算的温度廓线在对流层通常是不稳定的(温度递减率大于绝热递减率)。为模拟对流过程,当辐射计算的温度递减率超过临界值(通常取6.5 K/km)时,进行对流调整,将温度廓线调整为临界递减率。

4.2 逐线辐射传输模型

逐线辐射传输模型(Line-by-Line Model, LBL)是最精确的大气辐射传输计算方法。该方法对每一条吸收线单独计算其吸收和发射。

计算步骤:

  1. 光谱线参数:从光谱数据库(如HITRAN)获取每条谱线的位置、强度、线宽等参数

  2. 线型计算:根据温度和压力计算每条谱线的线型(洛伦兹、多普勒或福伊特)

  3. 吸收系数计算:对所有谱线的贡献求和,得到单色吸收系数

  4. 辐射传输积分:求解辐射传输方程,得到辐射通量

优点:

  • 精度最高,可作为其他方法的基准
  • 能准确处理谱线重叠和非局部热力学平衡效应

缺点:

  • 计算量极大,不适合气候模式
  • 需要详细的光谱线参数数据库

4.3 宽带辐射传输模型

宽带辐射传输模型将光谱分成若干宽带(通常10-20个波段),在每个波段内使用平均吸收系数,大大提高计算效率。

k分布方法:

k分布方法是一种常用的宽带计算方法。其基本思想是:

  1. 在宽波段内,将吸收系数kνk_\nukν按大小排序,形成累积分布函数
  2. 用少数几个(如10个)代表吸收系数值代替连续分布
  3. 对每个代表k值计算辐射传输,然后加权求和

k分布方法的优点是避免了在宽波段内直接对快速变化的吸收系数积分,同时保持了较高的精度。

相关k分布:

考虑吸收气体的非均匀分布(如垂直方向上的浓度变化),使用相关k分布方法,假设不同层次的k分布形状相似,只是整体平移。

4.4 简化辐射传输模型

对于教学和概念理解,可以使用高度简化的辐射传输模型。

两层大气模型:

将大气简化为两层:

  • 上层:对短波透明,对长波部分吸收
  • 下层:对短波透明,对长波强吸收
  • 地表:发射长波辐射,吸收短波和长波

设上层大气吸收率为a1a_1a1,下层为a2a_2a2,地表反照率为α\alphaα,太阳辐射为S0/4S_0/4S0/4(全球平均)。

通过能量平衡方程可以求解各层温度:

上层大气:
S04(1−α)a1+a1σTs4=2a1σT14\frac{S_0}{4}(1-\alpha)a_1 + a_1\sigma T_s^4 = 2a_1\sigma T_1^44S0(1α)a1+a1σTs4=2a1σT14

下层大气:
S04(1−α)a2(1−a1)+a2(1−a1)σTs4+a2σT14=2a2σT24\frac{S_0}{4}(1-\alpha)a_2(1-a_1) + a_2(1-a_1)\sigma T_s^4 + a_2\sigma T_1^4 = 2a_2\sigma T_2^44S0(1α)a2(1a1)+a2(1a1)σTs4+a2σT14=2a2σT24

地表:
S04(1−α)(1−a1)(1−a2)+(1−a2)σT14+a2σT24=σTs4\frac{S_0}{4}(1-\alpha)(1-a_1)(1-a_2) + (1-a_2)\sigma T_1^4 + a_2\sigma T_2^4 = \sigma T_s^44S0(1α)(1a1)(1a2)+(1a2)σT14+a2σT24=σTs4

通过调整吸收率a1a_1a1a2a_2a2,可以模拟不同温室气体浓度的影响。


5. Python仿真案例分析

5.1 案例1:地球辐射平衡与有效温度计算

本案例计算地球的有效辐射温度,并分析行星反照率和太阳常数变化的影响。

模拟内容:

  1. 计算地球有效辐射温度
  2. 分析行星反照率变化(0.1-0.5)对有效温度的影响
  3. 分析太阳常数变化(±10%)对有效温度的影响
  4. 对比不同行星(金星、地球、火星)的辐射平衡

关键公式:

Teff=[S0(1−α)4σ]1/4T_{eff} = \left[\frac{S_0(1-\alpha)}{4\sigma}\right]^{1/4}Teff=[4σS0(1α)]1/4

模拟结果分析:

地球当前状态(S0=1361S_0=1361S0=1361 W/m²,α=0.30\alpha=0.30α=0.30):

  • 有效温度:255 K(-18°C)
  • 地表温度:288 K(15°C)
  • 温室效应升温:33°C

如果行星反照率从0.30降到0.25(冰雪融化):

  • 有效温度升高到259 K
  • 升温约4°C

如果太阳常数增加1%:

  • 有效温度升高约0.65°C
  • 考虑反馈效应,实际升温可能达到1-2°C

5.2 案例2:大气吸收光谱与透过率

本案例模拟大气中主要温室气体的吸收光谱和透过率。

模拟内容:

  1. 计算水汽、CO₂、O₃的主要吸收带
  2. 模拟整层大气的透过率光谱
  3. 分析大气窗口的形成机制
  4. 对比不同温室气体浓度下的透过率变化

模拟方法:

使用简化的吸收线模型(洛伦兹线型):

k(ν)=∑iSiπαL(ν−νi)2+αL2k(\nu) = \sum_i \frac{S_i}{\pi} \frac{\alpha_L}{(\nu-\nu_i)^2 + \alpha_L^2}k(ν)=iπSi(ννi)2+αL2αL

其中:

  • SiS_iSi:第i条谱线的强度
  • νi\nu_iνi:谱线中心频率
  • αL\alpha_LαL:洛伦兹半宽度

透过率计算:

T(ν)=exp⁡(−k(ν)⋅u)T(\nu) = \exp(-k(\nu) \cdot u)T(ν)=exp(k(ν)u)

其中uuu是吸收气体路径长度。

模拟结果分析:

水汽吸收:

  • 在6.3 μm有强振动吸收带
  • 在>15 μm的转动带几乎完全吸收
  • 在8-13 μm窗口区吸收较弱

CO₂吸收:

  • 在15 μm有最强的弯曲振动带
  • 是地球长波辐射的主要吸收者之一
  • 浓度增加会增强15 μm附近的吸收,"关闭"部分窗口

大气窗口:

  • 8-13 μm是相对透明的窗口
  • 允许约20-30%的地表辐射直接逃逸到太空
  • 温室气体增加会缩小这个窗口

5.3 案例3:辐射强迫与温度响应

本案例计算不同温室气体浓度变化产生的辐射强迫,并估算温度响应。

模拟内容:

  1. 计算CO₂浓度加倍的辐射强迫
  2. 计算从工业革命到现在各温室气体的辐射强迫
  3. 估算不同气候敏感度下的温度响应
  4. 分析各种反馈机制的影响

辐射强迫计算公式:

CO₂:
ΔFCO2=5.35×ln⁡(C/C0)\Delta F_{CO_2} = 5.35 \times \ln(C/C_0)ΔFCO2=5.35×ln(C/C0)

CH₄:
ΔFCH4=0.036×(M−M0)−[f(M,N0)−f(M0,N0)]\Delta F_{CH_4} = 0.036 \times (\sqrt{M} - \sqrt{M_0}) - [f(M,N_0) - f(M_0,N_0)]ΔFCH4=0.036×(M M0 )[f(M,N0)f(M0,N0)]

其中f(M,N)=0.47×ln⁡[1+2.01×10−5(MN)0.75+5.31×10−15M(MN)1.52]f(M,N) = 0.47 \times \ln[1 + 2.01 \times 10^{-5} (MN)^{0.75} + 5.31 \times 10^{-15} M(MN)^{1.52}]f(M,N)=0.47×ln[1+2.01×105(MN)0.75+5.31×1015M(MN)1.52]

N₂O:
ΔFN2O=0.12×(N−N0)−[f(M0,N)−f(M0,N0)]\Delta F_{N_2O} = 0.12 \times (\sqrt{N} - \sqrt{N_0}) - [f(M_0,N) - f(M_0,N_0)]ΔFN2O=0.12×(N N0 )[f(M0,N)f(M0,N0)]

温度响应计算:

ΔT=λ⋅ΔF\Delta T = \lambda \cdot \Delta FΔT=λΔF

其中气候敏感度参数:

  • 低敏感度:λ=0.5\lambda = 0.5λ=0.5 °C/(W/m²) → ECS = 1.85°C
  • 中敏感度:λ=0.8\lambda = 0.8λ=0.8 °C/(W/m²) → ECS = 3.0°C
  • 高敏感度:λ=1.2\lambda = 1.2λ=1.2 °C/(W/m²) → ECS = 4.4°C

模拟结果分析:

从工业革命到现在(1750-2023):

  • CO₂:280→420 ppm,辐射强迫约2.2 W/m²
  • CH₄:700→1900 ppb,辐射强迫约0.6 W/m²
  • N₂O:270→330 ppb,辐射强迫约0.2 W/m²
  • 总人为辐射强迫:约3.0 W/m²

温度响应(ECS=3°C):

  • 平衡温度升高:约2.3°C
  • 目前已实现升温:约1.1°C
  • 剩余升温潜力:约1.2°C(即使现在停止排放)

5.4 案例4:一维大气辐射传输模型

本案例建立简化的一维大气辐射传输模型,模拟大气温度廓线和辐射通量。

模型假设:

  1. 平面平行大气(一维)
  2. 灰体近似(宽带平均)
  3. 两流近似(向上和向下辐射)
  4. 对流调整(温度递减率限制)

辐射传输方程:

向上辐射:
dF↑dτ=F↑−σT4\frac{dF^\uparrow}{d\tau} = F^\uparrow - \sigma T^4dτdF=FσT4

向下辐射:
dF↓dτ=−F↓+σT4\frac{dF^\downarrow}{d\tau} = -F^\downarrow + \sigma T^4dτdF=F+σT4

其中光学深度τ\tauτ从大气层顶向下增加。

数值求解:

将大气分为N层,每层有温度TiT_iTi和光学深度τi\tau_iτi

从大气层顶向下积分向下辐射:
Fi+1↓=Fi↓e−Δτ+σTi4(1−e−Δτ)F^\downarrow_{i+1} = F^\downarrow_i e^{-\Delta\tau} + \sigma T_i^4 (1 - e^{-\Delta\tau})Fi+1=FieΔτ+σTi4(1eΔτ)

从地表向上积分向上辐射:
Fi↑=Fi+1↑e−Δτ+σTi4(1−e−Δτ)F^\uparrow_{i} = F^\uparrow_{i+1} e^{-\Delta\tau} + \sigma T_i^4 (1 - e^{-\Delta\tau})Fi=Fi+1eΔτ+σTi4(1eΔτ)

对流调整:

如果辐射计算的温度递减率Γ=−dT/dz\Gamma = -dT/dzΓ=dT/dz大于临界值Γad=6.5\Gamma_{ad} = 6.5Γad=6.5 K/km,则调整温度:

Tinew=Ti−1−Γad⋅ΔzT_i^{new} = T_{i-1} - \Gamma_{ad} \cdot \Delta zTinew=Ti1ΓadΔz

模拟结果分析:

标准大气:

  • 地表温度:约288 K
  • 对流层顶温度:约220 K(10-12 km高度)
  • 平流层温度随高度增加(臭氧加热)

温室气体增加的影响:

  • 地表和对流层低层升温
  • 平流层降温(更多长波辐射被下层大气吸收,到达平流层的辐射减少)
  • 辐射强迫:约3.7 W/m²(CO₂加倍)

辐射通量廓线:

  • 向上辐射随高度减小(大气吸收)
  • 向下辐射从0增加到地表(大气发射)
  • 净辐射通量向上,在对流层约100 W/m²,在平流层接近0

6. 结果讨论与气候应用

6.1 关键发现总结

通过上述仿真分析,可以得出以下关键结论:

(1)温室效应的物理本质

温室效应是大气辐射传输的必然结果。大气对短波太阳辐射相对透明,但对长波地球辐射强烈吸收。温室气体吸收地表发射的长波辐射后再向各个方向发射,其中向下部分加热地表,使地表温度高于有效辐射温度。

(2)辐射强迫与温度响应

从工业革命到现在,人为活动产生的总辐射强迫约3.0 W/m²。根据气候敏感度3°C/2×CO₂估算,平衡温度响应约2.3°C。目前已实现升温约1.1°C,说明气候系统尚未达到平衡,未来还会继续升温。

(3)不同温室气体的贡献

CO₂是最大的人为辐射强迫因子(约2.2 W/m²),但CH₄和N₂O的单位质量增温潜势更高。减少CH₄排放可以在短期内(20年)快速降低辐射强迫,而减少CO₂排放对长期气候稳定至关重要。

(4)反馈机制的重要性

水汽反馈和冰雪反照率反馈是正反馈,会放大初始升温。云反馈的不确定性是气候预测的主要不确定来源之一。海洋热吸收延迟了表面温度响应,但也意味着即使现在停止排放,气候系统还会继续调整数十年到数百年。

6.2 气候模型与预测的不确定性

气候预测存在以下主要不确定性来源:

(1)气候敏感度的不确定性

ECS的可能范围2.5-4°C(66%置信度),意味着相同辐射强迫下的温度响应可能有50%的差异。这主要源于云反馈的不确定性。

(2)碳循环反馈

气候变暖可能改变碳循环:

  • 海洋吸收CO₂能力随温度升高而降低
  • 冻土融化释放CO₂和CH₄
  • 森林火灾增加释放碳

这些反馈可能加速气候变化。

(3)气溶胶效应的不确定性

气溶胶的直接和间接效应(影响云)存在很大不确定性。气溶胶冷却效应可能部分抵消温室气体增温,但具体幅度不确定。

(4)自然变率

气候系统存在自然变率(如ENSO、PDO等),可能掩盖或放大人为气候变化信号,使短期预测困难。

6.3 减缓与适应策略

基于辐射传输和气候科学,可以制定以下应对策略:

减缓策略(减少辐射强迫):

  1. 能源转型:从化石燃料转向可再生能源,减少CO₂排放
  2. 提高能效:减少能源消耗,降低排放强度
  3. 森林保护:森林吸收CO₂,同时影响地表反照率和蒸散发
  4. 减少短寿命气候污染物:如CH₄、黑碳等,可快速降低辐射强迫
  5. 碳捕获与储存:从大气中移除CO₂

适应策略(应对不可避免的变化):

  1. 海平面上升适应:沿海防护、撤退、抬高建筑等
  2. 水资源管理:改进灌溉、建设水库、海水淡化
  3. 农业调整:改变作物品种、种植时间,发展抗旱品种
  4. 健康保护:应对热浪、传染病传播范围变化
  5. 生态系统保护:建立生态走廊,帮助物种迁移

附录:Python仿真程序说明

本主题配套的Python仿真程序包含以下功能模块:

A.1 程序结构

run_simulation.py
├── 案例1:地球辐射平衡与有效温度计算
│   ├── 有效温度计算
│   ├── 反照率敏感性分析
│   └── 不同行星对比
├── 案例2:大气吸收光谱与透过率
│   ├── 吸收线模型
│   ├── 透过率计算
│   └── 大气窗口分析
├── 案例3:辐射强迫与温度响应
│   ├── 辐射强迫计算
│   ├── 温度响应估算
│   └── 反馈机制分析
└── 案例4:一维大气辐射传输模型
    ├── 辐射传输方程求解
    ├── 对流调整
    └── 温室气体敏感性试验

A.2 关键算法

辐射强迫计算:

def co2_radiative_forcing(C, C0=280):
    """计算CO₂辐射强迫 (W/m²)"""
    return 5.35 * np.log(C / C0)

def temperature_response(delta_F, lambda_param=0.8):
    """计算温度响应 (°C)"""
    return lambda_param * delta_F

辐射传输求解:

def solve_radiative_transfer(tau, T, sigma=5.67e-8):
    """
    求解辐射传输方程
    
    参数:
    - tau: 光学深度数组(从顶向下)
    - T: 温度数组
    
    返回:
    - F_up: 向上辐射通量
    - F_down: 向下辐射通量
    """
    n = len(tau)
    F_up = np.zeros(n+1)
    F_down = np.zeros(n+1)
    
    # 从地表向上积分
    F_up[0] = sigma * T[0]**4  # 地表发射
    for i in range(n):
        dtau = tau[i+1] - tau[i] if i < n-1 else tau[i] - tau[i-1]
        F_up[i+1] = F_up[i] * np.exp(-dtau) + \
                    sigma * T[i]**4 * (1 - np.exp(-dtau))
    
    # 从大气层顶向下积分
    F_down[-1] = 0  # 无向下辐射
    for i in range(n-1, -1, -1):
        dtau = tau[i+1] - tau[i] if i < n-1 else tau[i] - tau[i-1]
        F_down[i] = F_down[i+1] * np.exp(-dtau) + \
                    sigma * T[i]**4 * (1 - np.exp(-dtau))
    
    return F_up, F_down

A.3 可视化输出

程序生成以下可视化结果:

  1. 辐射平衡图:地球能量平衡示意图
  2. 吸收光谱图:主要温室气体的吸收光谱
  3. 透过率图:大气窗口和透过率光谱
  4. 辐射强迫图:不同温室气体的辐射强迫
  5. 温度廓线图:大气垂直温度分布
  6. 辐射通量图:向上、向下和净辐射通量

A.4 使用说明

运行程序前请确保安装以下依赖:

pip install numpy matplotlib scipy

运行程序:

python run_simulation.py
"""
主题050:大气辐射传输与温室效应 - Python仿真程序

本程序模拟大气辐射传输过程,包括:
1. 地球辐射平衡与有效温度计算
2. 大气吸收光谱与透过率
3. 辐射强迫与温度响应
4. 一维大气辐射传输模型

作者:仿真教学团队
日期:2026-03-06
"""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, FancyBboxPatch, Arrow
from matplotlib.collections import LineCollection
import matplotlib.animation as animation
from scipy.integrate import odeint
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100

# 物理常数
SIGMA = 5.67e-8  # 斯蒂芬-玻尔兹曼常数 (W/m^2/K^4)
S0 = 1361  # 太阳常数 (W/m^2)
H_PLANCK = 6.626e-34  # 普朗克常数 (J·s)
C_LIGHT = 2.998e8  # 光速 (m/s)
K_BOLTZMANN = 1.381e-23  # 玻尔兹曼常数 (J/K)

# =============================================================================
# 案例1:地球辐射平衡与有效温度计算
# =============================================================================

def calculate_effective_temperature(S0=S0, albedo=0.30):
    """
    计算行星有效辐射温度
    
    参数:
    - S0: 太阳常数 (W/m^2)
    - albedo: 行星反照率
    
    返回:
    - T_eff: 有效温度 (K)
    """
    T_eff = ((S0 * (1 - albedo)) / (4 * SIGMA)) ** 0.25
    return T_eff


def case1_earth_radiation_balance():
    """
    案例1:地球辐射平衡与有效温度计算
    """
    print("=" * 70)
    print("案例1:地球辐射平衡与有效温度计算")
    print("=" * 70)
    
    # 创建图形
    fig = plt.figure(figsize=(16, 12))
    
    # 子图1:地球能量平衡示意图
    ax1 = fig.add_subplot(2, 2, 1)
    ax1.set_xlim(0, 10)
    ax1.set_ylim(0, 10)
    ax1.set_aspect('equal')
    ax1.axis('off')
    ax1.set_title('地球能量平衡示意图', fontsize=14, fontweight='bold')
    
    # 绘制太阳
    sun = Circle((1.5, 8), 0.8, color='yellow', ec='orange', linewidth=2)
    ax1.add_patch(sun)
    ax1.text(1.5, 8, '太阳', ha='center', va='center', fontsize=10, fontweight='bold')
    
    # 绘制地球
    earth = Circle((5, 5), 1.5, color='lightblue', ec='blue', linewidth=2)
    ax1.add_patch(earth)
    ax1.text(5, 5, '地球', ha='center', va='center', fontsize=12, fontweight='bold')
    
    # 绘制入射太阳辐射箭头
    ax1.annotate('', xy=(3.8, 5.5), xytext=(2.3, 7.5),
                arrowprops=dict(arrowstyle='->', color='red', lw=2))
    ax1.text(2.5, 6.8, '入射\n341 W/m²', fontsize=9, color='red')
    
    # 绘制反射
    ax1.annotate('', xy=(2.5, 4), xytext=(3.8, 4.5),
                arrowprops=dict(arrowstyle='->', color='orange', lw=2))
    ax1.text(2.2, 3.8, '反射\n102 W/m²', fontsize=9, color='orange')
    
    # 绘制吸收
    ax1.text(5, 3, '吸收\n239 W/m²', ha='center', fontsize=9, color='green')
    
    # 绘制出射长波辐射
    ax1.annotate('', xy=(7, 7), xytext=(6.2, 5.8),
                arrowprops=dict(arrowstyle='->', color='blue', lw=2))
    ax1.text(7.2, 7.2, '出射长波\n239 W/m²', fontsize=9, color='blue')
    
    # 绘制温室效应
    ax1.annotate('', xy=(5, 6.5), xytext=(5, 7.5),
                arrowprops=dict(arrowstyle='->', color='purple', lw=1.5, ls='--'))
    ax1.annotate('', xy=(5, 7.3), xytext=(5, 6.7),
                arrowprops=dict(arrowstyle='->', color='purple', lw=1.5, ls='--'))
    ax1.text(6.5, 7, '大气逆辐射\n(温室效应)', fontsize=9, color='purple')
    
    # 添加公式
    ax1.text(5, 1.5, r'$S_0(1-\alpha)/4 = \sigma T_{eff}^4$', 
            ha='center', fontsize=11, style='italic',
            bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
    
    # 子图2:反照率敏感性分析
    ax2 = fig.add_subplot(2, 2, 2)
    
    albedo_range = np.linspace(0.1, 0.5, 100)
    T_eff_range = [calculate_effective_temperature(S0, a) for a in albedo_range]
    
    ax2.plot(albedo_range, T_eff_range, 'b-', linewidth=2)
    ax2.axvline(x=0.30, color='r', linestyle='--', label='当前地球反照率 (0.30)')
    ax2.axhline(y=255, color='r', linestyle=':', alpha=0.7)
    ax2.scatter([0.30], [255], color='red', s=100, zorder=5)
    ax2.text(0.30, 248, '255 K\n(-18°C)', ha='center', fontsize=9, color='red')
    
    ax2.set_xlabel('行星反照率', fontsize=11)
    ax2.set_ylabel('有效温度 (K)', fontsize=11)
    ax2.set_title('反照率对有效温度的影响', fontsize=12, fontweight='bold')
    ax2.grid(True, alpha=0.3)
    ax2.legend(loc='upper right')
    
    # 添加标注
    ax2.annotate('冰雪融化→反照率降低→温度升高', 
                xy=(0.25, 260), xytext=(0.15, 275),
                arrowprops=dict(arrowstyle='->', color='green'),
                fontsize=9, color='green')
    
    # 子图3:太阳常数变化影响
    ax3 = fig.add_subplot(2, 2, 3)
    
    S0_range = np.linspace(1200, 1500, 100)
    T_eff_solar = [calculate_effective_temperature(s, 0.30) for s in S0_range]
    
    ax3.plot(S0_range, T_eff_solar, 'g-', linewidth=2)
    ax3.axvline(x=1361, color='r', linestyle='--', label='当前太阳常数 (1361 W/m²)')
    ax3.axhline(y=255, color='r', linestyle=':', alpha=0.7)
    ax3.scatter([1361], [255], color='red', s=100, zorder=5)
    
    ax3.set_xlabel('太阳常数 (W/m²)', fontsize=11)
    ax3.set_ylabel('有效温度 (K)', fontsize=11)
    ax3.set_title('太阳常数变化对有效温度的影响', fontsize=12, fontweight='bold')
    ax3.grid(True, alpha=0.3)
    ax3.legend(loc='upper left')
    
    # 子图4:不同行星对比
    ax4 = fig.add_subplot(2, 2, 4)
    
    planets = {
        '金星': {'S0': 2600, 'albedo': 0.75, 'T_actual': 737},
        '地球': {'S0': 1361, 'albedo': 0.30, 'T_actual': 288},
        '火星': {'S0': 586, 'albedo': 0.25, 'T_actual': 210}
    }
    
    names = list(planets.keys())
    T_eff_planets = []
    T_actual = []
    greenhouse = []
    
    for name, params in planets.items():
        T_eff = calculate_effective_temperature(params['S0'], params['albedo'])
        T_eff_planets.append(T_eff)
        T_actual.append(params['T_actual'])
        greenhouse.append(params['T_actual'] - T_eff)
    
    x = np.arange(len(names))
    width = 0.35
    
    bars1 = ax4.bar(x - width/2, T_eff_planets, width, label='有效温度', color='lightblue', edgecolor='blue')
    bars2 = ax4.bar(x + width/2, T_actual, width, label='实际表面温度', color='lightcoral', edgecolor='red')
    
    # 添加温室效应标注
    for i, (teff, tactual, gh) in enumerate(zip(T_eff_planets, T_actual, greenhouse)):
        ax4.annotate(f'+{gh:.0f}K', xy=(i, tactual + 20), ha='center', fontsize=9, color='red')
    
    ax4.set_ylabel('温度 (K)', fontsize=11)
    ax4.set_title('不同行星的辐射平衡对比', fontsize=12, fontweight='bold')
    ax4.set_xticks(x)
    ax4.set_xticklabels(names)
    ax4.legend()
    ax4.grid(True, alpha=0.3, axis='y')
    
    plt.tight_layout()
    plt.savefig('case1_earth_radiation_balance.png', dpi=150, bbox_inches='tight')
    print("✓ 案例1结果已保存: case1_earth_radiation_balance.png")
    plt.close()
    
    # 打印关键结果
    print("\n【关键计算结果】")
    print(f"地球有效辐射温度: {calculate_effective_temperature():.1f} K ({calculate_effective_temperature()-273.15:.1f}°C)")
    print(f"地球实际表面温度: ~288 K (15°C)")
    print(f"温室效应升温: {288 - calculate_effective_temperature():.1f} K")
    print(f"\n反照率从0.30降至0.25的影响:")
    T_new = calculate_effective_temperature(S0, 0.25)
    print(f"  有效温度从255 K升至{T_new:.1f} K (+{T_new-255:.1f} K)")
    print(f"\n不同行星温室效应:")
    for name, params in planets.items():
        T_eff = calculate_effective_temperature(params['S0'], params['albedo'])
        print(f"  {name}: 有效温度{T_eff:.0f}K, 实际温度{params['T_actual']}K, 温室效应+{params['T_actual']-T_eff:.0f}K")
    
    return fig


# =============================================================================
# 案例2:大气吸收光谱与透过率
# =============================================================================

def planck_function(wavelength, T):
    """
    计算普朗克黑体辐射函数
    
    参数:
    - wavelength: 波长 (m)
    - T: 温度 (K)
    
    返回:
    - 辐射强度 (W/m^2/sr/m)
    """
    term1 = (2 * H_PLANCK * C_LIGHT**2) / (wavelength**5)
    term2 = np.exp((H_PLANCK * C_LIGHT) / (wavelength * K_BOLTZMANN * T)) - 1
    return term1 / term2


def lorentz_line(nu, nu0, S, alpha_L):
    """
    洛伦兹线型函数
    
    参数:
    - nu: 波数 (cm^-1)
    - nu0: 中心波数 (cm^-1)
    - S: 谱线强度
    - alpha_L: 洛伦兹半宽度 (cm^-1)
    
    返回:
    - 吸收系数
    """
    return (S / np.pi) * (alpha_L / ((nu - nu0)**2 + alpha_L**2))


def calculate_atmospheric_transmittance():
    """
    计算大气透过率光谱
    """
    # 波数范围 (cm^-1) - 对应波长 4-25 μm
    nu = np.linspace(400, 2500, 5000)
    wavelength = 1e4 / nu  # 转换为 μm
    
    # 简化的吸收线参数 (仅用于演示)
    # CO2 15 μm 吸收带 (约 667 cm^-1)
    co2_lines = [
        {'nu0': 667, 'S': 100, 'alpha': 5},
        {'nu0': 650, 'S': 50, 'alpha': 4},
        {'nu0': 685, 'S': 50, 'alpha': 4},
    ]
    
    # H2O 6.3 μm 吸收带 (约 1595 cm^-1)
    h2o_lines = [
        {'nu0': 1595, 'S': 80, 'alpha': 8},
        {'nu0': 1550, 'S': 40, 'alpha': 6},
        {'nu0': 1650, 'S': 40, 'alpha': 6},
    ]
    
    # O3 9.6 μm 吸收带 (约 1042 cm^-1)
    o3_lines = [
        {'nu0': 1042, 'S': 60, 'alpha': 6},
    ]
    
    # 计算各气体的吸收系数
    k_co2 = np.zeros_like(nu)
    k_h2o = np.zeros_like(nu)
    k_o3 = np.zeros_like(nu)
    
    for line in co2_lines:
        k_co2 += lorentz_line(nu, line['nu0'], line['S'], line['alpha'])
    
    for line in h2o_lines:
        k_h2o += lorentz_line(nu, line['nu0'], line['S'], line['alpha'])
    
    for line in o3_lines:
        k_o3 += lorentz_line(nu, line['nu0'], line['S'], line['alpha'])
    
    # 路径长度 (简化的)
    u_co2 = 1.0
    u_h2o = 5.0
    u_o3 = 0.1
    
    # 计算透过率
    T_co2 = np.exp(-k_co2 * u_co2)
    T_h2o = np.exp(-k_h2o * u_h2o)
    T_o3 = np.exp(-k_o3 * u_o3)
    T_total = T_co2 * T_h2o * T_o3
    
    return wavelength, nu, T_co2, T_h2o, T_o3, T_total, k_co2, k_h2o, k_o3


def case2_atmospheric_spectrum():
    """
    案例2:大气吸收光谱与透过率
    """
    print("\n" + "=" * 70)
    print("案例2:大气吸收光谱与透过率")
    print("=" * 70)
    
    # 计算透过率
    wavelength, nu, T_co2, T_h2o, T_o3, T_total, k_co2, k_h2o, k_o3 = calculate_atmospheric_transmittance()
    
    # 计算黑体辐射光谱
    T_sun = 5778  # 太阳表面温度
    T_earth = 288  # 地球表面温度
    
    # 转换为波长 (m) 用于普朗克函数
    wavelength_m = wavelength * 1e-6
    
    B_sun = planck_function(wavelength_m, T_sun)
    B_earth = planck_function(wavelength_m, T_earth)
    
    # 归一化用于显示
    B_sun_norm = B_sun / np.max(B_sun) * 0.8
    B_earth_norm = B_earth / np.max(B_earth) * 0.8
    
    # 创建图形
    fig = plt.figure(figsize=(16, 12))
    
    # 子图1:主要温室气体吸收带
    ax1 = fig.add_subplot(2, 2, 1)
    
    ax1.fill_between(wavelength, k_co2/np.max(k_co2), alpha=0.3, color='blue', label='CO₂')
    ax1.fill_between(wavelength, k_h2o/np.max(k_h2o), alpha=0.3, color='green', label='H₂O')
    ax1.fill_between(wavelength, k_o3/np.max(k_o3), alpha=0.3, color='red', label='O₃')
    
    ax1.plot(wavelength, k_co2/np.max(k_co2), 'b-', linewidth=1.5)
    ax1.plot(wavelength, k_h2o/np.max(k_h2o), 'g-', linewidth=1.5)
    ax1.plot(wavelength, k_o3/np.max(k_o3), 'r-', linewidth=1.5)
    
    ax1.set_xlabel('波长 (μm)', fontsize=11)
    ax1.set_ylabel('归一化吸收系数', fontsize=11)
    ax1.set_title('主要温室气体吸收带 (简化模型)', fontsize=12, fontweight='bold')
    ax1.legend(loc='upper right')
    ax1.grid(True, alpha=0.3)
    ax1.set_xlim(4, 25)
    
    # 标注主要吸收带
    ax1.axvline(x=15, color='blue', linestyle='--', alpha=0.5)
    ax1.text(15, 0.9, 'CO₂\n15 μm', ha='center', fontsize=9, color='blue')
    ax1.axvline(x=6.3, color='green', linestyle='--', alpha=0.5)
    ax1.text(6.3, 0.9, 'H₂O\n6.3 μm', ha='center', fontsize=9, color='green')
    ax1.axvline(x=9.6, color='red', linestyle='--', alpha=0.5)
    ax1.text(9.6, 0.9, 'O₃\n9.6 μm', ha='center', fontsize=9, color='red')
    
    # 子图2:整层大气透过率
    ax2 = fig.add_subplot(2, 2, 2)
    
    ax2.plot(wavelength, T_total, 'k-', linewidth=2, label='总透过率')
    ax2.fill_between(wavelength, T_total, alpha=0.2, color='gray')
    
    # 标注大气窗口
    ax2.axvspan(8, 13, alpha=0.2, color='yellow', label='大气窗口 (8-13 μm)')
    ax2.axvspan(10, 11, alpha=0.3, color='orange', label='臭氧吸收带')
    
    ax2.set_xlabel('波长 (μm)', fontsize=11)
    ax2.set_ylabel('透过率', fontsize=11)
    ax2.set_title('整层大气透过率光谱', fontsize=12, fontweight='bold')
    ax2.legend(loc='lower right')
    ax2.grid(True, alpha=0.3)
    ax2.set_xlim(4, 25)
    ax2.set_ylim(0, 1.05)
    
    # 子图3:太阳和地球辐射光谱对比
    ax3 = fig.add_subplot(2, 2, 3)
    
    ax3.fill_between(wavelength, B_sun_norm, alpha=0.3, color='yellow', label='太阳 (5778 K)')
    ax3.fill_between(wavelength, B_earth_norm, alpha=0.3, color='red', label='地球 (288 K)')
    ax3.plot(wavelength, B_sun_norm, 'orange', linewidth=2)
    ax3.plot(wavelength, B_earth_norm, 'darkred', linewidth=2)
    
    # 叠加透过率
    ax3_twin = ax3.twinx()
    ax3_twin.plot(wavelength, T_total, 'b--', linewidth=1.5, alpha=0.7, label='大气透过率')
    ax3_twin.set_ylabel('大气透过率', fontsize=11, color='blue')
    ax3_twin.tick_params(axis='y', labelcolor='blue')
    ax3_twin.set_ylim(0, 1.05)
    
    ax3.set_xlabel('波长 (μm)', fontsize=11)
    ax3.set_ylabel('归一化辐射强度', fontsize=11)
    ax3.set_title('太阳与地球辐射光谱对比', fontsize=12, fontweight='bold')
    ax3.legend(loc='upper left')
    ax3_twin.legend(loc='upper right')
    ax3.grid(True, alpha=0.3)
    ax3.set_xlim(0.1, 25)
    
    # 添加波长区域标注
    ax3.axvspan(0.1, 4, alpha=0.1, color='yellow')
    ax3.text(2, 0.7, '短波辐射\n(太阳)', ha='center', fontsize=10, color='orange')
    ax3.axvspan(4, 25, alpha=0.1, color='red')
    ax3.text(14, 0.7, '长波辐射\n(地球)', ha='center', fontsize=10, color='darkred')
    
    # 子图4:CO2浓度变化对透过率的影响
    ax4 = fig.add_subplot(2, 2, 4)
    
    # 不同CO2浓度
    co2_concentrations = [280, 420, 560, 840]  # ppm
    colors = ['green', 'blue', 'orange', 'red']
    
    for conc, color in zip(co2_concentrations, colors):
        # 简化的CO2吸收增强
        factor = conc / 280
        k_co2_new = k_co2 * factor
        T_co2_new = np.exp(-k_co2_new * 1.0)
        T_total_new = T_co2_new * T_h2o * T_o3
        
        ax4.plot(wavelength, T_total_new, color=color, linewidth=2, 
                label=f'CO₂ = {conc} ppm')
    
    ax4.set_xlabel('波长 (μm)', fontsize=11)
    ax4.set_ylabel('透过率', fontsize=11)
    ax4.set_title('CO₂浓度变化对大气透过率的影响', fontsize=12, fontweight='bold')
    ax4.legend(loc='lower right')
    ax4.grid(True, alpha=0.3)
    ax4.set_xlim(13, 18)
    ax4.set_ylim(0, 1.05)
    
    # 标注15 μm吸收带变窄
    ax4.annotate('15 μm 吸收带\n随CO₂增加而增强', 
                xy=(15, 0.3), xytext=(16, 0.6),
                arrowprops=dict(arrowstyle='->', color='red'),
                fontsize=10, color='red')
    
    plt.tight_layout()
    plt.savefig('case2_atmospheric_spectrum.png', dpi=150, bbox_inches='tight')
    print("✓ 案例2结果已保存: case2_atmospheric_spectrum.png")
    plt.close()
    
    # 打印关键结果
    print("\n【关键计算结果】")
    print(f"太阳辐射峰值波长: {2.898e6/T_sun:.2f} μm (可见光)")
    print(f"地球辐射峰值波长: {2.898e6/T_earth:.2f} μm (红外)")
    print(f"\n大气窗口 (8-13 μm) 平均透过率: {np.mean(T_total[(wavelength>8)&(wavelength<13)]):.3f}")
    print(f"CO₂ 15 μm 吸收带透过率: {np.mean(T_total[(wavelength>14)&(wavelength<16)]):.3f}")
    print(f"H₂O 6.3 μm 吸收带透过率: {np.mean(T_total[(wavelength>5)&(wavelength<8)]):.3f}")
    
    return fig


# =============================================================================
# 案例3:辐射强迫与温度响应
# =============================================================================

def co2_radiative_forcing(C, C0=280):
    """
    计算CO₂辐射强迫 (Myhre et al., 1998)
    
    参数:
    - C: 当前CO₂浓度 (ppm)
    - C0: 参考CO₂浓度 (ppm)
    
    返回:
    - 辐射强迫 (W/m²)
    """
    return 5.35 * np.log(C / C0)


def ch4_radiative_forcing(M, M0=700, N0=270):
    """
    计算CH₄辐射强迫 (简化公式)
    
    参数:
    - M: 当前CH₄浓度 (ppb)
    - M0: 参考CH₄浓度 (ppb)
    - N0: 参考N₂O浓度 (ppb)
    
    返回:
    - 辐射强迫 (W/m²)
    """
    # 简化公式
    return 0.036 * (np.sqrt(M) - np.sqrt(M0))


def n2o_radiative_forcing(N, N0=270, M0=700):
    """
    计算N₂O辐射强迫 (简化公式)
    
    参数:
    - N: 当前N₂O浓度 (ppb)
    - N0: 参考N₂O浓度 (ppb)
    - M0: 参考CH₄浓度 (ppb)
    
    返回:
    - 辐射强迫 (W/m²)
    """
    # 简化公式
    return 0.12 * (np.sqrt(N) - np.sqrt(N0))


def temperature_response(delta_F, lambda_param=0.8):
    """
    计算温度响应
    
    参数:
    - delta_F: 辐射强迫 (W/m²)
    - lambda_param: 气候敏感度参数 (°C/(W/m²))
    
    返回:
    - 温度变化 (°C)
    """
    return lambda_param * delta_F


def case3_radiative_forcing():
    """
    案例3:辐射强迫与温度响应
    """
    print("\n" + "=" * 70)
    print("案例3:辐射强迫与温度响应")
    print("=" * 70)
    
    # 创建图形
    fig = plt.figure(figsize=(16, 12))
    
    # 子图1:CO2辐射强迫随浓度变化
    ax1 = fig.add_subplot(2, 2, 1)
    
    C_range = np.linspace(280, 1000, 200)
    RF_co2 = [co2_radiative_forcing(c) for c in C_range]
    
    ax1.plot(C_range, RF_co2, 'b-', linewidth=2)
    ax1.axvline(x=280, color='green', linestyle='--', alpha=0.7, label='工业革命前 (280 ppm)')
    ax1.axvline(x=420, color='orange', linestyle='--', alpha=0.7, label='当前 (420 ppm)')
    ax1.axvline(x=560, color='red', linestyle='--', alpha=0.7, label='加倍 (560 ppm)')
    
    # 标注关键点
    ax1.scatter([280, 420, 560], [0, co2_radiative_forcing(420), co2_radiative_forcing(560)], 
               color=['green', 'orange', 'red'], s=100, zorder=5)
    ax1.text(420, co2_radiative_forcing(420)+0.3, f'+{co2_radiative_forcing(420):.2f} W/m²', 
            fontsize=9, color='orange')
    ax1.text(560, co2_radiative_forcing(560)+0.3, f'+{co2_radiative_forcing(560):.2f} W/m²', 
            fontsize=9, color='red')
    
    ax1.set_xlabel('CO₂浓度 (ppm)', fontsize=11)
    ax1.set_ylabel('辐射强迫 (W/m²)', fontsize=11)
    ax1.set_title('CO₂辐射强迫随浓度变化', fontsize=12, fontweight='bold')
    ax1.legend(loc='upper left')
    ax1.grid(True, alpha=0.3)
    
    # 子图2:不同温室气体的辐射强迫对比
    ax2 = fig.add_subplot(2, 2, 2)
    
    # 当前浓度
    C_current = 420
    M_current = 1900
    N_current = 330
    
    # 工业革命前浓度
    C_pre = 280
    M_pre = 700
    N_pre = 270
    
    # 计算辐射强迫
    RF_co2_current = co2_radiative_forcing(C_current, C_pre)
    RF_ch4_current = ch4_radiative_forcing(M_current, M_pre)
    RF_n2o_current = n2o_radiative_forcing(N_current, N_pre)
    
    gases = ['CO₂', 'CH₄', 'N₂O']
    RF_values = [RF_co2_current, RF_ch4_current, RF_n2o_current]
    colors = ['blue', 'green', 'red']
    
    bars = ax2.bar(gases, RF_values, color=colors, alpha=0.7, edgecolor='black')
    
    # 添加数值标注
    for bar, rf in zip(bars, RF_values):
        height = bar.get_height()
        ax2.text(bar.get_x() + bar.get_width()/2., height + 0.05,
                f'{rf:.2f}', ha='center', va='bottom', fontsize=11, fontweight='bold')
    
    ax2.set_ylabel('辐射强迫 (W/m²)', fontsize=11)
    ax2.set_title('1750-2023年各温室气体辐射强迫', fontsize=12, fontweight='bold')
    ax2.grid(True, alpha=0.3, axis='y')
    ax2.set_ylim(0, max(RF_values) * 1.2)
    
    # 子图3:温度响应与气候敏感度
    ax3 = fig.add_subplot(2, 2, 3)
    
    # 总辐射强迫
    RF_total = RF_co2_current + RF_ch4_current + RF_n2o_current + 0.5  # 其他气体
    
    # 不同气候敏感度
    lambda_values = np.linspace(0.4, 1.2, 100)
    delta_T = [temperature_response(RF_total, lam) for lam in lambda_values]
    
    ax3.plot(lambda_values, delta_T, 'purple', linewidth=2)
    ax3.axvline(x=0.8, color='red', linestyle='--', label='最佳估计 (λ=0.8)')
    ax3.axhspan(2.0, 3.0, alpha=0.2, color='green', label='ECS = 2.5-4°C')
    
    # 标注当前估计
    T_best = temperature_response(RF_total, 0.8)
    ax3.scatter([0.8], [T_best], color='red', s=150, zorder=5)
    ax3.text(0.85, T_best, f'{T_best:.1f}°C', fontsize=10, color='red')
    
    ax3.set_xlabel('气候敏感度参数 λ (°C/(W/m²))', fontsize=11)
    ax3.set_ylabel('温度变化 (°C)', fontsize=11)
    ax3.set_title(f'温度响应与气候敏感度 (RF={RF_total:.1f} W/m²)', fontsize=12, fontweight='bold')
    ax3.legend(loc='upper left')
    ax3.grid(True, alpha=0.3)
    
    # 子图4:历史辐射强迫和温度变化
    ax4 = fig.add_subplot(2, 2, 4)
    
    # 历史CO2浓度数据 (简化)
    years = np.array([1750, 1850, 1900, 1950, 1970, 1990, 2010, 2023])
    co2_hist = np.array([280, 285, 296, 311, 326, 354, 389, 420])
    
    # 计算辐射强迫
    rf_hist = [co2_radiative_forcing(c, 280) for c in co2_hist]
    
    # 估算温度变化 (简化)
    temp_hist = [temperature_response(rf, 0.8) for rf in rf_hist]
    
    ax4_twin = ax4.twinx()
    
    line1 = ax4.plot(years, rf_hist, 'b-o', linewidth=2, markersize=6, label='辐射强迫')
    line2 = ax4_twin.plot(years, temp_hist, 'r-s', linewidth=2, markersize=6, label='温度变化')
    
    ax4.set_xlabel('年份', fontsize=11)
    ax4.set_ylabel('辐射强迫 (W/m²)', fontsize=11, color='blue')
    ax4_twin.set_ylabel('温度变化 (°C)', fontsize=11, color='red')
    ax4.tick_params(axis='y', labelcolor='blue')
    ax4_twin.tick_params(axis='y', labelcolor='red')
    
    ax4.set_title('历史CO₂辐射强迫和温度变化估算', fontsize=12, fontweight='bold')
    ax4.grid(True, alpha=0.3)
    
    # 合并图例
    lines = line1 + line2
    labels = [l.get_label() for l in lines]
    ax4.legend(lines, labels, loc='upper left')
    
    plt.tight_layout()
    plt.savefig('case3_radiative_forcing.png', dpi=150, bbox_inches='tight')
    print("✓ 案例3结果已保存: case3_radiative_forcing.png")
    plt.close()
    
    # 打印关键结果
    print("\n【关键计算结果】")
    print(f"CO₂从280 ppm增至420 ppm的辐射强迫: +{RF_co2_current:.2f} W/m²")
    print(f"CH₄从700 ppb增至1900 ppb的辐射强迫: +{RF_ch4_current:.2f} W/m²")
    print(f"N₂O从270 ppb增至330 ppb的辐射强迫: +{RF_n2o_current:.2f} W/m²")
    print(f"总人为辐射强迫 (估算): +{RF_total:.2f} W/m²")
    print(f"\n不同气候敏感度下的温度响应:")
    for lam, ecs in [(0.5, '1.9°C'), (0.8, '3.0°C'), (1.2, '4.4°C')]:
        dt = temperature_response(RF_total, lam)
        print(f"  λ={lam}°C/(W/m²) (ECS≈{ecs}): ΔT = {dt:.2f}°C")
    print(f"\nCO₂加倍 (280→560 ppm) 的辐射强迫: +{co2_radiative_forcing(560):.2f} W/m²")
    
    return fig


# =============================================================================
# 案例4:一维大气辐射传输模型
# =============================================================================

def solve_radiative_convective_equilibrium(n_layers=50, tau_total=4.0, 
                                           S_in=239, lapse_rate=6.5):
    """
    求解一维辐射对流平衡
    
    参数:
    - n_layers: 大气层数
    - tau_total: 总光学深度
    - S_in: 入射太阳辐射 (W/m²)
    - lapse_rate: 温度递减率 (K/km)
    
    返回:
    - z: 高度数组 (km)
    - T: 温度数组 (K)
    - tau: 光学深度数组
    - F_up: 向上辐射通量
    - F_down: 向下辐射通量
    """
    # 高度 (0-15 km)
    z = np.linspace(0, 15, n_layers)
    dz = z[1] - z[0]
    
    # 光学深度 (从顶向下增加)
    tau = np.linspace(0, tau_total, n_layers)
    
    # 初始化地表温度 (估算)
    T_surface = 288.0
    T = T_surface - lapse_rate * z
    
    # 迭代求解
    for iteration in range(100):
        T_old = T.copy()
        T_s_old = T_surface
        
        # 计算辐射通量
        F_up = np.zeros(n_layers)
        F_down = np.zeros(n_layers)
        
        # 向上辐射 (从地表向上)
        F_up[0] = SIGMA * T_surface**4
        for i in range(1, n_layers):
            dtau = tau[i] - tau[i-1]
            F_up[i] = F_up[i-1] * np.exp(-dtau) + SIGMA * T[i]**4 * (1 - np.exp(-dtau))
        
        # 向下辐射 (从大气层顶向下)
        F_down[-1] = 0  # 无向下辐射
        for i in range(n_layers-2, -1, -1):
            dtau = tau[i+1] - tau[i]
            F_down[i] = F_down[i+1] * np.exp(-dtau) + SIGMA * T[i]**4 * (1 - np.exp(-dtau))
        
        # 调整地表温度 (能量平衡)
        # S_in + F_down[0] = sigma * T_surface^4 (简化)
        T_surface_new = ((S_in + F_down[0]) / SIGMA)**0.25
        T_surface = 0.5 * T_surface + 0.5 * T_surface_new  # 欠松弛
        
        # 调整大气温度
        for i in range(1, n_layers-1):
            # 辐射平衡温度
            T_rad = ((F_up[i] + F_down[i]) / (2 * SIGMA))**0.25
            T[i] = 0.7 * T[i] + 0.3 * T_rad  # 欠松弛
        
        # 对流调整
        for i in range(1, n_layers):
            dT_dz = (T[i-1] - T[i]) / (z[i] - z[i-1])
            if dT_dz > lapse_rate:
                # 调整温度廓线
                T[i] = T[i-1] - lapse_rate * (z[i] - z[i-1])
        
        # 检查收敛
        if abs(T_surface - T_s_old) < 0.01 and np.max(np.abs(T - T_old)) < 0.01:
            break
    
    # 更新第一层温度
    T[0] = T_surface
    
    # 重新计算最终辐射通量
    F_up = np.zeros(n_layers)
    F_down = np.zeros(n_layers)
    
    F_up[0] = SIGMA * T_surface**4
    for i in range(1, n_layers):
        dtau = tau[i] - tau[i-1]
        F_up[i] = F_up[i-1] * np.exp(-dtau) + SIGMA * T[i]**4 * (1 - np.exp(-dtau))
    
    F_down[-1] = 0
    for i in range(n_layers-2, -1, -1):
        dtau = tau[i+1] - tau[i]
        F_down[i] = F_down[i+1] * np.exp(-dtau) + SIGMA * T[i]**4 * (1 - np.exp(-dtau))
    
    return z, T, tau, F_up, F_down


def case4_radiative_transfer_model():
    """
    案例4:一维大气辐射传输模型
    """
    print("\n" + "=" * 70)
    print("案例4:一维大气辐射传输模型")
    print("=" * 70)
    
    # 创建图形
    fig = plt.figure(figsize=(16, 12))
    
    # 不同光学深度 (模拟不同温室气体浓度)
    tau_values = [2.0, 4.0, 6.0, 8.0]
    colors = ['blue', 'green', 'orange', 'red']
    labels = ['τ=2.0 (低)', 'τ=4.0 (中)', 'τ=6.0 (高)', 'τ=8.0 (很高)']
    
    # 子图1:温度廓线
    ax1 = fig.add_subplot(2, 2, 1)
    
    results = {}
    for tau, color, label in zip(tau_values, colors, labels):
        z, T, tau_profile, F_up, F_down = solve_radiative_convective_equilibrium(
            tau_total=tau, S_in=239)
        results[tau] = (z, T, tau_profile, F_up, F_down)
        ax1.plot(T, z, color=color, linewidth=2, label=label)
    
    ax1.set_xlabel('温度 (K)', fontsize=11)
    ax1.set_ylabel('高度 (km)', fontsize=11)
    ax1.set_title('不同光学深度下的大气温度廓线', fontsize=12, fontweight='bold')
    ax1.legend(loc='upper right')
    ax1.grid(True, alpha=0.3)
    ax1.set_ylim(15, 0)
    
    # 标注对流层顶
    ax1.axhline(y=11, color='gray', linestyle='--', alpha=0.5)
    ax1.text(220, 11.5, '对流层顶', fontsize=9, color='gray')
    
    # 子图2:辐射通量廓线 (以τ=4.0为例)
    ax2 = fig.add_subplot(2, 2, 2)
    
    z, T, tau_profile, F_up, F_down = results[4.0]
    F_net = F_up - F_down
    
    ax2.plot(F_up, z, 'r-', linewidth=2, label='向上辐射')
    ax2.plot(F_down, z, 'b-', linewidth=2, label='向下辐射')
    ax2.plot(F_net, z, 'g--', linewidth=2, label='净辐射')
    
    ax2.set_xlabel('辐射通量 (W/m²)', fontsize=11)
    ax2.set_ylabel('高度 (km)', fontsize=11)
    ax2.set_title('辐射通量廓线 (τ=4.0)', fontsize=12, fontweight='bold')
    ax2.legend(loc='upper right')
    ax2.grid(True, alpha=0.3)
    ax2.set_ylim(15, 0)
    
    # 标注关键值
    ax2.text(F_up[0]+10, 0.5, f'{F_up[0]:.0f}', fontsize=9, color='red')
    ax2.text(F_down[0]+10, 0.5, f'{F_down[0]:.0f}', fontsize=9, color='blue')
    
    # 子图3:出射长波辐射(OLR)随光学深度变化
    ax3 = fig.add_subplot(2, 2, 3)
    
    tau_range = np.linspace(1, 10, 50)
    OLR_values = []
    
    for tau in tau_range:
        z, T, _, F_up, _ = solve_radiative_convective_equilibrium(tau_total=tau, S_in=239)
        OLR_values.append(F_up[-1])  # 大气层顶向上辐射
    
    ax3.plot(tau_range, OLR_values, 'purple', linewidth=2)
    ax3.axhline(y=239, color='red', linestyle='--', label='平衡值 (239 W/m²)')
    
    # 标注当前状态
    current_tau = 4.0
    current_olr = results[4.0][3][-1]
    ax3.scatter([current_tau], [current_olr], color='green', s=100, zorder=5)
    ax3.text(current_tau+0.3, current_olr-10, f'当前\n{current_olr:.0f} W/m²', fontsize=9)
    
    ax3.set_xlabel('总光学深度 τ', fontsize=11)
    ax3.set_ylabel('出射长波辐射 (W/m²)', fontsize=11)
    ax3.set_title('OLR随光学深度的变化', fontsize=12, fontweight='bold')
    ax3.legend(loc='upper right')
    ax3.grid(True, alpha=0.3)
    
    # 子图4:温室气体增加的敏感性试验
    ax4 = fig.add_subplot(2, 2, 4)
    
    # 基准情况
    z_base, T_base, _, _, _ = results[4.0]
    
    # 光学深度增加50% (模拟温室气体增加)
    z_new, T_new, _, _, _ = solve_radiative_convective_equilibrium(
        tau_total=4.0*1.5, S_in=239)
    
    # 绘制温度差
    # 插值到相同高度
    T_new_interp = np.interp(z_base, z_new, T_new)
    delta_T = T_new_interp - T_base
    
    ax4.fill_betweenx(z_base, 0, delta_T, alpha=0.3, color='red')
    ax4.plot(delta_T, z_base, 'r-', linewidth=2)
    ax4.axvline(x=0, color='black', linestyle='-', linewidth=0.5)
    
    ax4.set_xlabel('温度变化 (°C)', fontsize=11)
    ax4.set_ylabel('高度 (km)', fontsize=11)
    ax4.set_title('光学深度增加50%的温度响应', fontsize=12, fontweight='bold')
    ax4.grid(True, alpha=0.3)
    ax4.set_ylim(15, 0)
    
    # 标注地表升温
    ax4.text(delta_T[0]+0.2, 0.5, f'+{delta_T[0]:.1f}°C', fontsize=10, color='red', fontweight='bold')
    
    plt.tight_layout()
    plt.savefig('case4_radiative_transfer.png', dpi=150, bbox_inches='tight')
    print("✓ 案例4结果已保存: case4_radiative_transfer.png")
    plt.close()
    
    # 打印关键结果
    print("\n【关键计算结果】")
    for tau in tau_values:
        z, T, tau_profile, F_up, F_down = results[tau]
        olr = F_up[-1]
        print(f"光学深度 τ={tau}: 地表温度={T[0]:.1f}K, OLR={olr:.1f} W/m²")
    
    print(f"\n光学深度从4.0增至6.0的影响:")
    z1, T1, tau1, F_up1, F_down1 = results[4.0]
    z2, T2, tau2, F_up2, F_down2 = results[6.0]
    print(f"  地表温度从{T1[0]:.1f}K升至{T2[0]:.1f}K (+{T2[0]-T1[0]:.1f}K)")
    print(f"  OLR从{F_up1[-1]:.1f}降至{F_up2[-1]:.1f} W/m²")
    
    return fig


# =============================================================================
# 主程序
# =============================================================================

def main():
    """
    主程序:运行所有案例
    """
    print("\n" + "=" * 70)
    print("主题050:大气辐射传输与温室效应 - Python仿真")
    print("=" * 70)
    print("\n本程序包含以下案例:")
    print("  1. 地球辐射平衡与有效温度计算")
    print("  2. 大气吸收光谱与透过率")
    print("  3. 辐射强迫与温度响应")
    print("  4. 一维大气辐射传输模型")
    print("\n" + "=" * 70)
    
    # 运行案例1
    try:
        case1_earth_radiation_balance()
    except Exception as e:
        print(f"案例1运行出错: {e}")
    
    # 运行案例2
    try:
        case2_atmospheric_spectrum()
    except Exception as e:
        print(f"案例2运行出错: {e}")
    
    # 运行案例3
    try:
        case3_radiative_forcing()
    except Exception as e:
        print(f"案例3运行出错: {e}")
    
    # 运行案例4
    try:
        case4_radiative_transfer_model()
    except Exception as e:
        print(f"案例4运行出错: {e}")
    
    print("\n" + "=" * 70)
    print("所有案例运行完成!")
    print("=" * 70)
    print("\n生成的文件:")
    print("  - case1_earth_radiation_balance.png")
    print("  - case2_atmospheric_spectrum.png")
    print("  - case3_radiative_forcing.png")
    print("  - case4_radiative_transfer.png")
    print("\n" + "=" * 70)


if __name__ == "__main__":
    main()

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐