Path: blob/main/latex-templates/templates/climate-science/energy_balance.tex
51 views
unlisted
\documentclass[11pt,a4paper]{article}12% Essential packages3\usepackage[utf8]{inputenc}4\usepackage[T1]{fontenc}5\usepackage{amsmath,amssymb,amsthm}6\usepackage{graphicx}7\usepackage{float}8\usepackage{booktabs}9\usepackage{hyperref}10\usepackage{xcolor}11\usepackage{pythontex}12\usepackage[margin=1in]{geometry}1314% Custom commands15\newcommand{\dd}{\mathrm{d}}16\newcommand{\ee}{\mathrm{e}}17\newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}}1819% Document metadata20\title{Earth's Energy Balance Model:\\Climate Sensitivity and Radiative Forcing}21\author{Computational Climate Science}22\date{\today}2324\begin{document}2526\maketitle2728\begin{abstract}29This document develops the fundamental physics of Earth's energy balance, from the Stefan-Boltzmann law governing planetary radiation to the greenhouse effect and climate sensitivity. We derive the zero-dimensional energy balance model, calculate equilibrium temperatures with and without an atmosphere, and explore how changes in radiative forcing translate to temperature changes. The analysis includes numerical solutions of the time-dependent energy balance equation, demonstrating the transient response to perturbations such as increased CO$_2$ concentrations.30\end{abstract}3132\tableofcontents33\newpage3435%------------------------------------------------------------------------------36\section{Introduction: Earth as a Radiating Body}37%------------------------------------------------------------------------------3839Earth receives energy from the Sun and radiates energy back to space. At equilibrium, these two energy flows must balance. Understanding this balance is fundamental to climate science, as any imbalance leads to warming or cooling of the planet.4041The key physical principles governing Earth's energy balance are:42\begin{enumerate}43\item \textbf{Solar irradiance}: The Sun provides approximately $S_0 = 1361$ W/m$^2$ at Earth's orbital distance (the solar constant).44\item \textbf{Planetary albedo}: Earth reflects about 30\% of incoming sunlight back to space ($\alpha \approx 0.30$).45\item \textbf{Stefan-Boltzmann radiation}: Earth radiates energy according to the Stefan-Boltzmann law $F = \sigma T^4$.46\item \textbf{Greenhouse effect}: The atmosphere absorbs and re-emits longwave radiation, warming the surface.47\end{enumerate}4849\begin{pycode}50import numpy as np51import matplotlib.pyplot as plt52from matplotlib.patches import Circle, FancyArrowPatch, Rectangle53from scipy.integrate import odeint54from scipy.optimize import brentq5556# Physical constants57sigma = 5.67e-8 # Stefan-Boltzmann constant [W/m^2/K^4]58S0 = 1361 # Solar constant [W/m^2]59alpha = 0.30 # Earth's average albedo6061# Style configuration62plt.rcParams['figure.figsize'] = (10, 6)63plt.rcParams['font.size'] = 1164plt.rcParams['axes.labelsize'] = 1265plt.rcParams['axes.titlesize'] = 1466\end{pycode}6768%------------------------------------------------------------------------------69\section{The Stefan-Boltzmann Law and Blackbody Radiation}70%------------------------------------------------------------------------------7172All objects with temperature $T > 0$ emit electromagnetic radiation. For a perfect blackbody, the total power radiated per unit area is given by the Stefan-Boltzmann law:7374\begin{equation}75F = \sigma T^476\label{eq:stefan-boltzmann}77\end{equation}7879where $\sigma = 5.67 \times 10^{-8}$ W/m$^2$/K$^4$ is the Stefan-Boltzmann constant. This $T^4$ dependence is crucial---small temperature changes produce significant changes in radiated power.8081\begin{pycode}82# Stefan-Boltzmann demonstration83T_range = np.linspace(200, 350, 100) # Temperature range [K]84F_range = sigma * T_range**48586# Key temperatures87T_earth_no_atm = 255 # Earth without atmosphere [K]88T_earth_with_atm = 288 # Earth with atmosphere [K]89T_sun_surface = 5778 # Sun's surface [K]9091fig, axes = plt.subplots(1, 2, figsize=(12, 5))9293# Left plot: Stefan-Boltzmann curve94ax = axes[0]95ax.plot(T_range, F_range, 'b-', linewidth=2, label=r'$F = \sigma T^4$')96ax.axvline(T_earth_no_atm, color='orange', linestyle='--', alpha=0.7,97label=f'Earth (no atm): {T_earth_no_atm} K')98ax.axvline(T_earth_with_atm, color='red', linestyle='--', alpha=0.7,99label=f'Earth (with atm): {T_earth_with_atm} K')100101ax.fill_between(T_range, 0, F_range, alpha=0.2, color='blue')102ax.set_xlabel('Temperature [K]')103ax.set_ylabel('Radiated Power [W/m$^2$]')104ax.set_title('Stefan-Boltzmann Law')105ax.legend(loc='upper left')106ax.grid(True, alpha=0.3)107ax.set_xlim(200, 350)108ax.set_ylim(0, 900)109110# Right plot: Log-log showing T^4 behavior111ax = axes[1]112T_log = np.logspace(1.5, 4, 100) # 30 K to 10000 K113F_log = sigma * T_log**4114115ax.loglog(T_log, F_log, 'b-', linewidth=2)116ax.axvline(T_earth_with_atm, color='red', linestyle='--', alpha=0.7)117ax.axvline(T_sun_surface, color='orange', linestyle='--', alpha=0.7)118119ax.annotate('Earth\n288 K', xy=(T_earth_with_atm, sigma*T_earth_with_atm**4),120xytext=(100, sigma*T_earth_with_atm**4),121arrowprops=dict(arrowstyle='->', color='red'),122fontsize=10, color='red')123ax.annotate('Sun\n5778 K', xy=(T_sun_surface, sigma*T_sun_surface**4),124xytext=(8000, sigma*T_sun_surface**4/5),125arrowprops=dict(arrowstyle='->', color='orange'),126fontsize=10, color='orange')127128ax.set_xlabel('Temperature [K]')129ax.set_ylabel('Radiated Power [W/m$^2$]')130ax.set_title('Stefan-Boltzmann Law (Log Scale)')131ax.grid(True, alpha=0.3, which='both')132133plt.tight_layout()134plt.savefig('energy_balance_stefan_boltzmann.pdf', bbox_inches='tight')135plt.close()136\end{pycode}137138\begin{figure}[H]139\centering140\includegraphics[width=\textwidth]{energy_balance_stefan_boltzmann.pdf}141\caption{The Stefan-Boltzmann law relates temperature to radiated power through a fourth-power relationship. Left: Linear scale showing the rapid increase in radiated power with temperature. Earth's surface temperature (288 K) radiates significantly more than it would without an atmosphere (255 K). Right: Log-log scale reveals the four orders of magnitude difference between Earth's surface radiation and the Sun's, despite the Sun being only about 20 times hotter.}142\label{fig:stefan-boltzmann}143\end{figure}144145%------------------------------------------------------------------------------146\section{Zero-Dimensional Energy Balance Model}147%------------------------------------------------------------------------------148149The simplest climate model treats Earth as a uniform sphere receiving solar radiation and emitting thermal radiation. At equilibrium, incoming and outgoing energy must balance.150151\subsection{Incoming Solar Radiation}152153The Sun intercepts Earth with a circular cross-section of area $\pi R_E^2$, where $R_E$ is Earth's radius. The total incoming solar power is:154155\begin{equation}156P_{\text{in}} = S_0 \cdot \pi R_E^2 \cdot (1 - \alpha)157\end{equation}158159where $(1-\alpha)$ accounts for the fraction absorbed (not reflected). Dividing by Earth's surface area $4\pi R_E^2$ gives the average absorbed flux:160161\begin{equation}162F_{\text{in}} = \frac{S_0 (1 - \alpha)}{4} \approx 238 \text{ W/m}^2163\label{eq:incoming}164\end{equation}165166The factor of 4 arises because the sphere's surface area is 4 times its cross-sectional area.167168\subsection{Outgoing Thermal Radiation}169170Earth radiates from its entire surface according to the Stefan-Boltzmann law. For an effective emission temperature $T_e$:171172\begin{equation}173F_{\text{out}} = \sigma T_e^4174\label{eq:outgoing}175\end{equation}176177\subsection{Equilibrium Temperature Without Atmosphere}178179Setting $F_{\text{in}} = F_{\text{out}}$ and solving for temperature:180181\begin{equation}182T_e = \left(\frac{S_0 (1 - \alpha)}{4\sigma}\right)^{1/4}183\label{eq:equilibrium}184\end{equation}185186\begin{pycode}187# Calculate equilibrium temperature without atmosphere188T_equilibrium = ((S0 * (1 - alpha)) / (4 * sigma))**0.25189F_absorbed = S0 * (1 - alpha) / 4190191print(r'\begin{equation*}')192print(f'T_e = \\left(\\frac{{{S0:.0f} \\times (1 - {alpha:.2f})}}{{4 \\times {sigma:.2e}}}\\right)^{{1/4}} = {T_equilibrium:.1f} \\text{{ K}} = {T_equilibrium - 273.15:.1f}^\\circ\\text{{C}}')193print(r'\end{equation*}')194\end{pycode}195196This is 33 K (33$^\circ$C) colder than Earth's actual average surface temperature of approximately 288 K (15$^\circ$C). The difference is due to the greenhouse effect.197198%------------------------------------------------------------------------------199\section{The Greenhouse Effect}200%------------------------------------------------------------------------------201202The atmosphere is largely transparent to incoming shortwave solar radiation but absorbs and re-emits outgoing longwave (infrared) radiation. Greenhouse gases---primarily H$_2$O, CO$_2$, CH$_4$, N$_2$O, and O$_3$---are responsible for this absorption.203204\subsection{Single-Layer Atmosphere Model}205206Consider a simplified model with a single atmospheric layer at temperature $T_a$ that is:207\begin{itemize}208\item Transparent to solar radiation209\item Perfectly absorbing (emissivity $\epsilon = 1$) for infrared radiation210\end{itemize}211212The atmospheric layer radiates both upward (to space) and downward (to the surface). At equilibrium:213214\textbf{Atmosphere energy balance:}215\begin{equation}216\sigma T_s^4 = 2\sigma T_a^4217\end{equation}218219The atmosphere absorbs surface radiation and emits equally up and down.220221\textbf{Surface energy balance:}222\begin{equation}223F_{\text{in}} + \sigma T_a^4 = \sigma T_s^4224\end{equation}225226The surface receives both solar radiation and downwelling radiation from the atmosphere.227228Solving these equations:229230\begin{equation}231T_a = T_e \quad \text{and} \quad T_s = 2^{1/4} T_e \approx 1.19 T_e232\end{equation}233234\begin{pycode}235# Single layer atmosphere model236T_surface_1layer = 2**0.25 * T_equilibrium237T_atmosphere = T_equilibrium238239print(f'With a single-layer atmosphere:')240print(f' - Atmospheric temperature: $T_a = {T_atmosphere:.1f}$ K')241print(f' - Surface temperature: $T_s = {T_surface_1layer:.1f}$ K = ${T_surface_1layer - 273.15:.1f}^\\circ$C')242print(f' - Greenhouse warming: ${T_surface_1layer - T_equilibrium:.1f}$ K')243\end{pycode}244245\subsection{Multi-Layer Atmosphere Model}246247With $n$ atmospheric layers, each transparent to solar but opaque to infrared:248249\begin{equation}250T_s = (n+1)^{1/4} T_e251\end{equation}252253\begin{pycode}254# Multi-layer atmosphere model255fig, ax = plt.subplots(figsize=(10, 6))256257n_layers = np.arange(0, 6)258T_surface = (n_layers + 1)**0.25 * T_equilibrium259260ax.bar(n_layers, T_surface - 273.15, color='coral', edgecolor='darkred', alpha=0.8)261ax.axhline(288 - 273.15, color='green', linestyle='--', linewidth=2,262label=f'Observed Earth: 15$^\\circ$C')263ax.axhline(T_equilibrium - 273.15, color='blue', linestyle='--', linewidth=2,264label=f'No atmosphere: {T_equilibrium - 273.15:.0f}$^\\circ$C')265266ax.set_xlabel('Number of Atmospheric Layers')267ax.set_ylabel('Surface Temperature [$^\\circ$C]')268ax.set_title('Greenhouse Effect: Multi-Layer Atmosphere Model')269ax.legend()270ax.grid(True, alpha=0.3, axis='y')271ax.set_xticks(n_layers)272273# Annotate274for i, (n, T) in enumerate(zip(n_layers, T_surface)):275ax.annotate(f'{T-273.15:.0f}$^\\circ$C',276xy=(n, T-273.15),277xytext=(0, 5),278textcoords='offset points',279ha='center', fontsize=10)280281plt.tight_layout()282plt.savefig('energy_balance_greenhouse.pdf', bbox_inches='tight')283plt.close()284\end{pycode}285286\begin{figure}[H]287\centering288\includegraphics[width=0.9\textwidth]{energy_balance_greenhouse.pdf}289\caption{Surface temperature as a function of the number of perfectly absorbing atmospheric layers. Each layer adds additional greenhouse warming by trapping outgoing infrared radiation. Earth's actual atmosphere behaves approximately like a 1-2 layer model, producing the observed 33 K of greenhouse warming. The simple model captures the essential physics: adding greenhouse gases (effectively adding partial ``layers'') increases surface temperature.}290\label{fig:greenhouse}291\end{figure}292293%------------------------------------------------------------------------------294\section{Radiative Forcing and Climate Sensitivity}295%------------------------------------------------------------------------------296297\subsection{Radiative Forcing}298299Radiative forcing ($\Delta F$) measures the change in net radiative flux at the tropopause due to a perturbation (e.g., increased CO$_2$). For a doubling of CO$_2$:300301\begin{equation}302\Delta F_{2\times\text{CO}_2} \approx 5.35 \ln\left(\frac{C}{C_0}\right) \approx 3.7 \text{ W/m}^2303\label{eq:forcing}304\end{equation}305306where $C$ is the CO$_2$ concentration and $C_0$ is the reference concentration.307308\subsection{Climate Sensitivity Parameter}309310The climate sensitivity parameter $\lambda$ relates radiative forcing to equilibrium temperature change:311312\begin{equation}313\Delta T = \lambda \Delta F314\label{eq:sensitivity}315\end{equation}316317For a blackbody (no feedbacks), differentiating the Stefan-Boltzmann law:318319\begin{equation}320\lambda_0 = \frac{\dd T}{\dd F} = \frac{1}{4\sigma T^3} \approx 0.27 \text{ K/(W/m}^2)321\end{equation}322323This gives a temperature change of about 1.0 K for CO$_2$ doubling. However, feedbacks amplify this response.324325\begin{pycode}326# Climate sensitivity analysis327T_ref = 288 # Reference temperature [K]328lambda_0 = 1 / (4 * sigma * T_ref**3) # No-feedback sensitivity329330# Radiative forcing for CO2 doubling331Delta_F_2xCO2 = 5.35 * np.log(2)332333# Temperature change without feedbacks334Delta_T_no_feedback = lambda_0 * Delta_F_2xCO2335336# With feedbacks (IPCC range: 2.5-4.0 K for 2xCO2, central estimate ~3 K)337# This corresponds to lambda ~ 0.8-1.2 K/(W/m^2)338feedback_factors = np.array([1.0, 2.0, 2.5, 3.0, 3.5]) # Feedback amplification339lambda_values = lambda_0 * feedback_factors340Delta_T_values = lambda_values * Delta_F_2xCO2341342# Create visualization343fig, axes = plt.subplots(1, 2, figsize=(12, 5))344345# Left: Radiative forcing vs CO2346ax = axes[0]347CO2_ratios = np.linspace(0.5, 4, 100)348Delta_F = 5.35 * np.log(CO2_ratios)349350ax.plot(CO2_ratios * 280, Delta_F, 'b-', linewidth=2)351ax.axvline(560, color='red', linestyle='--', alpha=0.7, label='2x pre-industrial (560 ppm)')352ax.axvline(420, color='orange', linestyle='--', alpha=0.7, label='Current (~420 ppm)')353ax.axvline(280, color='green', linestyle='--', alpha=0.7, label='Pre-industrial (280 ppm)')354355ax.set_xlabel('CO$_2$ Concentration [ppm]')356ax.set_ylabel('Radiative Forcing [W/m$^2$]')357ax.set_title('Radiative Forcing from CO$_2$')358ax.legend(loc='upper left')359ax.grid(True, alpha=0.3)360ax.set_xlim(140, 1120)361362# Right: Temperature response363ax = axes[1]364bar_colors = ['lightblue', 'skyblue', 'steelblue', 'royalblue', 'navy']365bars = ax.bar(range(len(feedback_factors)), Delta_T_values,366color=bar_colors, edgecolor='black')367368ax.set_xticks(range(len(feedback_factors)))369ax.set_xticklabels([f'{f:.1f}x' for f in feedback_factors])370ax.set_xlabel('Feedback Amplification Factor')371ax.set_ylabel('Temperature Change for 2xCO$_2$ [K]')372ax.set_title('Equilibrium Climate Sensitivity')373374# IPCC likely range375ax.axhspan(2.5, 4.0, alpha=0.2, color='red', label='IPCC likely range')376ax.axhline(3.0, color='red', linestyle='--', linewidth=2, label='Best estimate: 3 K')377ax.legend(loc='upper left')378ax.grid(True, alpha=0.3, axis='y')379380for i, dT in enumerate(Delta_T_values):381ax.annotate(f'{dT:.1f} K', xy=(i, dT), xytext=(0, 5),382textcoords='offset points', ha='center', fontsize=10)383384plt.tight_layout()385plt.savefig('energy_balance_sensitivity.pdf', bbox_inches='tight')386plt.close()387\end{pycode}388389\begin{figure}[H]390\centering391\includegraphics[width=\textwidth]{energy_balance_sensitivity.pdf}392\caption{Left: Radiative forcing increases logarithmically with CO$_2$ concentration. The logarithmic relationship means that each doubling adds the same forcing (~3.7 W/m$^2$). Right: Equilibrium temperature change depends strongly on feedback processes. Without feedbacks (1.0x), CO$_2$ doubling causes ~1 K warming. With realistic feedbacks (water vapor, ice-albedo, clouds), the response is amplified to 2.5-4.0 K (IPCC likely range). The central estimate of 3 K corresponds to a feedback amplification of about 2.8x.}393\label{fig:sensitivity}394\end{figure}395396%------------------------------------------------------------------------------397\section{Time-Dependent Energy Balance}398%------------------------------------------------------------------------------399400The equilibrium analysis assumes instantaneous adjustment, but in reality, Earth's climate system has thermal inertia due to the ocean's heat capacity. The time-dependent energy balance equation is:401402\begin{equation}403C \frac{\dd T}{\dd t} = F_{\text{in}} - F_{\text{out}} = \frac{S_0(1-\alpha)}{4} - \sigma T^4 + \Delta F404\label{eq:time-dependent}405\end{equation}406407where $C$ is the effective heat capacity [J/m$^2$/K] and $\Delta F$ is any additional forcing.408409\subsection{Linearized Response}410411Near equilibrium temperature $T_0$, we can linearize:412413\begin{equation}414C \frac{\dd(\Delta T)}{\dd t} = \Delta F - \frac{\Delta T}{\lambda}415\end{equation}416417This gives an exponential approach to equilibrium with time constant:418419\begin{equation}420\tau = C \lambda421\end{equation}422423For the ocean mixed layer ($C \approx 4 \times 10^8$ J/m$^2$/K) and $\lambda \approx 1$ K/(W/m$^2$):424425\begin{equation}426\tau \approx 4 \times 10^8 \text{ s} \approx 13 \text{ years}427\end{equation}428429\begin{pycode}430# Time-dependent energy balance model431def energy_balance_ode(T, t, C, S0, alpha, sigma, Delta_F_func):432"""433Time derivative of temperature for the energy balance model.434435Parameters:436-----------437T : float438Current temperature [K]439t : float440Time [years]441C : float442Heat capacity [J/m^2/K]443Delta_F_func : callable444Function returning radiative forcing at time t445"""446F_in = S0 * (1 - alpha) / 4447F_out = sigma * T**4448Delta_F = Delta_F_func(t)449450dTdt = (F_in - F_out + Delta_F) / C451return dTdt * 3.154e7 # Convert from K/s to K/year452453# Model parameters454C_mixed_layer = 4e8 # Ocean mixed layer heat capacity [J/m^2/K]455C_deep_ocean = 20e8 # Deep ocean heat capacity [J/m^2/K]456457# Forcing scenarios458def step_forcing(t, t_start=10, magnitude=3.7):459"""Step increase in forcing (like sudden CO2 doubling)"""460return magnitude if t >= t_start else 0461462def ramp_forcing(t, t_start=10, rate=0.037):463"""Linear increase in forcing (like gradual CO2 rise)"""464return max(0, rate * (t - t_start))465466# Time array467t_span = np.linspace(0, 200, 1000)468T0 = T_equilibrium # Start at no-atmosphere equilibrium469470# Solve for different scenarios471scenarios = {472'Step forcing (mixed layer)': (C_mixed_layer, lambda t: step_forcing(t)),473'Step forcing (deep ocean)': (C_deep_ocean, lambda t: step_forcing(t)),474'Ramp forcing (1%/year)': (C_mixed_layer, lambda t: ramp_forcing(t, rate=0.037)),475}476477fig, axes = plt.subplots(1, 2, figsize=(12, 5))478479# Left: Temperature response480ax = axes[0]481colors = ['blue', 'red', 'green']482for (name, (C, forcing)), color in zip(scenarios.items(), colors):483solution = odeint(energy_balance_ode, T0, t_span,484args=(C, S0, alpha, sigma, forcing))485# Calculate Delta T relative to equilibrium486T_eq_new = ((S0*(1-alpha)/4 + 3.7) / sigma)**0.25 if 'Step' in name else None487ax.plot(t_span, solution[:, 0], color=color, linewidth=2, label=name)488489ax.axhline(T_equilibrium, color='gray', linestyle=':', alpha=0.7)490ax.axvline(10, color='gray', linestyle='--', alpha=0.5)491492ax.set_xlabel('Time [years]')493ax.set_ylabel('Temperature [K]')494ax.set_title('Temperature Response to Forcing')495ax.legend(loc='lower right')496ax.grid(True, alpha=0.3)497ax.set_xlim(0, 200)498499# Right: Energy imbalance500ax = axes[1]501for (name, (C, forcing)), color in zip(scenarios.items(), colors):502solution = odeint(energy_balance_ode, T0, t_span,503args=(C, S0, alpha, sigma, forcing))504# Calculate energy imbalance505imbalance = []506for i, t in enumerate(t_span):507T = solution[i, 0]508F_in = S0 * (1 - alpha) / 4509F_out = sigma * T**4510Delta_F = forcing(t)511imbalance.append(F_in - F_out + Delta_F)512ax.plot(t_span, imbalance, color=color, linewidth=2, label=name)513514ax.axhline(0, color='gray', linestyle=':', alpha=0.7)515ax.axvline(10, color='gray', linestyle='--', alpha=0.5)516517ax.set_xlabel('Time [years]')518ax.set_ylabel('Energy Imbalance [W/m$^2$]')519ax.set_title('Top-of-Atmosphere Energy Imbalance')520ax.legend(loc='upper right')521ax.grid(True, alpha=0.3)522ax.set_xlim(0, 200)523524plt.tight_layout()525plt.savefig('energy_balance_transient.pdf', bbox_inches='tight')526plt.close()527\end{pycode}528529\begin{figure}[H]530\centering531\includegraphics[width=\textwidth]{energy_balance_transient.pdf}532\caption{Transient response of the climate system to radiative forcing, solved using the time-dependent energy balance equation. Left: Temperature evolution after forcing begins at year 10. The mixed layer response ($\tau \approx 13$ years) is faster than the deep ocean response ($\tau \approx 65$ years). A gradual ramp forcing produces continuous warming. Right: The top-of-atmosphere energy imbalance---positive values indicate the planet is absorbing more energy than it radiates, driving warming. The imbalance gradually decreases as temperature rises and outgoing radiation increases.}533\label{fig:transient}534\end{figure}535536%------------------------------------------------------------------------------537\section{Feedback Mechanisms}538%------------------------------------------------------------------------------539540Climate feedbacks amplify or dampen the initial temperature response. The main feedbacks are:541542\subsection{Water Vapor Feedback (Positive)}543544As temperature increases, more water evaporates, and since water vapor is a greenhouse gas, this amplifies warming:545546\begin{equation}547f_{\text{WV}} = \frac{\dd \ln(e_s)}{\dd T} \approx 0.07 \text{ K}^{-1}548\end{equation}549550where $e_s$ is the saturation vapor pressure (Clausius-Clapeyron relation).551552\subsection{Ice-Albedo Feedback (Positive)}553554Warming melts ice and snow, which are highly reflective. The exposed ocean or land absorbs more sunlight:555556\begin{equation}557f_{\text{ice}} = -\frac{\partial \alpha}{\partial T} \cdot \frac{S_0}{4\sigma T^3}558\end{equation}559560\subsection{Planck Feedback (Negative)}561562This is the fundamental stabilizing feedback: as Earth warms, it radiates more energy to space:563564\begin{equation}565f_{\text{Planck}} = -4\sigma T^3 \approx -3.2 \text{ W/m}^2/\text{K}566\end{equation}567568\begin{pycode}569# Feedback visualization570fig, ax = plt.subplots(figsize=(10, 6))571572# Feedback contributions (approximate values from IPCC AR6)573feedbacks = {574'Planck': -3.2,575'Water Vapor': 1.8,576'Lapse Rate': -0.6,577'Ice-Albedo': 0.4,578'Cloud (net)': 0.5,579}580581names = list(feedbacks.keys())582values = list(feedbacks.values())583colors = ['green' if v < 0 else 'red' for v in values]584585bars = ax.barh(names, values, color=colors, alpha=0.7, edgecolor='black')586ax.axvline(0, color='black', linewidth=1)587588# Net feedback589net_feedback = sum(values)590ax.axvline(net_feedback, color='purple', linestyle='--', linewidth=2)591ax.annotate(f'Net: {net_feedback:.1f}', xy=(net_feedback, -0.5), fontsize=12, color='purple')592593ax.set_xlabel('Feedback Strength [W/m$^2$/K]')594ax.set_title('Climate Feedback Contributions')595ax.grid(True, alpha=0.3, axis='x')596597# Add legend598from matplotlib.patches import Patch599legend_elements = [600Patch(facecolor='green', alpha=0.7, edgecolor='black', label='Stabilizing (negative)'),601Patch(facecolor='red', alpha=0.7, edgecolor='black', label='Amplifying (positive)')602]603ax.legend(handles=legend_elements, loc='lower right')604605plt.tight_layout()606plt.savefig('energy_balance_feedbacks.pdf', bbox_inches='tight')607plt.close()608609# Calculate amplification factor610lambda_0_value = 1 / 3.2 # No-feedback sensitivity [K/(W/m^2)]611lambda_net = 1 / (-net_feedback) # Net sensitivity612amplification = lambda_net / lambda_0_value613614print(f'\\noindent Feedback analysis:')615print(f'\\begin{{itemize}}')616print(f'\\item No-feedback sensitivity: $\\lambda_0 = {lambda_0_value:.2f}$ K/(W/m$^2$)')617print(f'\\item Net feedback: ${net_feedback:.1f}$ W/m$^2$/K')618print(f'\\item Net sensitivity: $\\lambda = {lambda_net:.2f}$ K/(W/m$^2$)')619print(f'\\item Amplification factor: ${amplification:.1f}\\times$')620print(f'\\end{{itemize}}')621\end{pycode}622623\begin{figure}[H]624\centering625\includegraphics[width=0.9\textwidth]{energy_balance_feedbacks.pdf}626\caption{Climate feedback contributions based on IPCC AR6 estimates. The Planck feedback is the fundamental negative feedback that stabilizes climate. Water vapor provides the strongest positive feedback through the greenhouse effect. The lapse rate feedback is negative because warming increases the rate of temperature decrease with altitude. Ice-albedo and cloud feedbacks are both positive on average. The net feedback (purple line) is negative, meaning the climate is stable, but the positive feedbacks amplify the initial response by roughly a factor of 3.}627\label{fig:feedbacks}628\end{figure}629630%------------------------------------------------------------------------------631\section{Conclusions}632%------------------------------------------------------------------------------633634This analysis has developed the fundamental physics of Earth's energy balance:635636\begin{enumerate}637\item \textbf{Equilibrium temperature}: Without an atmosphere, Earth's equilibrium temperature would be \pyc{print(f'{T_equilibrium:.1f}')} K (\pyc{print(f'{T_equilibrium - 273.15:.1f}')}$^\circ$C), about 33 K colder than observed.638639\item \textbf{Greenhouse effect}: The atmosphere acts like multiple absorbing layers, raising surface temperature to the observed \pyc{print(f'{288:.0f}')} K through absorption and re-emission of infrared radiation.640641\item \textbf{Climate sensitivity}: A doubling of CO$_2$ produces \pyc{print(f'{Delta_F_2xCO2:.1f}')} W/m$^2$ of radiative forcing. With feedbacks, this translates to 2.5--4.0 K of warming.642643\item \textbf{Thermal inertia}: The ocean's heat capacity delays the climate response, with adjustment timescales of decades to centuries depending on depth.644645\item \textbf{Feedback amplification}: Positive feedbacks (water vapor, ice-albedo, clouds) amplify the initial response by a factor of approximately \pyc{print(f'{amplification:.1f}')}.646\end{enumerate}647648The zero-dimensional model captures the essential physics while remaining tractable. More sophisticated models incorporate spatial variations, seasonal cycles, and coupled atmosphere-ocean dynamics, but the fundamental energy balance constraints remain.649650%------------------------------------------------------------------------------651\section{References}652%------------------------------------------------------------------------------653654\begin{enumerate}655\item Hartmann, D.L. (2016). \textit{Global Physical Climatology}, 2nd ed. Academic Press.656657\item Pierrehumbert, R.T. (2010). \textit{Principles of Planetary Climate}. Cambridge University Press.658659\item IPCC (2021). Climate Change 2021: The Physical Science Basis. Cambridge University Press.660661\item Kiehl, J.T. \& Trenberth, K.E. (1997). Earth's Annual Global Mean Energy Budget. \textit{Bulletin of the American Meteorological Society}, 78(2), 197-208.662663\item Roe, G. (2009). Feedbacks, Timescales, and Seeing Red. \textit{Annual Review of Earth and Planetary Sciences}, 37, 93-115.664665\item Sherwood, S.C. et al. (2020). An Assessment of Earth's Climate Sensitivity Using Multiple Lines of Evidence. \textit{Reviews of Geophysics}, 58, e2019RG000678.666\end{enumerate}667668\end{document}669670671