The basic setup model has production (or output) $ Y $ as a function of the capital stock $ K $, the labor force $ L $, the efficiency of labor $ E $, and the decreasing-returns parameter $ \alpha $:
(1) $ Y = K^{\alpha}(EL)^{1-\alpha} $ :: production
(2) $ \ln(Y) = \alpha\ln(K) + (1-\alpha)\left(\ln(E)+\ln(L)\right) $ :: log production
Growth rates of the capital stock, the labor force, the efficiency of labor, and of production as functions of the savings-investment rate $ s $, the population and labor force growth rate $ n $, the efficiency-of-labor growth rate $ g $, and the depreciation rate $ \delta $:
(3) $ \frac{dK/dt}{K} = \frac{d\ln(K)}{dt} = g_k = \frac{sY}{K} - \delta $ :: the proportional rate of growth of the capital stock
(4) $ \frac{dL/dt}{L} = \frac{d\ln(L)}{dt} = n $ :: the proportional rate of growth of the labor force and population
(5) $ \frac{dE/dt}{E} = \frac{d\ln(E)}{dt} = g $ :: the proportional rate of growth of the efficiency of labor
(6) $ \frac{d\ln(Y)}{dt} = g_{n+y} = \alpha g_k + (1-\alpha)n + (1-\alpha)g $ :: the proportional rate of growth of total production
And define the capital-output ratio:
(7) $ \kappa = \frac{K}{Y} $
(8) $ \ln(\kappa) = \ln(K) - \ln(Y) $
(9) $ \frac{d\ln(\kappa)}{dt} = g_\kappa = g_k - g_y $ :: proportional growth rate of the capital-output ratio
Now fix the parameters $ \alpha, \beta, s, h $, and look for a situation in which $ g_\kappa = 0 $: in which the capital stock $ K $ and production $ Y $ are growing at the same rate so that the capital-output ratio $ g_\kappa $ is constant.
Starting from (9) and substituting:
(10) $ g_\kappa = g_k - \left( \alpha g_k + (1-\alpha)n + (1-\alpha)g \right) $
(11) $ g_\kappa - g_{y+n} = (1-\alpha)\left( g_k - n - g \right) $
(12) $ g_\kappa = (1-\alpha)\left( \frac{sY}{K} - \delta - n - g \right) $
(13) $ n + g + \delta = \frac{sY}{K} $ whenever $ g_\kappa = 0 $
(14) $ \kappa = \frac{K}{Y} = \frac{s}{n + g + \delta} $ whenever $ g_\kappa = 0 $
So we define the steady-state growth equilibrium capital-output ratio:
(15) $ \kappa^*_{[s,n,g,\delta]} = \left( \frac{K}{Y} \right)^* = \frac{s}{n + g + \delta} $
Recall 2:
(2) $ \ln(Y) = \alpha\ln(K) + (1-\alpha)\left(\ln(E)+\ln(L)\right) $
from that derive:
(16) $ \ln(Y) = \alpha\left(\ln(\kappa) + \ln(Y) \right) + (1-\alpha)\left(\ln(E)+\ln(L)\right) $
(17) $ (1-\alpha)\ln(Y) = \alpha\ln(\kappa) + (1-\alpha)\left(\ln(E)+\ln(L)\right) $
(18) $ \ln(Y) = \left( \frac{\alpha}{1-\alpha} \right)\ln(\kappa) + \ln(L) + \ln(E) $
(19) $ \ln \left( \frac{Y}{L} \right) = \left( \frac{\alpha}{1-\alpha} \right)\ln(\kappa) + \ln(E) $
These $ \alpha/(1-\alpha) $ terms are getting annoying:
(20) $ \theta = \frac{\alpha}{1-\alpha} $
(21) $ \ln \left( \frac{Y}{L} \right) = \theta\ln(\kappa) + \ln(E) $
And so we define steady-state growth-path production-per-worker as:
(22) $ \ln \left( \frac{Y}{L} \right)^* = \theta \ln(\kappa^*) =+ \ln(E) $
(23) $ \left(\frac{Y}{L}\right)^* = \left(\kappa^*\right)^\theta E $
(24) $ \left(\frac{Y}{L}\right)^* = \left( \frac{s}{n+g+\delta} \right)^\theta E $
(25) $ \frac{d}{dt} \left(\frac{Y}{L}\right)^* = g $
Along the steady-state growth path, production per worker $ Y/L $, capital per worker $ K/L $, and the efficiency of labor $ E $ both grow at the proportional rate $ g $; the population and labor force $ L $ grows at the proportional rate $ n $; total production $ Y $ and the capital stock $ K $ grow at the proportional rate $ n + g $; and the capital-output ratio $ K/L $ is constant.
Now let's complicate the determinants of the efficiency of labor. Let's make its growth a function of the rate $ h $ at which economically useful ideas are generated, but also of the rate of population and labor force growth $ n $ because a higher population makes resources per capita scarce, as determined by an effect-of-resource scarcity parameter $ \gamma $:
(26) $ \frac{dE/dt}{E} = \frac{d\ln(E)}{dt} = g = h - \frac{n}{\gamma} $
Thus:
(27) $ \frac{d}{dt} \left(\frac{Y}{L}\right)^* = 0 $ whenever $ h - \frac{n}{\gamma} = 0 $
(28) $ n^{*mal} = \gamma h $ is the population growth rate at which $ \frac{d}{dt} \left(\frac{Y}{L}\right)^* = 0 $
When population is growing at the rate $ n^{*mal} $, the efficiency of labor—and thus the steady-state growth-path level of production per worker $ Y/L $—is constant.
Now let's make the rate of growth of the population and labor force depend on the level of prosperity $ y = Y/L $; on the "subsistence" standard of living for necessities $y^{sub} $; and also on the fraction $ 1/\phi $ of production that is devoted to necessities, not conveniences and luxuries, and thus enters into reproductive and survival fitness:
(29) $ \frac{dL/dt}{L} = \frac{d\ln(L)}{dt} = n = \beta \left( \frac{y}{\phi y^{sub}}-1 \right) $
Then for population to be growing at its Malthusian rate:
(30) $ \gamma h = \beta \left(\frac{1}{\phi}\right) \left( \frac{y}{y^{sub}}- \phi \right) $
(31) $ \frac{\phi \gamma h}{\beta} = \left( \frac{y}{y^{sub}}- \phi \right) $
(32) $ \frac{y}{y^{sub}} = \phi \left( 1 + \frac{\gamma h}{\beta} \right) $
(33) $ y^{*mal} = \phi y^{sub} \left( 1 + \frac{ n^{*mal}}{\beta}\right) = \phi y^{sub} \left( 1 + \frac{ \gamma h}{\beta}\right) $
Thus we have our equilibrium for the pre-industrial Malthusian economy:
Start with the rate $ h $ at which new economically-useful ideas are being generated and with the responsiveness $ \beta $ of population growth to increased prosperity.
From those derive the Malthusian rate of population growth: $ n^{*mal} = \gamma h $
Then the Malthusian standard of living is: $ y^{*mal} = \phi y^{sub} \left( 1 + \frac{ \gamma h}{\beta}\right) $
From 26, we can determine the log level $ E $ of the efficiency of labor:
(32) $ \ln(E) = \ln(H) - \frac{\ln(L)}{\gamma} $
Recall (24):
(24) $ y^* = \left( \frac{s}{n+g+\delta} \right)^\theta E $
Then:
(33) $ y^{*mal} = \left( \frac{s}{\gamma h +\delta} \right)^\theta E $
(34) $ \ln(\phi) + \ln\left( y^{sub} \right) + \ln\left(1 + \frac{\gamma h}{\beta} \right) = \theta \ln(s) - \theta \ln(\gamma h +\delta) + \ln(E) $
(35) $ \ln(y^{sub}) = \theta \ln(s) - \theta \ln(\gamma h +\delta) + \ln(H_t) - \frac{\ln(L_t)}{\gamma} - \ln(\phi) - \ln\left(1 + \frac{\gamma h}{\beta} \right) $
(36) $ \frac{\ln(L_t)}{\gamma} = \theta \ln(s) - \theta \ln(\gamma h +\delta) + \ln(H_t) - \ln(\phi) - \ln( y^{sub}) -ln\left(1 + \frac{\gamma h}{\beta} \right) $
Thus the population and labor force in the full Malthusian equilibrium will be:
(37) $ \ln(L_t^{*mal}) = \gamma \left[ \theta \ln(s) - \theta \ln(\gamma h +\delta) + \ln(H_t) - \ln(\phi) - \ln( y^{sub}) -ln\left(1 + \frac{\gamma h}{\beta} \right) \right] $
It might be worthwhile decomposing this into terms depending on: (1) the level and rate of growth of the stock of ideas; (2) the rule of law and thrift that drive investment; (3) luxuries (including urbanization and elites); and demography in form of sociological (and law-and-order) determinants of "subsistence":
(38) $ \ln(L_t^{*mal}) = \gamma \left[ \ln(H_t) - \theta \ln(\gamma h +\delta) -ln\left(1 + \frac{\gamma h}{\beta} \right) \right] + \gamma \left[ \theta \ln(s) \right] - \gamma \left[ \ln(\phi) \right] - \gamma \left[ \ln( y^{sub}) \right] $
And recall (31) for the full Malthusian equilibrium standard of living:
(31) $ y^{*mal} = \phi y^{sub} \left( 1 + \frac{ \gamma h}{\beta}\right) $
Plus for the rate of population growth:
(28) $ n^{*mal} = \gamma h $
Production per worker and thus prosperity is determined by (a) true subsistence, (b) the wedge between prosperity and reproductive fitness produced by spending on conveniences and luxuries that do not impact reproductive success, and (c) the wedge above subsistence needed to generate population growth consonant with the advance of knowledge and population pressure's generation of resource scarcity.
The level of population is:
# DEFINING CLASS MALTHUSIAN
#
# kept in delong_classes
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
class malthusian:
"""
Implements the Malthusian Model with:
1. population growth
n = β*(y/(ϕ ysub)-1)
2. growth of efficiency-of-labor
g = h-n/γ
"""
def __init__(self,
L = 1, # initial labor force
E = 1/3, # initial efficiency of labor
K = 3.0, # initial capital stock
# determinants of n (population growth):
β = 0.025, # responsiveness of population growth to increased prosperity.
ϕ = 1, # luxuries parameter
ysub = 1, # subsistence level
# determinants of g(efficiency-of-labor growth):
h = 0, # rate at which useful ideas are generated
γ = 2.0, # effect-of-resource scarcity parameter
s = 0.15, # savings-investment rate
α = 0.5, # orientation-of-growth-toward-capital parameter
δ = 0.05, # deprecation rate on capital parameter
):
self.L, self.E, self.K, self.h, self.γ, self.s, self.α, self.δ = L, E, K, h, γ, s, α, δ
self.β, self.ϕ, self.ysub = β, ϕ, ysub
# production (or output)
self.Y = self.K**self.α*(self.E*self.L)**(1-self.α)
self.y = self.Y/self.L
# capital-output ratio
self.κ = self.K/self.Y
# population growth
self.n = self.β*((self.y/(self.ϕ*self.ysub)) - 1)
# growth rate of efficiency-of-labor
self.g = self.h-self.n/self.γ
# store initial data
self.initdata = vars(self).copy()
def update(self):
# unpack parameters
K, s, Y, δ, L, n, E, g, α =self.K, self.s, self.Y, self.δ, self.L, self.n, self.E, self.g, self.α
β, ϕ, ysub, h, γ = self.β, self.ϕ, self.ysub, self.h, self.γ
#update variables
K = s*Y + (1-δ)*K
L = L*np.exp(n)
E = E*np.exp(g)
Y = K**α*(E*L)**(1-α)
y = Y/L
κ = K/Y
n = β*(y/(ϕ*ysub)-1)
g = h-n/γ
#store variables
self.K, self.s, self.Y, self.δ, self.L, self.n, self.E, self.g, self.α = K, s, Y, δ, L, n, E, g, α
self.κ, self.y = κ, y
def gen_seq(self, t, var = 'κ', init = True, log = False):
"Generate and return time series of selected variable. Variable is κ by default."
path = []
# initialize data
if init == True:
for para in self.initdata:
setattr(self, para, self.initdata[para])
for i in range(t):
path.append(vars(self)[var])
self.update()
if log == False:
return path
else:
return np.log(np.asarray(path))
def steady_state(self, disp = True):
"Calculate variable values in the steady state"
#unpack parameters
s, γ, h, δ, ϕ, ysub, β, α= self.s, self.γ, self.h, self.δ, self.ϕ, self.ysub, self.β, self.α
self.mal_κ = s/(γ*h+δ)
# malthusian rate of population growth
self.mal_n = γ*h
# malthusian standard of living
self.mal_y = ϕ*(ysub+γ*h/β)
self.mal_E = self.mal_y*((γ*h+δ)/s)**(α/(1-α))
if display == True:
return(f'steady-state capital-output ratio κ: {self.mal_κ:.2f}')
return(f'Malthusian rate of population growth n: {self.mal_n: .2f}')
return(f'Malthusian standard of living y: {self.mal_y:.2f}')
return(f'steady-state efficiency-of-labor E: {self.mal_E:.2f}')
else:
return(self.mal_κ,self.mal_n,self.mal_y,self.mal_E)
# TESTING THE MALTHUSIAN CLASS
#
# No idea stock growth (h = 0)
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import delong_classes
T = 1000
m_base = delong_classes.malthusian(K=3.0)
m_base.scenario = "base scenario"
m_alt = delong_classes.malthusian(K=3.0)
m_alt.scenario = "alt scenario"
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for m in m_base, m_alt:
lb = f'{m.scenario}: initial κ = {m.initdata["κ"]:.2f}'
axes[i,j].plot(m.gen_seq(T, var = figcontents[i,j][0], log = figcontents[i,j][2]),'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
# global legend
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run', size = 20)
plt.show()
# TESTING THE MALTHUSIAN CLASS
#
# Adding idea stock growth fast enough that
# (with γ=2) population will double every
# 700 years
#
# Starting the economy at the h=0 Malthusian
# steady-state
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import delong_classes
T = 1000
m_base = delong_classes.malthusian(h=.0005)
m_base.scenario = "base scenario"
m_alt = delong_classes.malthusian(h=.0005)
m_alt.scenario = "alt scenario"
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for m in m_base, m_alt:
lb = f'{m.scenario}: initial κ = {m.initdata["κ"]:.2f}'
axes[i,j].plot(m.gen_seq(T, var = figcontents[i,j][0], log = figcontents[i,j][2]),'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
# global legend
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run', size = 20)
plt.show()
Notice that the steady state is not affected by where we start.
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import delong_classes
m = delong_classes.malthusian(h=0.0005, E=0.354, K=3.06)
# generate and store sequences before the change:
T1 = 250 # time before change
T2 = 250 # time after change
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for scenario in {'base', 'with shock'}:
seq = m.gen_seq(T1, var = figcontents[i,j][0], log = figcontents[i,j][2])
lb = f'{scenario}'
if scenario == 'with shock':
m.h = 0
seq = np.append(seq, m.gen_seq(T2, var = figcontents[i,j][0], log = figcontents[i,j][2], init = False))
axes[i,j].plot(seq,'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run with Idea Shock', size = 20)
plt.show()
# THE COMING OF AN IMPERIAL PEACE
# φ = 1.25, s = 0.25
import numpy as np
import matplotlib.pyplot as plt
import delong_classes
m = delong_classes.malthusian(h=0.0005, E=0.354, K=3.06)
# generate and store sequences before the change:
T1 = 250 # time before change
T2 = 250 # time after change
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for scenario in {'base', 'with shock'}:
seq = m.gen_seq(T1, var = figcontents[i,j][0], log = figcontents[i,j][2])
lb = f'{scenario}'
if scenario == 'with shock':
m.φ = 1.25
m.s = 0.25
seq = np.append(seq, m.gen_seq(T2, var = figcontents[i,j][0], log = figcontents[i,j][2], init = False))
axes[i,j].plot(seq,'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run with Idea Shock', size = 20)
plt.show()
# THE COLLAPSE OF AN EMPIRE
# φ = 1.25, s = 0.25
import numpy as np
import matplotlib.pyplot as plt
import delong_classes
m = delong_classes.malthusian(h=0.0005, E=0.27, K=6.5, φ = 1.25, s = 0.25)
# generate and store sequences before the change:
T1 = 250 # time before change
T2 = 250 # time after change
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for scenario in {'base', 'with shock'}:
seq = m.gen_seq(T1, var = figcontents[i,j][0], log = figcontents[i,j][2])
lb = f'{scenario}'
if scenario == 'with shock':
m.φ = 1.0
m.s = 0.15
seq = np.append(seq, m.gen_seq(T2, var = figcontents[i,j][0], log = figcontents[i,j][2], init = False))
axes[i,j].plot(seq,'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run with Idea Shock', size = 20)
plt.show()
The plague decreased the total population (and thus labor force) to 1/10.
import numpy as np
import matplotlib.pyplot as plt
import delong_classes
m = delong_classes.malthusian(h=0.0005, E=0.354, K=3.06)
# generate and store sequences before the change:
T1 = 250 # time before change
T2 = 250 # time after change
figcontents = {
(0,0):('κ','Capital-Output Ratio', False),
(0,1):('E','Efficiency of Labor', False),
(1,0):('L','Log Labor Force', True),
(1,1):('K','Log Capital Stock', True),
(2,0):('Y','Log Output', True),
(2,1):('y','Output-per-worker', False)
}
num_rows, num_cols = 3,2
fig, axes = plt.subplots(num_rows, num_cols, figsize=(12, 12))
for i in range(num_rows):
for j in range(num_cols):
for scenario in {'base', 'with plague'}:
seq = m.gen_seq(T1, var = figcontents[i,j][0], log = figcontents[i,j][2])
lb = f'{scenario}'
if scenario == 'with plague':
m.L = 2/3*m.L
m.E = m.E*(2/3)**(-1/m.γ)
seq = np.append(seq, m.gen_seq(T2, var = figcontents[i,j][0], log = figcontents[i,j][2], init = False))
axes[i,j].plot(seq,'o-', lw=2, alpha=0.5, label=lb)
axes[i,j].set(title=figcontents[i,j][1])
axes[(0,0)].legend(loc='upper center', bbox_to_anchor=(1.1,1.3))
plt.suptitle('Malthusian Model: Simulation Run with Plague', size = 20)
plt.show()
To summarize, the shock on idea development will change the steady state and the development path, while a plague would not change the steady state.
(41) $ \ln(L_t^{*mal}) = \gamma \left[ \ln(H_t) - \theta \ln(\gamma h +\delta) -ln\left(1 + \frac{\gamma h}{\beta} \right) \right] + \gamma \left[ \theta \ln(s) \right] - \gamma \left[ \ln(\phi) \right] - \gamma \left[ \ln( y^{sub}) \right] $
And recall (31) for the full Malthusian equilibrium standard of living:
(42) $ y^{*mal} = \phi y^{sub} \left( 1 + \frac{ \gamma h}{\beta}\right) $
Plus for the rate of population growth:
(43) $ n^{*mal} = \gamma h $
Convergence:
(44) $ \frac{d\kappa_t}{dt} = - (1-\alpha)((1-1/\gamma)n(y_t) + h + \delta)(\kappa_t - \kappa^*) $
(45) $ \kappa^* = s/((1-1/\gamma)n(y_t) + h + \delta) $
(46) $ n(y_t) = \beta \left( \frac{y_t}{\phi y^{sub}}-1 \right) $
(47) $ y_t = \left(\kappa_t\right)^\theta E_t $
(48) $ \frac{1}{E_t}\frac{dE_t}{dt} = h - n(y_t)/\gamma $
(49) $ \frac{d\kappa_t}{dt} = s - (1-\alpha)\left(\left(1-\frac{1}{\gamma}\right)\beta \left( \frac{\left(\kappa_t\right)^\theta E_t }{\phi y^{sub}}-1 \right) + h + \delta \right)\kappa_t $
(50) $ \frac{dE_t}{dt} = \left( h - \frac{\beta \left( \frac{\left(\kappa_t\right)^\theta E_t }{\phi y^{sub}}-1 \right)}{\gamma} \right) E_t $
\kappa_t & E_t ➔ y_t
y_t ➔ n_t
n_t ➔ dE_t/dt
n_t ➔ d\kappa_t/dt