Exercise 1, policy goals under uncertainty#
Exercise 1, policy goals under uncertainty#
A recent ground-breaking review paper produced the most comprehensive and up-to-date estimate of the climate feedback parameter, which they find to be
\(B \approx \mathcal{N}(-1.3, 0.4),\)
i.e. our knowledge of the real value is normally distributed with a mean value \(\overline{B} = -1.3\) W/m²/K and a standard deviation \(\sigma = 0.4\) W/m²/K. These values are not very intuitive, so let us convert them into more policy-relevant numbers.
Definition: Equilibrium climate sensitivity (ECS) is defined as the amount of warming \(\Delta T\) caused by a doubling of \(CO_2\) (e.g. from the pre-industrial value 280 ppm to 560 ppm), at equilibrium.
At equilibrium, the energy balance model equation is:
\(0 = \frac{S(1 - α)}{4} - (A - BT_{eq}) + a \ln\left( \frac{2\;\text{CO}_{2\text{PI}}}{\text{CO}_{2\text{PI}}} \right)\)
From this, we subtract the preindustrial energy balance, which is given by:
\(0 = \frac{S(1-α)}{4} - (A - BT_{0}),\)
The result of this subtraction, after rearranging, is our definition of \(\text{ECS}\):
\(\text{ECS} \equiv T_{eq} - T_{0} = -\frac{a\ln(2)}{B}\)
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
from energy_balance_model import ebm
# create ecs(B, a) function
def double_CO2(t):
return 280 * 2
f, ax = plt.subplots(1)
EBM = ebm(14, 0, 1., double_CO2)
EBM.run(300)
ax.plot(EBM.t, EBM.T - EBM.T[0], label = "$\Delta T (t) = T(t) - T_0$", color = "red")
ax.axhline(ecs(EBM.B, EBM.a), label = "ECS", color = "darkred", ls = "--")
ax.legend()
ax.grid()
ax.set_title("Transient response to instant doubling of CO$_2$")
ax.set_ylabel("temperature [°C]")
ax.set_xlabel("years after doubling")
The plot above provides an example of an “abrupt 2xCO\(_2\)” experiment, a classic experimental treatment method in climate modelling which is used in practice to estimate ECS for a particular model (Note: in complicated climate models the values of the parameters \(a\) and \(B\) are not specified a priori, but emerge as outputs for the simulation).
The simulation begins at the preindustrial equilibrium, i.e. a temperature °C is in balance with the pre-industrial CO\(_2\) concentration of 280 ppm until CO\(_2\) is abruptly doubled from 280 ppm to 560 ppm. The climate responds by rapidly warming, and after a few hundred years approaches the equilibrium climate sensitivity value, by definition.
# Create a graph to visualize ECS as a function of B (B should be on the x axis)
# calculate the range from -2 to -0.1 with 0.1 as a step size
# Note use plt.scatter for plotting and
Question:
(1) What does it mean for a climate system to have a more negative value of \(B\)? Explain why we call \(B\) the climate feedback parameter.
Answer:
(2) What happens when \(B\) is greater than or equal to zero?
Answer:
Exercise 1.2 - _Doubling CO#
To compute ECS, we doubled the \(CO_2\) in our atmosphere. This factor 2 is not entirely arbitrary: without substantial effort to reduce \(CO_2\) emissions, we are expected to at least double the \(CO_2\) in our atmosphere by 2100.
Right now, our \(CO_2\) concentration is 415 ppm – 1.482 times the pre-industrial value of 280 ppm from 1850.
The \(CO_2\) concentrations in the future depend on human action. There are several models for future concentrations, which are formed by assuming different policy scenarios. A baseline model is RCP8.5 - a “worst-case” high-emissions scenario. In our notebook, this model is given as a function of t
.
def CO2_RCP85(t):
return 280 * (1+ ((t-1850)/220)**3 * np.maximum(1., np.exp(((t-1850)-170)/100)))
t = np.arange(1850, 2100)
plt.ylabel("CO$_2$ concentration [ppm]")
plt.plot(t, CO2_RCP85(t));
Question:
In what year are we expected to have doubled the \(CO_2\) concentration, under policy scenario RCP8.5?
Hint: the function
np.where()
might be useful
# Enter your code here
Answer:
Exercise 1.3 - Uncertainty in B#
The climate feedback parameter B
is not something that we can control– it is an emergent property of the global climate system. Unfortunately, B
is also difficult to quantify empirically (the relevant processes are difficult or impossible to observe directly), so there remains uncertainty as to its exact value.
A value of B
close to zero means that an increase in \(CO_2\) concentrations will have a larger impact on global warming, and that more action is needed to stay below a maximum temperature. In answering such policy-related question, we need to take the uncertainty in B
into account. In this exercise, we will do so using a Monte Carlo simulation: we generate a sample of values for B
, and use these values in our analysis.
Generate a probability distribution for for \(B_{avg}\) above. Plot a histogram.
Hint: use the functions
np.random.normal() # with 50000 samples
and plot with
plt.hist()
sigma = 0.4
b_avg = -1.3
samples = # Enter code here
# plot here
plt.xlabel("B [W/m²/K]")
plt.ylabel("samples")
Generate a probability distribution for the ECS based on the probability distribution function for \(B\) above.
values = # your code here
values = np.where((values < -20) | (values > 20) , np.nan, values) # drop outlier
plt.hist(values, bins = 20)
plt.xlim([0, 20])
plt.xlabel("Temperature [°C]")
It looks like the ECS distribution is not normally distributed, even though \(B\) is.
Question: How does \(\overline{\text{ECS}(B)}\) compare to \(\text{ECS}(\overline{B})\)? What is the probability that \(\text{ECS}(B)\) lies above \(\text{ECS}(\overline{B})\)?
# your code here
Question: Does accounting for uncertainty in feedbacks make our expectation of global warming better (less implied warming) or worse (more implied warming)?
Answer:
Exercise 1.5 - Running the model#
In the lecture notebook we introduced a class ebm
(energy balance model), which contains:
the parameters of our climate simulation (
C
,a
,A
,B
,CO2_PI
,alpha
,S
, see details below)a function
CO2
, which maps a timet
to the concentrations at that year. For example, we use the functiont -> 280
to simulate a model with concentrations fixed at 280 ppm.
ebm
also contains the simulation results, in two arrays:
T
is the array of tempartures (°C,Float64
).t
is the array of timestamps (years,Float64
), of the same size asT
.
You can set up an instance of ebm
like so:
def my_co2function(t):
# here we imply NO co2 increase
return 280
my_model = ebm(T=14, t=0, deltat=1., CO2=my_co2function)
my_model
Let’s look into our ebm object
attrs = vars(my_model)
print(', \n'.join("%s: %s" % item for item in attrs.items()))
What function do we have?
help(my_model)
# Run the model
EBM = ebm(14, 1850, 1, my_co2function)
EBM.run(10)
Again, look inside simulated_model
and notice that T
and t
have accumulated the simulation results.
In this simulation, we used T0 = 14
and CO2 = 280
, which is why T
is constant during our simulation. These parameters are the default, pre-industrial values, and our model is based on this equilibrium.
Question
: Run a simulation starting at 1850 with policy scenario RCP8.5, and plot the computed temperature graph. What is the global temperature at 2100?
def CO2_RCP85(t):
return 280 * (1+ ((t-1850)/220)**3 * np.maximum(1., np.exp(((t-1850)-170)/100)))
## Run the model here
We can change values before running the model.
EBM = ebm(15, 1850, 1, my_co2function)
EBM.B = -2
EBM.run(10)
EBM.T
Exercise 1.6 - Application to policy relevant questions (BONUS)#
We talked about two emissions scenarios: RCP2.6 (strong mitigation - controlled CO2 concentrations) and RCP8.5 (no mitigation - high CO2 concentrations). These are given by the following functions
def CO2_RCP26(t):
return 280 * (1+ ((t-1850)/220)**3 * np.minimum(1., np.exp(-((t-1850)-170)/100)))
def CO2_RCP85(t):
return 280 * (1+ ((t-1850)/220)**3 * np.maximum(1., np.exp(((t-1850)-170)/100)))
We are interested in how the uncertainty in our input \(B\) (the climate feedback paramter) propagates through our model to determine the uncertainty in our output \(T(t)\), for a given emissions scenario. The goal of this exercise is to answer the following by using Monte Carlo Simulation for uncertainty propagation:
What is the probability that we see more than 2°C of warming by 2100 under the low-emissions scenario RCP2.6? What about under the high-emissions scenario RCP8.5?