copyright by qiuying lai 2018
TRANSCRIPT
Copyright
by
Qiuying Lai
2018
The Thesis Committee for Qiuying Lai
Certifies that this is the approved version of the following thesis:
Macroscale Modeling Linking Energy and Economics:
Tests of Investment Choices
APPROVED BY
SUPERVISING COMMITTEE:
Carey W. King
Eric Kemp-Benedict
Michael P. Marder
Supervisor:
Macroscale Modeling Linking Energy and Economics:
Tests of Investment Choices
by
Qiuying Lai
Thesis
Presented to the Faculty of the Graduate School of
The University of Texas at Austin
in Partial Fulfillment
of the Requirements
for the Degree of
Master of Science in Energy and Earth Resources
The University of Texas at Austin
May 2018
iv
Acknowledgements
I would like to acknowledge Dr. Carey W. King from the University of Texas at
Austin (UT Austin) for his patient guidance and support. And I appreciate the academic
support from Dr. Michael P. Marder from UT Austin and Dr. Eric Kemp-Benedict from
the Stockholm Environment Institute. Last but not least, Mr. Richard J. Chuchla, Ms. Smith
Jessica and all the EER Program fellows have my sincere gratitude for providing the
favorable environment and the timely help in my study and life.
I would like to thank my family for their unconditional love, supporting me
materially and spiritually.
v
Abstract
Macroscale Modeling Linking Energy and Economics:
Tests of Investment Choices
Qiuying Lai, M.S.E.E.R.
The University of Texas at Austin, 2018
Supervisor: Carey W. King
Natural resources, especially energy, play a significant role in human society, from
economics to politics. A number of models has been built in the past to study the
relationship between natural resources and macroeconomics. These include biophysical
models for population and natural resource use, which omit many important economic
factors, such as debt, wages and employment. On the other hand there are economic models
of debt, employment, Gross Domestic Product and other such variables, but these omit
considerations of energy and natural resources. The goal of this study is to further develp
a model that links biophysical and economic fundamentals within a cohesive framework.
Based on the “HANDY” biophysical model and the Goodwin economic model, a
merged model has been developed to simulate the dynamics of an integrated system
associating natural resources and economics. This merged model focuses on the
relationship between energy consumption and macroeconomic structure. It has two
industry sectors – resource extraction and goods production. Both sectors produce output
that is consumed by households, and the goods sector also produces investment goods that
vi
are allocated to each sector. In order to better understand how the different investment
strategies influence the physical flows of resources as well as economic growth, several
simulations for investment by firms have been tested in this study. The simulations make
predictions for population, natural resources, economic output, debt and other economic
variables. They reveal the impact of concerning investment and show that our merged
model provides the means to explore questions on this topic.
vii
Table of Contents
List of Tables ....................................................................................................... viii
List of Figures ........................................................................................................ ix
Chapter 1: Introduction and Background .................................................................1
1.1. Research Questions ................................................................................1
1.2. Energy Development and Consumption ................................................2
1.3. Economic Theory ...................................................................................6
1.3.1. Keynesian and Post-Keynesian Economics .................................6
1.3.2. Production Functions ...................................................................8
1.4. The Relationship of Energy Consumption and Economics .................10
Chapter 2: Methods ................................................................................................12
2.1. Biophysical Models .............................................................................12
2.2. Economic Models ................................................................................19
2.3. Merged Macro-Model ..........................................................................26
2.4. A two-sector model with different Investment Choices ......................27
Chapter 3: Results and Discussions .......................................................................38
3.1. Compare the models with and without debts .........................................38
3.2. Simulations of different investment ratio ..............................................42
Chapter 4: Conclusion............................................................................................45
Appendix ................................................................................................................46
1. Parameters ............................................................................................46
2. Initial conditions for variables .............................................................48
3. Code version 1 .....................................................................................50
4. Code version 2 .....................................................................................64
References ..............................................................................................................74
viii
List of Tables
Table 1. Variables and parameters of Predator-Prey Model ..................................13
Table 2. Variables and parameters of HANDY .....................................................15
Table 3. Variables and parameters of Keen’s 2013 model ....................................23
Table 4. Factors of the intermediate demands .......................................................28
Table 5. Stock-Flow Consistency ..........................................................................30
Table 6. Table of parameters .................................................................................47
Table 7. Initial conditions for variables .................................................................49
ix
List of Figures
Figure 1. Time series of living standards indicators: (a) global child mortality; (b)
literate and illiterate world population; (c) world population living in
extreme poverty; (d) projected world population by level of education)
(Roser, 2017).......................................................................................4
Figure 2. World energy consumption by energy source (EIA, 2017) ......................5
Figure 3. US Primary Energy Consumption by Source (EIA, 2017) ......................6
Figure 4. Experiment results for the Egalitarian Society of HANDY:
(a) 66.67 10 ; (b) 51.66 10 ; (c) 52.66 10 ; (d)
53.66 10 (Motesharrei et al., 2014) ...................................16
Figure 5. Experiment results for the Equitable Society of HANDY:
(a) 68.33 10 , (b) 52.20 10 , (c) 53.00 10 ,
(d) 54.33 10 (Motesharrei et al., 2014) .............................17
Figure 6. Experiment results for the Unequal Society of HANDY:
(a) 66.67 10 , (b)
41 10 , (c) 66.35 10 , (d)
51.35 10 (Motesharrei et al., 2014) ...................................18
Figure 7. Exponential investment curve (Keen, 2013) ..........................................24
Figure 8. Goodwin model with debt (Jayaswal, 2017) ..........................................25
Figure 9. Goodwin model without debt (Jayaswal, 2017) .....................................25
Figure 10. Look up function for CU_indicated .....................................................35
Figure 11. Comparing the results without debts (left) and the results with debts using
fixed investment ratio p_ext = 0.5 (right) [Part 1] ............................40
Figure 12. Comparing the results without debts (left) and the results with debts using
fixed investment ratio p_ext = 0.5 (right) [Part 2] ............................41
x
Figure 13. Comparing the results with debts using fixed investment ratio method with
p_ext = 0.08, 0.25, 0.50, 0.68 ...........................................................44
1
Chapter 1: Introduction and Background
1.1. RESEARCH QUESTIONS
Natural resources, especially energy fuels, play a significant role in human society,
from economics to politics. For the sake of further understanding natural and social
dynamics as well as assisting policy making, not only should we learn how natural resource
extraction affect the ecosystem, but we should also learn its direct and indirect effects on
the economics. This requires us to develop macroeconomic models that account for the
dynamics of investment and spending on resources, inlight of resource depletion, relative
to spending on production from the rest of the economy.
There is a precedent for such models. There are biophysical models of population
and natural resources, but many of thiese omit important economic factors, such as debt.
On the other hand, there are economic models of debt, employment, economic output, etc.,
but these omit dependencies involving energy and natural resources. A merged model
linking these two domains was initiated in previous studies (Jayaswal, 2017), and it is
developed further in this thesis.
Continuing model development within a system dynamics framework of
population, natural resource extraction, employment, wage, etc. is needed to answer the
questions concerning the long-term relationship is between the consumption of natural
resources and macroeconomic growth and structure. There are two aspects: First, how do
flows of money and energy relate to each other? Second, how are wages, profits, interest
payments, etc., associated with resources?
The objective of this thesis is to develop a model that can explore questions that
relate the use of natural resources and economic outcomes. The economic outcomes are
measured by many variables (wages, growth, employment, and debt) as well as how these
2
variables are distributed between the part of the economy that extracts nature (the
extraction sector) and the rest of the economy (the goods sector). Within this cohesive
framework, the specific question for this thesis is how the different investment strategies
act on the physical and economic growth in the long run.
1.2. ENERGY DEVELOPMENT AND CONSUMPTION
The history of the world can be divided into two stages that I call “pre-industrial
revolution” and “post- industrial revolution”. The dividing line between these stages is the
invention of the modern steam engine by James Watt during the 1760s. Previously, humans
used the most accessible energy resources, wood for heating, crops for food, and animals
for labor. From the 18th century until the 1950s, coal was the primary energy source as
global industrial development accelerated. During the 19th century, the revolutionary
invention of the electric motor by Michael Faraday enabled many other energy sources to
be converted into electricity. This series of inventions and the ability to extract fossil energy
enabled an unprecedented wave of industrialization and urbanization. (Smil, 1994)
Energy resources and technology have enabled many changes in human society.
We produce more goods with higher efficiency and there are also more to consumeThis
had implications for social organization, since easier access to energy resources enabled
the development of compact communities such as cities. The widespread and efficient
usage of energy resources provides a foundation for improving people’s living quality
measured by indicators such as poverty, literacy, health and education (Roser, 2017). This
is shown in Figure . The glabal child death share of world population dying, the illiterate
population and the extreme poverty population share have significantly decreases in the
recent 200 years. Also, the educated population has considerably increased.
3
Figure 1. Time series of living standards indicators: (a) global child mortality; (b) literate
and illiterate world population; (c) world population living in extreme poverty;
(d) projected world population by level of education) (Roser, 2017)
(a)
(b)
4
Figure 1 continued
(c)
(d)
5
Even with the growth of renewable energy resources like wind and solar energy,
demand for fossil fuels continues to increase, and global energy consumption has been
rising for decades. A modeling forecast was made by Energy Information Administration
(EIA) (Figure 2). They predict that all forms of primary energy consumption will increase
from 2015 to 2040 for all major primary energy resources except for coal. While fossil
fuels remain a substantial proportion of total energy consumption, renewables are the
fastest-growing source and are projected to account for an increasing share of the energy
market over time. (EIA, 2017)
Figure 2. World energy consumption by energy source (EIA, 2017)
As the second largest energy consumer, the United States used more than 2200
Mtoe of energy during 2017 (EIA, 2017). According to the statistics from EIA (Figure 3),
petroleum has been the main source of energy in the US, and the consumption of the
renewables, nuclear and natural gas has been increasing, while the growth in coal
consumption has slowed during the recent decade (EIA, 2017).
6
Figure 3. US Primary Energy Consumption by Source (EIA, 2017)
1.3. ECONOMIC THEORY
1.3.1. Keynesian and Post-Keynesian Economics
After the Great Depression during 1929-1933, the prevailing economic theories
were unable to explain the severe rise in unemployment and the decline in economic output,
let alone to help make solutions. Against the existing neoclassical economic theories, John
Maynard Keynes provided a new economic theory in his book The General Theory of
Employment, Interest and Money in 1936 (Keynes, 1936). In the Keynesian view, in a short
term, equilibrium employment is decided by effective demand which consists of
consumption demand and investment demand. Consumption can be easily considered as
households spending on goods and services, and investment is people and firms purchasing
goods to create wealth. Each of them is a part of net output, or Gross Domestic Product
(GDP), of the economy. The insufficient consumption demand is caused by the
7
consumption growth lagging behind the income growth as a result of consumer preference,
and the deficient investment demand is due to the low expected profit rate. When there are
insufficient effective demand, economic depression, and high unemployment, Keynesian
economists assert that the government should adopt the active fiscal policies to stimulate
the investment demand by increasing the government expenditures and public investments,
since the consumption demand tends to be stable in the short run.
After World War II, the Keynesian theories were extended and re-interpreted to
harmonize the economic theory system with macroeconomics and microeconomics by
applying the individual analysis to the aggregate economy, and there came the Post-
Keynesian Mainstream, i.e. Neoclassical Synthesis. Based on Keynes’ Multiplier Theory,
a new model called Multiplier-Accelerator Model (Samuelson, 1939) was derived by Alvin
Hansen and Paul Samuelson, taking the effects of the income on the investments into
account. The Multiplier-Accelerator Model is a macroeconomic model with three sectors
including household consumers, firms and the government. As stated in (Eq. 1), the
national income (tY ) can be calculated as the sum of the present household consumption (
tC ), present investment (
tI ) and the constant government expenditure (G ).
t t tY C I G (Eq. 1)
On the contrary, a few other Keynesian followers represented by Joan Robinson,
Nicholas Kaldor and Piero Sraffa built up the so-called Post-Keynesian economics as an
alternative to the Neoclassical theory. With the emphasis on dynamic analysis,
nonergodicity, uncertainty and history, Post-Keynesian economists criticized Neoclassical
economists for their rational expectation assumption and refused the equilibrium analysis.
(Lavoie, 2012)
8
1.3.2. Production Functions
Production functions are used in certain technical conditions to describe the relation
between the production, or output, and the production inputs like labor and capital. There
are many ways to model economic output, most of which consider capital and labor and
some also involve energy resources. Production functions can be divided into Short-run
Production Functions and Long-run Production Functions. Short-run Production Functions
usually assume that all the production factors except one remain unchanged, while Long-
run Production Functions allow two or more changing production factors. (Mishra, 2007)
The production function with constant substitution proportion, first used by Von
Neumann in 1937 (Von Neumann, 1937), is one of the commonly used function. As
displayed in (Eq. 2), the two production factors, labor ( L ) and capital ( K ) can be
substituted for each other with constant parameters (a
b and
b
a) to keep the same output (
Y ) level. In other word, if labor increases by 1 unit, capital needs to decrease by a
b unit
to keep the output unchanged.
Y aL bK (Eq. 2)
Another production function named after Leontief and widely used by Post-
Keynesians, is shown in (Eq. 3). With the two technology factor parameters ( c and d ),
the total output (Y ) can only be increased by increasing the labor input ( L ) and capital
input ( K ) at a fixed proportion. In other words, if the labor doubled, the total output won’t
change unless the capital is also duplicated. (Humphrey, 1997)
min{ , }Y cL dK (Eq. 3)
The Cobb–Douglas production function (Cobb & Douglas, 1928) is also frequently
used, especially preferred by the Neoclassical economists. As stated in (Eq. 4), constrained
by two parameters representing output elasticities ( and ), the total output (Y ) is a
9
function of labor input ( L ) and capital input ( K ), and the necessary factor ( A ) is defined
as a mathematical residual when fitting the function to data for labor, capital and output.
Y AL K (Eq. 4)
The returns to scale can be changed by changing the relation of and . There
are three possible situations.
If 1 , the return to scale will be constant for any constant c greater than 0,
which can also be illustrated by (Eq. 5).
(c ) (c ) A L K c AL K cAL K cY (Eq. 5)
If 1 , the return to scale will be decreasing for any constant c greater than
1, which can also be illustrated by (Eq. 6).
(c ) (c ) A L K c AL K cAL K cY (Eq. 6)
If 1 , the return to scale will be increasing for any constant c greater than
1, which can also be illustrated by (Eq. 7).
(c ) (c ) A L K c AL K cAL K cY (Eq. 7)
Taking the energy or natural resources into consideration, there are production
functions in the form of (Eq. 8). The variable denoted by E can be different indicators
of energy usage, e.g. exergy or commercial energy. (Ayres, 2005)
Y AK L E (Eq. 8)
Each one with their own limitations, these production functions have been used to
build the economic growth models simulating the diverse impacts of production factors on
economic total output. In order to mimic the real data and even predict the growth trends
and guide the policy, the forms and the parameters of the production functions need to be
chosen for different conditions.
10
In the model developed in this thesis, inputs of capital, labor and energy are
included as necessary to produce economic output using the Leontief assumption, thus
there is no substitution and any factor can be limiting.
1.4. THE RELATIONSHIP OF ENERGY CONSUMPTION AND ECONOMICS
The relationship between energy consumption and economic growth has been
studied quantitatively from 1970s, and the results vary with models, data and studied
regions. As for the United States, a pioneering study using the data from 1947 to 1974
shows a positive single causality from Gross National Product (GNP) to the energy
consumption (Kraft et al., 1978), followed by a study using the same time series data with
a different sample interval which points out the influence of the sample choices on the
relationship analysis (Akarca et al., 1980). By analyzing the US data from 1947 to 1979,
Yu et al. asserts that there is no causal relationship between the energy consumption and
GNP (Yu et al., 1984). For the time series of variables like energy consumption and GNP
which are usually nonstationary, Engle and Granger (1987) proposed a method to decide
that the two series are co-integrated if their linear combination is stationary. Using this
method, the study with the seasonal data from 1974 to 1990 also indicates nonexistence of
the long-term co-integrated relationship between the two variables (Yu, 1992). However,
with the model involving four variables including GDP, capital, labor and energy, the
energy consumption is recognized to have a significant effect on explaining the GDP
changes, and a significant long-term co-integrated relationship is found among the four
variables (Stern, 2000).
From the above, the relationship between energy consumption and economic
growth has been studied by various methods, leading to different results. The inconsistency
of those results arises not only from the different economic structures and policies in
11
different countries or time periods, but also from the model limitations and the assumptions
of the methods.
12
Chapter 2: Methods
The purpose of this chapter is to describe the development of the model used in this
thesis. By combining a relatively simple biophysical model (Section 2.1) with a relatively
simple economic growth and business cycle model (Section 2.2), the merged model is able
to simulate an integrated system with the physical flows of nature and also the economic
flows.
2.1. BIOPHYSICAL MODELS
Biophysical models simulate the biological system by formalizing the physical
properties like population, natural resources, etc. One of the simplest biophysical models,
Predator-Prey Model, also named as Lotka-Volterra model, describes the relation between
predator population and prey population, for example, wolves and rabbits (Lotka, 1925).
With the variables and parameters in Table 1, the birth rate of the predator population x
is positively correlated to the prey population y , and the death rate is constant (Eq. 9).
The prey population changes with a constant birth rate and a death rate positively correlated
with the predator population (Eq. 10). In such a system, when the population of predators
is rather small, the preys living in the favorable environment will have a relatively high
population growth rate. At the same time, the predators will have more available food and
their birth rate will climb up. Eventually more predators will eat more preys, causing the
prey death rate to increase so high that prey population declines. The lack of food (preys)
will lead to lower birth rates of the predators, and thus the system goes back to the original
condition and starts a new circulation. The mutual restriction between the two species
keeps the populations fluctuating within a certain range and therefore the system remains
in balance. The outcome of the predator-prey model is a limit cycle, or an osculation of
predator and prey populations that continues indefinitely.
13
(ay)x bxx (Eq. 9)
cy (dx)yy (Eq. 10)
Table 1. Variables and parameters of Predator-Prey Model
Based on the Predator-Prey Model, the Human and Nature Dynamics Model
(HANDY) considered people as predators and the nature as prey, simulating the trade-off
between the population and natural resources (Motesharrei et al., 2014).
There are two types of population – commoners and elites, represented by C
x and
Ex . The population growth, as shown in (Eq. 11) and (Eq. 12), controlled by the birth
rate , which is constant in HANDY, and death rate , which is determined by wealth.
Nature as a stock that regenerates at a certain rate is akin to a forest in HANDY. To simplify
the real situation, nature is assumed to regenerate in a logistic function of the existing nature
and decrease as it is extracted by commoners (Eq. 13). According to the features of logistic
equation, the nature regeneration rate will reach the maximum when the nature is equal to
half of the assumed maximum capacity of nature ( ). Wealth (w ) is the nature that has
been extracted but not yet consumed. As only commoners produce and both of commoners
and elites consume, wealth can be accumulated by the production subtracting the
consumptions (Eq. 14). A threshold wealth (th
w ) was defined in (Eq. 15) with the
threshold wealth per capita ( ) indicating the minimum wealth required to maintain the
minimum death rate. According to (Eq. 16) and (Eq. 17), the consumption level is
Symbol Endogenous Variables (EV) /
Parameter (P)
𝑥 Predator Population (EV)
𝑦 Prey Population (EV)
𝑎 Efficiency of predation to growth (P)
𝑏 Predator Death Rate (P)
𝑐 Prey Birth Rate (P) 𝑑 Efficiency of Predation (P)
14
controlled by the quantity of wealth, and human consumption is total subsistence salary
when the wealth is above the threshold wealth, and becomes proportional to the total
subsistence salary when the wealth is not enough. As stated by (Eq. 18) and (Eq. 19), a
maximum and minimum were set for the death rate. When the wealth is above the threshold
wealth, the death rate will stay at the minimum level. As wealth approaches zero, the death
rate approaches it’s maximum value M
and famine occurs. The death rate in between is
dependent on the present consumption level compared to the total subsistence salary.
C C C C C
x x x (Eq. 11)
E E E E E
x x x (Eq. 12)
( )C
y y y x y (Eq. 13)
C C E
w x y C C (Eq. 14)
th C E
w x x (Eq. 15)
min(1, )C C
th
wC sx
w (Eq. 16)
min(1, )E E
th
wC sx
w (Eq. 17)
max(0,1 )( )CC m M m
C
C
sx (Eq. 18)
max(0,1 )( )EE m M m
E
C
sx (Eq. 19)
15
Symbol
Description (Exogenous
variable (EV) /
Endogenous Variables
(V) / Parameter (P))
Unit
Cx ,
Ex Population (V) Person
y Nature (V) Nature
w Wealth (V) Nature
thw
Wealth threshold value
(V) Nature
C ,
E Death rate (V)
1
Time
CC ,
EC Consumption (V)
Nature
Time
Birth rate (P) 1
Time
Regeneration factor (P) 1
Time
Nature capacity (P) Nature
Extraction rate (P) 1
Time Person
Threshold wealth per
capita (P)
Nature
Person
Inequality factor (P) --
s Subsistence salary per
capita (P)
Nature
Time Person
M Maximum death rate (P)
1
Time
m Minimum death rate (P)
1
Time
Table 2. Variables and parameters of HANDY
There are three kinds of scenarios simulated by HANDY (Motesharrei et al., 2014):
the Egalitarian Society, the Equitable Society and the Unequal Society. Different scenarios
simulating the HANDY Model display the modeling results with the same initial values
and parameters except for varying the extraction rate (δ) and inequality factor (κ) in order
16
to explore the impacts of changing extraction rates and unequal consumption on population
collapse. The egalitarian scenarios simulate the society without elites ( 0E
x ), of which
the results are shown in Figure 4. The optimal extraction rate (* ) which leads to a “soft
landing” to a stable mode is 66.67 10 (
1
Time Person) (Figure 4 (a)), and with the
extraction rate increased, the system becomes more unstable and even collapses (Figure 4
(b)-(d)).
Figure 4. Experiment results for the Egalitarian Society of HANDY:
(a) 66.67 10 ; (b)
51.66 10 ; (c) 52.66 10 ; (d)
53.66 10 (Motesharrei et al., 2014)
17
The equitable scenarios (Figure 5) simulate the society with elites and the properties
of the elites are the same as the commoners except that they don’t work ( 0E
x , 1
). The optimal extraction rate is now larger (* 68.33 10 ), and increasing extraction
rates cause more oscillations (Figure 5 (b) & (c)) and eventually a state of equilibrium or a
collapse (Figure 5 (d)).
Figure 5. Experiment results for the Equitable Society of HANDY:
(a) 68.33 10 , (b)
52.20 10 , (c) 53.00 10 , (d)
54.33 10 (Motesharrei et al., 2014)
The unequal scenarios (Figure 6) simulate the society with elites as well as unequal
consumption abilities ( 0E
x , 1 ). When the inequality factor is low, a proper
extraction rate can be found to achieve a “soft landing” (Figure 6 (c)), however, when the
18
inequality factor is high, the system is unable to maintain a steady population indefinitely
(Figure 6 (a) & (b)).
Figure 6. Experiment results for the Unequal Society of HANDY:
(a) 66.67 10 , (b)
41 10 , (c) 66.35 10 , (d)
51.35 10 (Motesharrei et al., 2014)
In the book The Limits to Growth (Meadows et al., 1972), a system dynamic model
named World3 was used to describe the relations among population, capital, natural
resources and pollution, assuming the natural resources are limited and do not regenerate.
From the results of the study, the world population, industrial output, food consumption,
pollution and the resources depletion are shown to initially grow exponentially, but due to
19
the finite resources and limited pollution tolerance the economics will collapse or at least
stop growing one day. Thus the authors suggest we should take measures to prepare for an
eventual cessation of growth by increasing efficiency and stabilizing population birth rates.
The authors also show there are some scenarios that humans can realize a satisfying living
level without economic growth, which implies the concept of sustainable development.
There are also limitations of the World3 model. A model with five main variables might
be too simple because it ignores some significant factors and mechanisms. For example,
the model does not explicitly model prices of goods or resources, ignoring the feedback
effect of prices - the shortage of goods can induce the increasing price, and thus its demand
will drop and the scarcity will be relieved.
2.2. ECONOMIC MODELS
Various economic models have been built to simulate the economic processes by a
set of economic variables and their relationships. Economic variables of interest include
wages, employment, debt, profits and economic output (GDP).
The Goodwin Model uses the same predator-prey concept as the Lotka-Volterra
model to simulate the business cycle dynamics of the employment rate and wages
(Goodwin, 1967). According to Leontief production function (Leontief, 1951), if two of
the three variables (Labor, Capital and Output) are known, the other one can be derived.
With the change of wages determined by the Philips curve (Eq. 20), and the labor
productivity (Eq. 21) and population (Eq. 22) growing exponentially, there are three sets
of euqations that can model te system, and these are shown in (Eq. 23), (Eq. 24) and
(Eq. 25). Take the first situation as an example, if the differential equation of Labor is
given, Output and Capital will be calculated (Eq. 23). Additionally, the investment is
assumed to be equal to profit, which is equal to the residual of the output after paying the
20
wages (Eq. 26). The employment rate is the share of the labor in the total population
(Eq. 27). The equations for wage change and labor change can be rewritten as (Eq. 28)
and (Eq. 29), which have the same form of the equations for predator population (Eq. 9)
and prey population (Eq. 10).
( c d )ww (Eq. 20)
a a (Eq. 21)
N N (Eq. 22)
1( )
w
aL Lv
Y aL
K Y
(Eq. 23)
K I K
KY
YL
a
(Eq. 24)
IY Y
K Y
YL
a
(Eq. 25)
I Y w (Eq. 26)
L
N (Eq. 27)
d
w cww LN
(Eq. 28)
21
1 1
( )L L wLv av
(Eq. 29)
Keen (1995 and 2013) integrated debt into the Goodwin model (Goodwin, 1967).
Keen was inspired by Hyman Minsky’s Financial Instability Hypothesis, which is that
during times of high economic growth, firms will invest more than their profit. This
additional investment over profits represents a loan from banks that accumulates as debt.
(Minsky, 1957)
The differential equations in Keen’s model (Keen, 2013) are listed as (Eq. 30)-
(Eq. 35), with the variables and parameters explained in Table 3. Described in (Eq. 30),
the rate of change in net economic output is in line with Leontief production function
(Leontief, 1953) and equals to the investment minus depreciation divided by the capital-
output ratio. Simulating the investment as a function of profit rate (vY
) and net output
(Eq. 36), the equation for the change of net output can be rewritten as (Eq. 31) where
( )vY
is the function of output invested. Real wage signifies the average personal payment
for workers. As stated in (Eq. 32), the rate of change in wage is assumed to be a function
of current wages and employment as in the Goodwin model. The function ( )ph is a
Phillips curve describing this dependence on employment (Phillips, 1958). The change in
debt is equal to investment minus profits (Eq. 33), and the introduction of debt is one way
to include the concept of money. Labor productivity and population are both exogenous
states, meaning that they are not affected by the other state variables. Labor productivity is
the average amount of output each worker can make per time to represent the workers’
efficiency changing with time by various scientific and technological improvements.
(Eq. 34) and (Eq. 35) show that the labor productivity and population both increase
exponentially with respectively given growth rates.
22
K I K I
Y Yv v
(Eq. 30)
( )( )vYY Y
v
(Eq. 31)
( )ww ph (Eq. 32)
( )D YY
(Eq. 33)
a a (Eq. 34)
N N (Eq. 35)
( )I YvY
(Eq. 36)
23
Symbol
Description (Exogenous
variable (EV) /
Endogenous Variables (V)
/ Parameter (P))
Unit
Y Output (V) Money
Time
w Real wage (V) Money
Time Person
D Debt (V) Money
a Labor productivity (EV) Money
Time Person
N Total Population (EV) Person
I Investment (V) Money
Time
Profit (V) Money
Time
Employment ratio (V) --
Capital/output ratio (P) Time
Depreciation rate (P) 1
Time
Growth rate of labor
productivity (P)
1
Time
Growth rate of population
(P)
1
Time
Table 3. Variables and parameters of Keen’s 2013 model
Keen (2013) used the exponential investment curve to model that the investment
share exponentially increases with the profit share (Figure 7). With a fixed output, there is
a point where the investment is equal to the profit, before which the investment is lower
than the profit and after which the investment will exceed the profit.
24
Figure 7. Exponential investment curve (Keen, 2013)
Such an investment curve can represent different investment risk preferences,
conservative or aggressive, by changing the parameters. It can also be simplified to a linear
investment curve which indicates a constant ratio of investment and profit as Bovari et al.
(2018) simulate in their model.
Figure 8 and Figure 9 show the simulating results of Goodwin model with and
without debt. The non-linear investment function and the non-linear Phillips curve that is
modeled as an exponential function of profit share are used for the simulations. The results
of these two scenarios are similar. The output and population increase over time, and the
labor rises with some oscillations. The wage share and employment rate form a “limit
cycle” when changing over time, and when there is debt simulated using the non-linear
Phillips curve the cemployment and wage share change along a circle.
25
Figure 8. Goodwin model with debt (Jayaswal, 2017)
Figure 9. Goodwin model without debt (Jayaswal, 2017)
26
2.3. MERGED MACRO-MODEL
The HANDY model does not explicitly consider economic concepts such as wages,
debt (money), and profits. The Goodwin Model does not consider requirements for natural
resouces. Thus, a merged model can combine the important concepts from both HANDY
and Goodwin. Jayaswal (2017) began the research on this merged model to connect natural
resources and economics in a single framework.
There are differential equations for seven variables in Jayaswal’s merged model,
with the variables and parameters derived from HANDY are subscripted by “h”. He used
the equations of changes in population, nature and wealth from HANDY (Eq. 11) -
(Eq. 14), and the equations of changes in output, wage, labor productivity and debt from
Keen’s model (Eq. 30)-(Eq. 34). There is only one kind of population which is denoted by
hcx , represents both the total available labor supply and the number of consumers. Jayaswal
explored three different forms for the expression for nature extraction. The equations of
changes in nature h
y and wealth h
w are simulated with different assumptions: in
(Eq. 38) nature extraction is a function of labor L ; in (Eq. 39) nature extraction is a
function of capital K which is defined to increase with the investment and decrease due
to the depreciation; in (Eq. 40) nature extraction is a function of “power input” Pi
indicating a portion of wealth is required as an input to extract nature. There are also two
assumptions of investment function tested in Jayaswal’s model: linear Phillips curve
(Eq. 20) and non-linear Phillips curve that is modeled as an exponential function of profit
share. A mix of these assumptions were modeled on the conditions with debt (Eq. 44) or
without debt (I ), as well as with or without wealth depreciation (h hw ).
hc hc hc hc hc
x x x (Eq. 37)
( )
h h h h h L h
h L h hc h h
y y y Ly
w Ly C w
(Eq. 38)
27
( )
h h h h h K h
h L h hc h h
y y y Ky
w Ky C w
(Eq. 39)
( )
h h h h h Pi h
h Pi h hc h h
y y y Piy
w Piy C w
(Eq. 40)
( )( )YY Y
(Eq. 41)
( )ww ph (Eq. 42)
a a (Eq. 43)
( )D YY
(Eq. 44)
2.4. A TWO-SECTOR MODEL WITH DIFFERENT INVESTMENT CHOICES
In this thesis, a two-sector extension of Jayaswal’s model (Jayaswal, 2017) is
presented. More variables like capacity utilization, inventory coverage, and price of nature
are introduced in the system, and there are two separate sectors – extraction sector and
goods sector. Each sector has its own capital ( gK ,
eK ), labor ( g
L , eL ) and debt ( g
D ,
eD ). The extraction sector uses capital to extract nature and there is also household
consumption of nature which represents food and energy consumption of consumers. The
goods sector produces “goods” that are both consumer goods and investment goods that
become new capital for both sectors. Between these two sectors the intermediate
consumptions are taken into account due to the fact that the goods production usually
requires energy and goods materials, and to extract the nature we also need energy and
goods investment (e.g. the drilling equipment).
28
The physical processes including the intermediate consumptions can be represented
in an input-output equation (Eq. 45). The gross output of each sector (g
X and e
X )
consists of the intermediate consumptions by the two sectors indicated by multiplying
transaction matrix ( A ) by gross output matrix (X ), the household consumption (g
C and
eC ), the investment, and the residual will be the inventory change (goods inventory and
extraction inventory). Note that investment goods are only provided by the goods sector.
Thus, even though both sectors invest money, gI and
eI , only the goods sector produces
the physical investment, _g g
I and _g e
I , associated with those monetary investment
decisions. To explain the parameters for the intermediate consumptions, their equations are
given in Table 4.
_ _+
0
gg geg g g g g g e
eg eee e e
X AX C I Inventory
a aX X C I I G
a aX X C Ext
(Eq. 45)
Intermediate parameter Description
gga constant Producing 1 unit of gross goods output
requires a constant amount of goods input.
gea constant Producing 1 unit of gross extraction output
requires a constant amount of goods.
e e e e
ee
k h e e k h
K CUa
y K CU y
The amount of nature extraction input
required to operate the capital of extraction
sector to produce one unit of nature extraction
can be calculated as the efficiency of the
operation divided by the product of the
extraction parameter and nature.
_ _
_ _
( )=
/ ( / )
( )
( / )
o I
eg eg eg
g g g g g g e g
g g g g g g e
g g g e g
g g
g g g e
a a a
K CU I I P
K CU v K CU v P
I I Pv
K CU v P
The amount of nature extraction input
required by the goods sector includes the
operation part which is used to operate the
goods capital, and the investment part which
is used to invest in the new capital.
Table 4. Factors of the intermediate demands
29
By assuming there is no accumulated goods and extraction ( 0G , 0Ext ),
the matrix equation can be expressed in two separate equations (Eq. 46)-(Eq. 47).
_ _ g ge e gg g g g e g gX a X a X C I I (Eq. 46)
+ e eg g ee e eX a X a X C (Eq. 47)
Table 6, which is adapted from Godley’s model (2016), shows the stock-flow
consistency of such a merged model. The balance sheet, transactions and flow of funds
account for the monetary activities among households, extraction firms, goods firms and
banks. Note that in the sheet of transactions, the sum of each column equal to zero.
Balance Sheet
Households Extraction firms Goods firms Banks Sum
Capital
Stock g eP K
g gP K ( )g e gP K K
Deposits M M
Debts eD gD e gD D
Sum M g e eP K D g g gP K D 0 ( )g e gP K K
Table 5. Stock-Flow Consistency
30
Transactions
Households Extraction firms Goods firms Banks Sum
Current Capital Current Capital Current Capital
Household
consumption
e e
g g
C P
C P
e eC P g gC P
Intermediate
consumption
eg g e ee e e
ge e g ee e e
a X P a X P
a X P a X P
ge e g gg g g
eg g e gg g g
a X P a X P
a X P a X P
Investment _g e gI P _ _g e g g g gI P I P
_g g gI P
Value
Added [VA ]e [VA ]g
Wages e
g
wL
wL
ewL gwL
Capital
depreciation e gK P e gK P g gK P g gK P
Interest on
debts erD grD
e
g
rD
rD
Interest on
deposits rM rM
Sum hhS e _( ) e g e gK I P g _( ) g g g gK I P
b
Flow of Funds
Households Extraction firms Goods firms Banks Sum
Change in
capital stock e gK P
g gK P ( )e g gK K P
Change in
capital
formation
_g e gI P _g g gI P _ _( )g e g g gI I P
Change in
deposits M M
Change in
debts eD gD e gD D
Sum hhS e g bS
Table 6 continued
31
From the accounting relationships in Table 6, the value added to each sector can be
stated as (Eq. 48) and (Eq. 49).
_ _
g g g ge e g eg g e g e g g g g
g g g g g
VA C P a X P a X P I P I P
wL K P rD (Eq. 48)
e e e eg g e ge e g
e e g e e
VA C P a X P a X P
wL K P rD (Eq. 49)
According to (Eq. 46)-(Eq. 49), the relationships between the physical gross
outputs and the values added can be derived, as shown in (Eq. 50) and (Eq. 51).
g g g g gg g eg g eVA P X P a X a X P (Eq. 50)
e e e e ee e ge e gVA P X Pa X a X P (Eq. 51)
Inserting the equation for ega from Table 4 into the (Eq. 48) and (Eq. 50), we can
derive (Eq. 52).
o
g e g g g g g g gg g eg g e g gI I wL rD P X P a X a X P K P (Eq. 52)
Combing (Eq. 49) and (Eq. 51), we can get
e e e e e e ee e ge e g e gwL rD P X Pa X a X P K P (Eq. 53)
(Eq. 52) and (Eq. 53) can be written in a matrix form as (Eq. 54).
ˆ ˆ ˆ
00 0 0
0 0 00
T
g
ogg e g g g g g g g g ggg eg
e e e e e e e e ege ee g
e
V XP XA P X P
K
XI I wL rD X P X P X Pa a
wL rD X P X P X Pa a K
X
(Eq. 54)
The price matrix can be solved as stated in (Eq. 55), in which E is a 2 2 unit
matrix.
32
1
ˆ
TP X E A V (Eq. 55)
Since there are two sectors, the monetary net output of each sector defined as the
sum of investment and consumption is not necessarily equal to the value added of that
sector, as shown in (Eq. 56) and (Eq. 57).
_ _g g g g g g g g e
g g g gg g ge e g
Y P C P I P I
P X P a X a X P
(Eq. 56)
0
e e e e e
e e e ee e eg g e
Y C P C P
P X P a X a X P
(Eq. 57)
There are two kinds of household consumptions, extraction consumption (e
C ) and
goods consumption (g
C ). By assuming there is no accumulated goods and extraction, i.e.
all the extracted nature and goods production will be used up, the consumption is no longer
the functions of wealth, but instead it is the residual of the net outputs respectively (Eq. 58)
-(Eq. 59).
ee
e
YC
P (Eq. 58)
_ _( )
g g g e g g
g
g
Y P I IC
P (Eq. 59)
For simplicity, I assume there are no elites as were modeled in HANDY. The total
population are the commoners in HANDY model (e.g., what Motesharrei et al. (2014)
termed “egalitarian”). The rate of change of commoner population is shown in (Eq. 37).
The birth rate ( hc
) is assumed constant. I change the death rate ( hc
) to be a
function of household extraction consumption instead of wealth consumption as in the
HANDY model (Eq. 60). Thus, by setting a maximum and a minimum death rate, the
population will decrease at the minimum death rate when the extraction consumption is
greater than the threshold consumption (hc
sx ). If the extraction consumption is less than
33
the threshold consumption the death rate will increase linearly as consumption declines
until it reaches the maximum “famine” death rate at 0e
C .
max(0,1 )( )ehc m M m
hc
C
sx (Eq. 60)
Nature extraction is no longer a function of population (or laborers) as in HANDY,
but instead it is a function of capital (Eq. 61) as in Jayaswal’s model (Jayaswal, 2017). I
assume capital is used for extraction and that this capital operates with a utilization rate (
eCU ). More capital allocated for extraction and higher capacity utilization lead to higher
extraction rates. Total gross nature extraction is defined by four terms multiplied by each
other: a technology parameter, k
, the quantity of capital used for extraction,e
K , the
capacity utilization of extraction capital, e
CU , and the amount of nature still residing in
the environment, h
y .
e k e e hX K CU y (Eq. 61)
The gross physical output of goods is also calculated by the capital, in a similar way
to calculate for the output as formulated in Goodwin’s and Keen’s model. Thus the gross
physical output of goods is linearly correlated with the production of goods capital and its
capacity utilization as in (Eq. 62), where gv is an assumed gross output to capital ratio.
g g
g
g
K CUX
v (Eq. 62)
The physical capital stock is increased by investment and decreased by
depreciation. Depreciation is equal to a constant depreciation rate ( ) multiplied by the
existing capital stock.
_e g e e
K I K (Eq. 63)
_g g g g
K I K (Eq. 64)
34
According to the income approach of GDP calculation, profit, , as stated in
(Eq. 65) and (Eq. 66), equals the total value added less the payment for total wages which
is the product of average personal wage (w ) and labor (L ), and less interest payment for
debt which is the product of interest rate ( r ) and debt ( D ), and less the value of
depreciation ( gKP ).
g g g g g gVA wL rD K P (Eq. 65)
e e e e e gVA wL rD K P (Eq. 66)
For each sector, I calculate a separate amount of labor: labor for goods (Eq. 67)
and labor for extraction (Eq. 68). The labor for goods is calculated by the gross output of
goods divided by the labor productivity for goods (g
a ), while the labor for extraction is
calculated by the total gross nature extraction divided by the labor productivity for
extraction (Eq. 69) which is assumed as the labor productivity for goods converted into
correct units by the prices of each sector.
g
g
g
XL
a (Eq. 67)
ee
e
XL
a (Eq. 68)
g g
e
e
a Pa
P (Eq. 69)
There is a limitation of the coding method we use that only the variables with
differential equations can be tracked during the iterations. To be able to access the past data
of capacity utilization ( CU ) and inventory coverage ( IC ), differential equations are
created to model them as a the first order delay which approximates their recent state
(Sterman, 2000). By setting the lagging time ( ) as 1, the values for the variables of last
iteration can be approximated. In reality, firms do have knowledge of historical utilization
and inventory data. As shown in (Eq. 70), the indicated capacity utilization for extraction
35
(,e indicated
CU ) is a function of perceived inventory coverage in reverse determined by a look
up table (Sterman, 2000). The capacity utilization of goods sector has a differential
equation in the same form (Eq. 71). The look up table used in this thesis is shown in Figure
10. The inventory coverage denotes how long on average a stock of `inventory’ (goods or
nature extraction) will remains in inventory before being consumed (Eq. 72).
Figure 10. Look up function for CU_indicated
,,
, , , ,
1( )
e
e perceivede indicated ee
CU e delay CU e delay
f CUICCU CU
CU
(Eq. 70)
, ,
, , , ,
1( )
g
g indicated g g perceivedg
CU g delay CU g delay
f CUCU CU IC
CU
(Eq. 71)
Perceived Inventory
Perceived Consumption of the InventoryIC (Eq. 72)
, ,
perceivedperceived
IC e delay
IC ICIC
(Eq. 73)
0
0.2
0.4
0.6
0.8
1
1.2
0 2 4 6 8 10 12 14 16
CU
_in
dic
ated
1/IC_perceived
36
The equations for the perceived consumption of each sector used in the inventory
coverage equation are shown in (Eq. 74) and (Eq. 75).
Perceived Consumption C e e eg g ee ea X a X (Eq. 74)
_ _Perceived Consumption C g g gg g ge e g g g ea X a X I I (Eq. 75)
There are also differential equations for price ( P ), net output (Y ), value added (
VA ), inventory coverage (IC ) and profit ( ) for each sector to model them with the first
order lag so that their values from the previous year can be used. As the equations stated
in (Eq. 76)-(Eq. 80), the change of each variable equals the present value of the variable
minus the previous value of the variable divided by the delay time which is set as 1 in this
study.
,
updated
P delay
P PP
(Eq. 76)
,
updated
Y delay
Y YY
(Eq. 77)
,
updated
VA delay
VA VAVA
(Eq. 78)
, ,
perceivedperceived
IC e delay
IC ICIC
(Eq. 79)
,
updated
delay
(Eq. 80)
The equations for investments are different when there are different debt
assumptions. IF we assume no private debt in the model, the investment for each sector
equals the profit of the sector (Eq. 81)-(Eq. 82).
g gI (Eq. 81)
e e
I (Eq. 82)
37
If we consider debt based on investment for each sector possibly being greater than
profit, the total monetary investment is determined by the investment function ( ) times
total value added. The investment function ( ) representing investment per value added is
a function of profit share (Eq. 83).
( )
g
VAVAIP
(Eq. 83)
In this thesis, the linear investment function (Eq. 84) with a constant slope (1 )
and intercept (0
) is adopted to calculate the total investment in (Eq. 83). A fixed
investment ratio for extraction sector (extp ) is used to separate the investment into the two
sectors.
0 1
( )VA
(Eq. 84)
By using the fixed investment ratio, the total economy-wide investment is allocated
to the two sectors in a fixed proportion (goods
p and extp ), which can be represented in
(Eq. 85) and (Eq. 86), where 1goods ext
p p .
g goodsI I p (Eq. 85)
e extI I p (Eq. 86)
The debt of each sector equals the investment minus profit as shown in (Eq. 87)
and (Eq. 88).
g g gD I (Eq. 87)
e e eD I (Eq. 88)
38
Chapter 3: Results and Discussions
3.1. COMPARE THE MODELS WITH AND WITHOUT DEBTS
Figure 11 and Figure 12 show the results of simulations with and without debts
using the same parameters (Appendix 1) and initial conditions (Appendix 2) except for the
debts and investments (Appendix 3). Both of the systems experience some fluctuations in
the beginning and the system without debts continues to fluctuate in a small range while
the system with debts eventually reaches to a steady state.
From Figure 11 (a) & (b), nature is extracted fast in the beginning, and the
regeneration and extraction tend to balance each other gradually. Eventually the simulation
with debts has less remaining nature.
For the population (Figure 11 (c) & (d)), the population grows fast in the beginning
and then swings at a certain level when no debt is considered, while in the other simulation,
the population becomes steady after experiencing a peak. The eventual population of the
simulation with debts is also lower than the other.
In Figure 11 (e), assuming no debts, the GDP grows fast in the beginning and then
fluctuates around a relatively high value. By contrast, in Figure 11 (f) the GDP will stay
steady after a peak if the model involves debts, and its steady state value is less than half
when the model does not allow debt accumulation.
From Figure 11 (g) & (h), the total capital curves have similar trends and the
capitals for each sector are very different. The total capital is near 180 in Figure 11 (g) and
about 75 in Figure 11 (h), and the goods and extraction capitals gradually get close and
respectively share half of the total capital. In Figure 11 (g), the extraction capital stays on
a low level than that for goods which reveals that the extraction sector has a smaller profit.
Figure 12 (a) & (b) show the main difference in these two simulations – the
simulation without debts has no debts accumulating while the simulation with debts has
39
accumulating debts as expected. Figure 12 (c) - (f) indicate the employment rates and profit
shares are similar in the two simulations, and the system with debts has fewer fluctuations
at the end. At steady state, the profit share of the goods sector is higher than that for the
extraction sector in both simulations.
40
(a) (b)
(c)
(e)
(d)
(f)
(g) (h)
Assuming no debt ( ) Assuming debt ( )
Figure 11. Comparing the results without debts (left) and the results with debts using
fixed investment ratio p_ext = 0.5 (right) [Part 1]
41
Figure 12. Comparing the results without debts (left) and the results with debts using
fixed investment ratio p_ext = 0.5 (right) [Part 2]
(a) (b)
(c)
(e)
(d)
(f)
Assuming debt ( ) Assuming no debt ( )
42
3.2. SIMULATIONS OF DIFFERENT INVESTMENT RATIO
Figure 13 shows the results of simulations with debts using the same parameters
(Appendix 1) and initial conditions (Appendix 2) as for the simulations in Figure 11 and
Figure 12 except for the investment ratios (extp & goods
p ) (Appendix 4). This scenario
tests the investment ratio for extraction sector (extp ) from 0 to 1. There are only reasonable
results, which means there won’t be indicators out of acceptable range (e.g. over 100%
employment rate) when extp is between 0.08 and 0.68.
When extp is set as 0.5, the investment for each sector equal to each other, leading
the GDP, nature and population to a steady state after the fluctuations in the beginning.
When extp deviates from 0.5, the imbalance between the investments makes the system
fluctuate more, which can be known by comparing Figure 13 (g) & (h) – when extp is
greater than 0.5 ( 0.68extp ), there is more investment for the extraction sector and thus
the capital in goods sector is less than the capital in extraction sector. When extp is less
than 0.5 ( 0.25extp ), more investment will be allocated to the goods sector and the
capital in goods sector is on average much greater than the extraction sector, but with
signifianct oscillation in the economy. For the debts, lower extp causes higher debts in
the long run, bbut the effect is nonlinear as more debt is accumulated for 0.25extp
than , but less than 0.50extp .
However, when the investment ratio for extraction sector is getting too low, e.g.
0.08extp , there won’t be sufficient capital for the extraction sector (Figure 13 (g)), and
the nature is depleted slowly (Figure 13 (a)). Since the death rate is calculated based on the
household consumption of extraction, the lack of available extraction will limit the growth
of population and even reduce the population (Figure 13 (c)). In this case, people will live
at a relatively low standard although the economics is pretty stable.
43
As the investment ratio for extraction rises from 0.08, the outputs such as
population, GDP, capital, etc. increase and begin to fluctuate significantly. As extp
approaches 0.5, the oscillations damp out at the expanse of lower GDP, population and
capital. Increasing extp greater than 0.5 to 0.68 there is again inscresing oscillations,
much like with 0.25extp , but with notably lower goods capital and more oscillatory
GDP. The increasing fluctuations when extp deviates 0.5 result from the inbalanced
invesements between the two sectors. When extp is too low, there will be not enough
capital to extract the nature and thus the population and economic development are limited.
44
(a)
(b)
(c)
(e)
(d)
(f)
(g)
(h)
Figure 13. Comparing the results with debts using fixed investment ratio method with
p_ext = 0.08, 0.25, 0.50, 0.68
45
Chapter 4: Conclusion
By comparing the results, it can be concluded that various investment modeling
strategies will make different effects on simulating the biophysical system and the
economics.
The models with or without debts have similar simulating results. Although the
trends are similar, some key variables like GDP and population result in a lower level when
the debts are allowed.
For the scenarios of fixed investment ratio, the system remains stable after a time
point when the investment ratio for extraction is around 0.5. However, the system
fluctuates when the investment ratio for extraction becomes higer or lower than 0.5,
because there is greater imbalance between the investments into the two sectors. In
addition, the results indicate that a more stable system usually has a lower GDP, and also
a lower population if the investment ratio for extraction is not too low.
These investment tests are intended to deepen the understanding of the effects of
investments on this model. Nontheless, this merged needs further development to mimic
the real world data and even provide some predictions.
There are more investment strategies that can be explored in the future. For
instance, there are different ways to allocate the investments into the two sectors such as
using discrete choice model or independent investments which are not included in this
thesis. Furthermore, different kinds of investment curves can be simulated in the model
including nonlinear or logic investment curves. Moreover, the model can be separated into
more than two sectors and involve more variables which will make the investment choices
more diverse.
46
Appendix
1. PARAMETERS
Symbol Value (no debt) Value (with debts)
k 0.025 0.025
h 100 100
deprec 0.03 0.03
e 0.01 0.01
g 0.01 0.01
0.03 0.03
hc 0.01 0.01
min 0.01 0.01
max 0.07 0.07
s 0.08 0.08
v 1.5 1.5
,e delayCU 1 1
,g delayCU 1 1
.e refIC 1 1
.g refIC 1 1
,perception delayIC 1 1
,e delayP 1 1
,g delayP 1 1
,e delay 1 1
,g delay 1 1
Table 7. Table of parameters
47
,e delayy 1 1
g,delayy 1 1
,e delayVA 1 1
,g delayVA 1 1
,nonlin xph 0.45 0.45
,ynonlinph 0 0
,snonlinph 0.13 0.13
,minnonlinph -0.05 -0.05
1 1.3 1.0
0 0 0
0.05 0.05
0 0
gga 0.3 0.3
gea 0.4 0.4
r 0.05 0.05
Table 8 continued
48
2. INITIAL CONDITIONS FOR VARIABLES
Variable name Symbol Initial value (no debt)
Initial value (with
debts)
Nature hy 100 100
population hcx 30 30
Labor
productivity of
goods ga 1 1
Price of goods gP 1 1
Price of extracton eP 1 1
Capital of goods
sector gK 5.4 5.4
Capital of
extraction sector eK 0.6 0.6
Physical gross
output of
extraction eX 1.275 1.275
Net output of
goods gY 1.632 1.632
Physical output of
goods gX 3.06 3.06
Net output of
extraction eY 1.044 1.044
Debt of goods
sector gD 0 5.4
Debt of extraction
sector eD 0 0.6
Labor of goods
sector gL 3.06 3.06
Labor
productivity of
extraction sector ea 1 1
Labor of
extraction sector eL 1.275 1.275
Wage w 0.308651 0.308651
Profit of goods
sector g 0.809629 0.539629
Table 7. Initial conditions for variables
49
Profit of
extraciton sector e 0.348371 0.318371
Value added of
goods sector gVA 1.9341 1.9341
Value added of
extraction sector eVA 0.7419 0.7419
Extraction
inventory hw 1.275 1.275
Goods inventory G 3.06 3.06
Capacity
utilization of
goods sector gCU 0.85 0.85
Capacity
utilization of
extraction sector eCU 0.85 0.85
Perceived
inventory
coverage of goods
sector ,g perceivedIC 1 1
Perceived
inventory
coverage of
extraction sector e,perceivedIC 1 1
Table 9 continued
50
3. CODE VERSION 1 # Code name: LaisThesisCodeFinalV1.py
# By Qiuying (Cho) Lai
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import logistic
import csv
from scipy.integrate import odeint
def add_parameters(params, **kwargs):
params.update(kwargs)
def write_params(f_params_path):
params = {}
add_parameters(params,
# depletion (production) factor
delta_k=25e-3,
# nature carrying capacity
lambda_h=100,
# depreciation rate of capital
gamma_deprec=0.03,
# Rate at which accumulated extraction depreciates
deprec_h=0.0,
# efficiency of use of extraction by extraction
eff_ext_by_k_ext=0.01, # 0.01
# efficiency of use of extraction by goods capital
eff_ext_by_k_g=0.01,
# Birth rate of the population
beta_hc=0.03,
# Regeneration rate of nature
gamma_hc=1e-2,
# normal minimum and maximum death rate
alpha_min=0.01,
alpha_max=0.07,
# consumption per person when not in famine
s=8 * 1e-2,
# minimum required consumption per capita before famine starts
rho=10e-1,
# minimum required consumption per capita before famine starts
rho_k=0.05,
# accelerator (capital/output ratio)
v=1.5,
# rate of increase in labor productivity (for goods and extraction sector)
alpha_g=0.0,
# The time lag delay to use for looking up past Capacity Utilization values
cu_ext_delay=1.0,
cu_g_delay=1.0,
ic_ext_ref = 1.0,
ic_g_ref = 1.0,
ic_perception_delay = 1.0,
p_e_delay = 1.0,
p_g_delay = 1.0,
51
profit_e_delay = 1.0,
profit_g_delay = 1.0,
y_e_delay = 1.0,
y_g_delay = 1.0,
va_g_delay = 1.0,
va_e_delay= 1.0,
# Values for different Constants in the Phillips curves
# linear
ph_lin_interc=5.0,
ph_lin_s=-3.25,
# nonlinear
ph_nonlin_xval=0.45,
ph_nonlin_yval=0.0,
ph_nonlin_s=0.13, # 1.6
ph_nonlin_min=-0.05,
# logistic
ph_log_min=-0.05,
ph_log_max=0.3,
ph_log_s=2.5,
# Values for different Constants in the investment curves
inv_xval=3 * 0.03333,
inv_yval=3 * 0.03333, # inv_xval,
inv_s=2.5,
inv_min=0.0,
profit_share_nom=0.1,
inv_kappa1=1.3, # 1.02 0.98 per King to enable investment > profits above nominal profit
# share (profit_share_nom)
inv_kappa0=0.0, # profit_share_inverse_nom * (1 - inv_kappa1),
# Investment function using a logistic curve
# Invest_func = plogis(employment,location=ph_mlogistic,scale=ph_slogistic,
# log=FALSE)*ph_func_max
# Invest_func = plogis(profit_share,location=m,scale=inv_slogistic,log=FALSE)*invest_func_max
inv_slogistic=0.02,
# val = 0.02 describes sharpness of curve (lower values, quicker change in function from
# lowest to highest value)
invest_func_max=0.31,
# val = 0.25 maximum investment as a fraction of profits (logistic function has leveled off)
invest_eq_profits=0.1,
# val = 0.1 value where we assume investment = profits (> value: investment is > profits <
# value: investment < profits)
inv_mlogistic=0.11,
# m=0.1078775 the value of ("x" = profit share) the logistic at its inflection point
# Fraction of investment going to extraction (versus industrial output)
f_min=0.2, # nominally 0.05
f_max=1, # nominally ~ 0.4
# Larger numbers for "f_s" mean that the fraction of capital allocated to resources
# for large amounts of resources left is small and that the fraction allocated as
# resources get small increases at a faster rate.
f_s=7,
xi=0.05,
phi=0.0,
# a_ee=0.1,
a_gg=0.3,
a_ge=0.4,
# a_eg=0.03
)
# write the parameters
with open(f_params_path, 'w', newline='') as f_params:
writer_params = csv.writer(f_params)
52
for key, value in params.items():
writer_params.writerow([key, value])
f_params.close()
def write_initials(f_params_path, f_initials_path):
read_params(f_params_path)
initials = {}
x_hc_o = 30
a_g_o = 1
price_g_o = 1
price_e_o = 1
y_h_o = lambda_h
cu_e_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_e_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_e_o = np.interp(ic_ext_ref, cu_e_x, cu_e_y)
cu_g_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_g_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_g_o = np.interp(ic_g_ref, cu_g_x, cu_g_y)
k_tot_o = 0.2*x_hc_o
k_e_o = k_tot_o*0.1
k_g_o = k_tot_o - k_e_o
x_e_o = delta_k * k_e_o * y_h_o * cu_e_o
x_g_o = k_g_o * cu_g_o / v
matrix_xhat_o = np.matrix([[x_g_o, 0], [0, x_e_o]])
matrix_x_o = np.matrix([[x_g_o], [x_e_o]])
matrix_price_o = np.matrix([[price_g_o], [price_e_o]])
matrix_pricehat_o = np.matrix([[price_g_o, 0], [0, price_e_o]])
matrix_deprec_o = np.matrix([[gamma_deprec * k_g_o / x_g_o, 0], [gamma_deprec * k_e_o / x_e_o, 0]])
a_ee = eff_ext_by_k_ext/(delta_k * y_h_o)
a_eg = eff_ext_by_k_g * v
matrix_atilde_o = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
matrix_vtilde_o = np.matmul(np.matmul(matrix_xhat_o, (np.identity(2)-matrix_deprec_o-
matrix_atilde_o.transpose())),
matrix_price_o)
va_g_o = matrix_vtilde_o.item(0)
va_e_o = matrix_vtilde_o.item(1)
va_tot_o = va_g_o + va_e_o
d_e_o = k_e_o
d_g_o = k_g_o
d_tot_o = d_g_o + d_e_o
inv_g_o = price_g_o * gamma_deprec * k_g_o
inv_e_o = price_g_o * gamma_deprec * k_e_o
inv_tot_o = inv_g_o + inv_e_o
l_g_o = x_g_o/a_g_o
a_e_o = a_g_o * price_g_o / price_e_o
l_e_o = x_e_o/a_e_o
l_tot_o = l_g_o + l_e_o
w_o = 0.5 * va_tot_o / l_tot_o
matrix_a_o = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v + 1/price_e_o*inv_tot_o/x_g_o), a_ee]])
matrix_y_o = np.matmul(matrix_pricehat_o, matrix_x_o) - np.matmul(np.matmul(matrix_pricehat_o, matrix_a_o),
matrix_x_o)
y_g_o = matrix_y_o.item(0)
y_e_o = matrix_y_o.item(1)
53
r_o = xi
profit_g_o = price_g_o*x_g_o - price_g_o*a_gg*x_g_o - price_e_o*(eff_ext_by_k_g * v +
1/price_e_o*inv_tot_o/x_g_o)*x_g_o - w_o*l_g_o -\
r_o*d_g_o - price_g_o*gamma_deprec*k_g_o
profit_e_o = price_e_o*x_e_o - price_e_o*a_ee*x_e_o - price_g_o*a_ge*x_e_o - w_o*l_e_o -\
r_o*d_e_o - price_g_o*gamma_deprec*k_e_o
profit_tot_o = profit_g_o + profit_e_o
w_h_o = x_e_o/(1/cu_ext_delay)
g_o = x_g_o/(1/cu_g_delay)
ic_e_perceived_o = ic_ext_ref
ic_g_perceived_o = ic_g_ref
add_parameters(initials,
r_o=r_o,
y_h_o=y_h_o,
x_hc_o=x_hc_o,
a_g_o=a_g_o,
price_g_o=price_g_o,
price_e_o=price_e_o,
k_g_o=k_g_o,
k_e_o=k_e_o,
k_tot_o=k_tot_o,
x_e_o=x_e_o,
y_g_o=y_g_o,
x_g_o=x_g_o,
y_e_o=y_e_o,
# y_tot_o=y_tot_o,
# x_tot_o=x_tot_o,
d_g_o=d_g_o,
d_e_o=d_e_o,
d_tot_o=d_tot_o,
l_g_o=l_g_o,
a_e_o=a_e_o,
l_e_o=l_e_o,
l_tot_o=l_tot_o,
w_o=w_o,
profit_g_o=profit_g_o,
profit_e_o=profit_e_o,
profit_tot_o=profit_tot_o,
va_g_o=va_g_o,
va_e_o=va_e_o,
w_h_o=w_h_o,
g_o=g_o,
cu_g_o=cu_g_o,
cu_e_o=cu_e_o,
ic_e_perceived_o=ic_e_perceived_o,
ic_g_perceived_o=ic_g_perceived_o
)
with open(f_initials_path, 'w', newline='') as f_initials:
writer_initials = csv.writer(f_initials)
for key, value in initials.items():
writer_initials.writerow([key, value])
f_initials.close()
def write_initials_nodebt(f_params_path, f_initials_path):
read_params(f_params_path)
54
initials = {}
x_hc_o = 30
a_g_o = 1
price_g_o = 1
price_e_o = 1
y_h_o = lambda_h
cu_e_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_e_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_e_o = np.interp(ic_ext_ref, cu_e_x, cu_e_y)
cu_g_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_g_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_g_o = np.interp(ic_g_ref, cu_g_x, cu_g_y)
k_tot_o = 0.2*x_hc_o
k_e_o = k_tot_o*0.1
k_g_o = k_tot_o - k_e_o
x_e_o = delta_k * k_e_o * y_h_o * cu_e_o
x_g_o = k_g_o * cu_g_o / v
matrix_xhat_o = np.matrix([[x_g_o, 0], [0, x_e_o]])
matrix_x_o = np.matrix([[x_g_o], [x_e_o]])
matrix_price_o = np.matrix([[price_g_o], [price_e_o]])
matrix_pricehat_o = np.matrix([[price_g_o, 0], [0, price_e_o]])
matrix_deprec_o = np.matrix([[gamma_deprec * k_g_o / x_g_o, 0], [gamma_deprec * k_e_o / x_e_o, 0]])
a_ee = eff_ext_by_k_ext/(delta_k * y_h_o)
a_eg = eff_ext_by_k_g * v
matrix_atilde_o = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
matrix_vtilde_o = np.matmul(np.matmul(matrix_xhat_o, (np.identity(2)-matrix_deprec_o-
matrix_atilde_o.transpose())),
matrix_price_o)
va_g_o = matrix_vtilde_o.item(0)
va_e_o = matrix_vtilde_o.item(1)
va_tot_o = va_g_o + va_e_o
d_e_o = 0
d_g_o = 0
d_tot_o = d_g_o + d_e_o
inv_g_o = price_g_o * gamma_deprec * k_g_o
inv_e_o = price_g_o * gamma_deprec * k_e_o
inv_tot_o = inv_g_o + inv_e_o
l_g_o = x_g_o/a_g_o
a_e_o = a_g_o * price_g_o / price_e_o
l_e_o = x_e_o/a_e_o
l_tot_o = l_g_o + l_e_o
w_o = 0.5 * va_tot_o / l_tot_o
matrix_a_o = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v + 1/price_e_o*inv_tot_o/x_g_o), a_ee]])
matrix_y_o = np.matmul(matrix_pricehat_o, matrix_x_o) - np.matmul(np.matmul(matrix_pricehat_o, matrix_a_o),
matrix_x_o)
y_g_o = matrix_y_o.item(0)
y_e_o = matrix_y_o.item(1)
r_o = xi
profit_g_o = price_g_o*x_g_o - price_g_o*a_gg*x_g_o - price_e_o*(eff_ext_by_k_g * v +
1/price_e_o*inv_tot_o/x_g_o)*x_g_o - w_o*l_g_o -\
r_o*d_g_o - price_g_o*gamma_deprec*k_g_o
profit_e_o = price_e_o*x_e_o - price_e_o*a_ee*x_e_o - price_g_o*a_ge*x_e_o - w_o*l_e_o -\
55
r_o*d_e_o - price_g_o*gamma_deprec*k_e_o
profit_tot_o = profit_g_o + profit_e_o
w_h_o = x_e_o/(1/cu_ext_delay)
g_o = x_g_o/(1/cu_g_delay)
ic_e_perceived_o = ic_ext_ref
ic_g_perceived_o = ic_g_ref
add_parameters(initials,
r_o=r_o,
y_h_o=y_h_o,
x_hc_o=x_hc_o,
a_g_o=a_g_o,
price_g_o=price_g_o,
price_e_o=price_e_o,
k_g_o=k_g_o,
k_e_o=k_e_o,
k_tot_o=k_tot_o,
x_e_o=x_e_o,
y_g_o=y_g_o,
x_g_o=x_g_o,
y_e_o=y_e_o,
# y_tot_o=y_tot_o,
# x_tot_o=x_tot_o,
d_g_o=d_g_o,
d_e_o=d_e_o,
d_tot_o=d_tot_o,
l_g_o=l_g_o,
a_e_o=a_e_o,
l_e_o=l_e_o,
l_tot_o=l_tot_o,
w_o=w_o,
profit_g_o=profit_g_o,
profit_e_o=profit_e_o,
profit_tot_o=profit_tot_o,
va_g_o=va_g_o,
va_e_o=va_e_o,
w_h_o=w_h_o,
g_o=g_o,
cu_g_o=cu_g_o,
cu_e_o=cu_e_o,
ic_e_perceived_o=ic_e_perceived_o,
ic_g_perceived_o=ic_g_perceived_o
)
with open(f_initials_path, 'w', newline='') as f_initials:
writer_initials = csv.writer(f_initials)
for key, value in initials.items():
writer_initials.writerow([key, value])
f_initials.close()
# read the parameters from csv file as global variables
def read_params(f_params_path):
with open(f_params_path, 'r', newline='') as f_params:
reader_params = csv.reader(f_params)
mydict_params = {row[0]: float(row[1]) for row in reader_params}
globals().update(mydict_params)
f_params.close()
# read the initial values from csv file as global variables
def read_initials(f_initials_path):
with open(f_initials_path, 'r', newline='') as f_initials:
reader_initials = csv.reader(f_initials)
mydict_initials = {row[0]: float(row[1]) for row in reader_initials}
56
globals().update(mydict_initials)
f_initials.close()
# plot the time series in separate figure
def plot_separately(times, plot_item, plot_path):
font = 20
tickfont = 15
fig_now = plt.figure(figsize=(8, 5))
if type(plot_item[1]) is dict:
for k,v in plot_item[1].items():
plt.plot(times, v, '-', label=k)
plt.legend(fontsize=tickfont, loc=1)
else:
plt.plot(times, plot_item[1], '-', label=plot_item[0])
plt.xlabel('time', size=font)
plt.ylabel(plot_item[0], size=font)
plt.tick_params(axis='x', labelsize=tickfont)
plt.tick_params(axis='y', labelsize=tickfont)
plt.tight_layout()
fig_now.savefig(plot_path)
plt.close()
return
# Goodwin-HANDY model from t0 to tfinal ([t0, tfinal)) with certain interval (it)
def goodwin_handy_king(t0, tfinal, it):
def goodwinhandy_fix_inv_ratio(y, t, *parms):
a_g = y[0] # Labor Productivity
w_h = y[1] # Wealth
k_g = y[2] # Total Capital (for (i) extraction and (ii) industrial output)
x_hc = y[3] # Total Population
w = y[4] # Real wages
y_h = y[5] # Available Nature
d_g = y[6] # Debt
cu_e = y[7] # Capacity Utilization of extraction capital
ic_e_perceived = y[8] # Perceived inventory coverage
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract - max(CU_extract_y))
p_e = y[9] # "expected" price of wealth (or extracted nature)
cu_g = y[10]
ic_g_perceived = y[11]
g = y[12]
k_e = y[13]
d_e = y[14]
p_g = y[15]
profit_e = y[16]
profit_g = y[17]
y_e = y[18]
y_g = y[19]
va_e = y[20]
va_g = y[21]
d_tot = d_e + d_g
va_tot = va_e + va_g
y_tot = y_e + y_g
xi_now = xi
phi_now = phi
r = xi_now + phi_now * d_tot / va_tot
k_tot = k_g + k_e
profit_rate_g = profit_g/(p_g*k_g)
profit_rate_e = profit_e/(p_g*k_e)
profit_rate = (profit_g+profit_e)/(p_g*k_tot)
57
profit_share_g = profit_g/va_g
profit_share_e = profit_e/va_e
profit_share = (profit_g+profit_e)/va_tot
inv_func = max(0, inv_kappa0 + inv_kappa1 * profit_share)
inv_g = max(0, inv_func * va_tot * (1-inv_ratio_e))
inv_e = max(0, inv_func * va_tot * inv_ratio_e)
nature_extraction = delta_k * y_h * k_e * cu_e
x_g = k_g * cu_g / v
x_e = nature_extraction
matrix_x = np.matrix([[x_g], [x_e]])
matrix_xhat = np.matrix([[x_g, 0], [0, x_e]])
a_ee = eff_ext_by_k_ext / (delta_k * y_h)
a_eg = eff_ext_by_k_g * v + 1 / p_e * (inv_e + inv_g) / x_g
matrix_a = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
a_e = a_g*p_g/p_e
l_g = x_g/a_g
l_e = x_e/a_e
l_tot = l_g + l_e
employment_rate = l_tot/x_hc
w_g = w*l_g
w_e = w*l_e
w_tot = w_g + w_e
matrix_phat = np.matrix([[p_g, 0], [0, p_e]])
matrix_y = np.matmul(matrix_phat, matrix_x) - np.matmul(np.matmul(matrix_phat, matrix_a), matrix_x)
matrix_inv = np.matrix([[inv_g+inv_e], [0]])
matrix_c = matrix_y - matrix_inv
c_g = matrix_c.item(0)
c_e = matrix_c.item(1)
v_g_now = (profit_g + w_g + r * d_g + inv_g + inv_e)
v_e_now = (profit_e + w_e + r * d_e)
matrix_v = np.matrix([[v_g_now], [v_e_now]])
matrix_deprec = np.matrix([[gamma_deprec * k_g / x_g, 0], [gamma_deprec * k_e / x_e, 0]])
matrix_atilde = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v), a_ee]])
matrix_solve_price = np.matmul(np.linalg.inv(np.matmul(matrix_xhat, (np.identity(2) - matrix_deprec -
matrix_atilde.transpose()))),
matrix_v)
p_g_update = matrix_solve_price.item(0)
p_e_update = matrix_solve_price.item(1)
y_g_update = matrix_y.item(0)
y_e_update = matrix_y.item(1)
profit_g_update = p_g_update*x_g - p_g_update*a_gg*x_g - p_e_update*a_eg*x_g - w_g - \
r*d_g - p_g_update*gamma_deprec*k_g
profit_e_update = p_e_update * x_e - p_e_update * a_ee * x_e - p_g_update * a_ge * x_e - \
w_e - r * d_e - p_g_update * gamma_deprec * k_e
va_g_update = profit_g_update + w_g + r*d_g + p_g_update*gamma_deprec*k_g
va_e_update = profit_e_update + w_e + r*d_e + p_g_update*gamma_deprec*k_e
c_hc = c_e / p_e
v_c = 1 - (c_hc / (s * x_hc))
# Death rate of commoners and elites incluing the concept of famine ###
alpha_hc = alpha_min + ((np.fmax(0, v_c)) * (alpha_max - alpha_min))
matrix_intermediate = np.matmul(matrix_a, matrix_x)
intermediate_g = matrix_intermediate.item(0)
58
intermediate_e = matrix_intermediate.item(1)
targeted_consumption = c_hc + intermediate_e
ic_e = (w_h/cu_ext_delay)/targeted_consumption
cu_e_x = [0,0.25,0.50,0.75,1.00,1.25,1.50,1.75,2.00,2.25,1000.50]
cu_e_y = [0,0.30,0.55,0.75,0.85,0.90,0.94,0.98,0.99,1.00,1.0]
cu_e_1 = np.interp((1 / ic_e_perceived), cu_e_x, cu_e_y)
cu_e_indicated = cu_e_1
c_g_physical = c_g/p_g
targeted_consumption_g = c_g_physical + intermediate_g + (inv_g + inv_e)/p_g
ic_g = (g / cu_g_delay) / targeted_consumption_g
cu_g_1 = np.interp((1 / ic_g_perceived), cu_e_x, cu_e_y)
cu_g_indicated = cu_g_1
# targeted_consumption_lag = C_hc_lag + wealth_to_operate_K_goods_lag +
##########################
##########STATE EQUATIONS############
# WEALTH
w_h_dot = nature_extraction - c_hc - intermediate_e
# Change in Wealth when wealth must to go (i) consumption, (2) depreciation, (3) "power" input (possibly)
# and (4) wealth (in nature units) consumed per unit of investment (in "$/time" units)
# LABOR PRODUCTIVITY
a_dot = alpha_g * a_g # Labor productivity
# CAPITAL
k_g_dot = inv_g/p_g - gamma_deprec * k_g
k_e_dot = inv_e/p_g - gamma_deprec * k_e
# POPULATION
x_hc_dot = beta_hc * x_hc - alpha_hc * x_hc # Change in Commoner Population
# WAGES
w_dot = w * ((ph_nonlin_yval - ph_nonlin_min) * np.exp(
(ph_nonlin_s / (ph_nonlin_yval - ph_nonlin_min)) * (employment_rate - ph_nonlin_xval)) +
ph_nonlin_min)
# w_dot = ph_func * w # Change in Real Wage according to the Phillips Curve
# NATURE
y_h_dot = gamma_hc * y_h * (lambda_h - y_h) - nature_extraction # Change in Available Nature
# DEBT
d_e_dot = inv_e - profit_e
d_g_dot = inv_g - profit_g
## CU_EXTRACT (actual)
cu_e_dot = (cu_e_indicated - cu_e) / cu_ext_delay
cu_g_dot = (cu_g_indicated - cu_g) / cu_g_delay
## Perceived Inventory Coverage
ic_e_perceived_dot = (ic_e - ic_e_perceived) / ic_perception_delay
ic_g_perceived_dot = (ic_g - ic_g_perceived) / ic_perception_delay
p_e_dot = (p_e_update - p_e) / p_e_delay
p_g_dot = (p_g_update - p_g) / p_g_delay
profit_e_dot = (profit_e_update - profit_e) / profit_e_delay
profit_g_dot = (profit_g_update - profit_g) / profit_g_delay
g_dot = x_g - c_g_physical - (inv_g+inv_e)/p_g - intermediate_g
y_e_dot = (y_e_update - y_e)/y_e_delay
y_g_dot = (y_g_update - y_g) / y_g_delay
va_e_dot = (va_e_update - va_e) / va_e_delay
va_g_dot = (va_g_update - va_g) / va_g_delay
return [a_dot, w_h_dot, k_g_dot, x_hc_dot, w_dot, y_h_dot, d_g_dot, cu_e_dot, ic_e_perceived_dot,
59
p_e_dot, cu_g_dot, ic_g_perceived_dot, g_dot, k_e_dot, d_e_dot, p_g_dot, profit_e_dot, profit_g_dot,
y_e_dot, y_g_dot, va_e_dot, va_g_dot]
def run_fix_inv_ratio(inv_ratio_e_input):
read_params('\params_final.csv')
read_initials('\initials_final.csv')
global inv_ratio_e
inv_ratio_e = inv_ratio_e_input
yini = [a_g_o, w_h_o, k_g_o, x_hc_o, w_o, y_h_o, d_g_o, cu_e_o, ic_e_perceived_o, price_e_o, cu_g_o,
ic_g_perceived_o,
g_o, k_e_o, d_e_o, price_g_o, profit_e_o, profit_g_o, y_e_o, y_g_o, va_e_o, va_g_o]
times = np.linspace(t0, tfinal, (tfinal / it))
out = odeint(goodwinhandy_fix_inv_ratio, yini, times)
#######################
# OUTPUT FOR DIFFERENT VARIABLES###############
#######################
labor_productivity = out[:, 0]
wealth = out[:, 1]
# real_output = out[,4]
k_g = out[:, 2] # total capital
population = out[:, 3]
w = out[:, 4]
nature = out[:, 5]
d_g = out[:, 6]
cu_e = out[:, 7]
ic_e_perceived = out[:, 8]
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract-max(CU_extract_y))
p_e = out[:, 9]
cu_g = out[:, 10]
ic_g_perceived = out[:, 11]
g = out[:, 12]
k_e = out[:, 13]
d_e = out[:, 14]
p_g = out[:, 15]
profit_e = out[:, 16]
profit_g = out[:, 17]
y_e = out[:, 18]
y_g = out[:, 19]
va_e = out[:, 20]
va_g = out[:, 21]
nature_extraction = delta_k * nature * k_e * cu_e
x_e = nature_extraction
x_g = k_g * cu_g / v
y_tot = y_g + y_e
va_tot = va_g + va_e
capital = k_e + k_g
d_tot = d_g + d_e
debt_ratio = d_tot / va_tot
debt_ratio_g = d_g / va_g
debt_ratio_e = d_e / va_e
profit_tot = profit_g+profit_e
inv_e = inv_ratio_e * np.fmax(np.array([0] * int(tfinal/it)), np.array([inv_kappa0] * int(tfinal/it)) +
inv_kappa1 * profit_tot / va_tot) * va_tot
inv_g = (1-inv_ratio_e) * np.fmax(np.array([0] * int(tfinal/it)), np.array([inv_kappa0] * int(tfinal/it)) +
inv_kappa1 * profit_tot / va_tot) * va_tot
inv_tot = inv_e + inv_g
l_g = x_g / labor_productivity
labor_productivity_e = labor_productivity*p_g/p_e
l_e = x_e / labor_productivity_e
60
l_tot = l_g + l_e
employment_rate = l_tot/population
plot_dict = {
'population (person)': population,
'nature (nature)': nature,
'investment (money per time)': {'total': inv_tot, 'extraction': inv_e, 'goods': inv_g},
'investment share (%)': {'total': inv_tot/y_tot*100, 'extraction': inv_e/y_e*100, 'goods': inv_g/y_g*100},
'debts (money)': {'total': d_tot, 'extraction': d_e, 'goods': d_g},
'employment rate (%)': employment_rate*100,
'profit (money per time)': {'total': profit_tot, 'extraction': profit_e, 'goods': profit_g},
'profit share (%)': {'total': profit_tot/va_tot *100, 'extraction': profit_e/va_e*100,
'goods': profit_g/va_g*100},
'capital (goods)': {'total': (k_g+k_e),'extraction': k_e, 'goods': k_g},
'GDP (money per time)': va_tot,
}
for plot_k, plot_v in plot_dict.items():
plot_separately(times=times, plot_item=[plot_k, plot_v],
plot_path='.\LaisThesisCodeFinalv1_'+plot_k+'.png')
run_fix_inv_ratio(0.5)
plt.close('all')
def goodwin_handy_king_nodebt(t0, tfinal, it):
def goodwinhandy_fix_inv_ratio_nodebt(y, t, *parms):
a_g = y[0] # Labor Productivity
w_h = y[1] # Wealth
k_g = y[2] # Total Capital (for (i) extraction and (ii) industrial output)
x_hc = y[3] # Total Population
w = y[4] # Real wages
y_h = y[5] # Available Nature
d_g = y[6] # Debt
cu_e = y[7] # Capacity Utilization of extraction capital
ic_e_perceived = y[8] # Perceived inventory coverage
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract - max(CU_extract_y))
p_e = y[9] # "expected" price of wealth (or extracted nature)
cu_g = y[10]
ic_g_perceived = y[11]
g = y[12]
k_e = y[13]
d_e = y[14]
p_g = y[15]
profit_e = y[16]
profit_g = y[17]
y_e = y[18]
y_g = y[19]
va_e = y[20]
va_g = y[21]
d_tot = d_e + d_g
va_tot = va_e + va_g
y_tot = y_e + y_g
xi_now = xi
phi_now = phi
r = xi_now + phi_now * d_tot / va_tot
k_tot = k_g + k_e
profit_rate_g = profit_g/(p_g*k_g)
profit_rate_e = profit_e/(p_g*k_e)
profit_rate = (profit_g+profit_e)/(p_g*k_tot)
profit_share_g = profit_g/va_g
profit_share_e = profit_e/va_e
61
profit_tot = profit_g+profit_e
profit_share = profit_tot/va_tot
inv_func = max(0, inv_kappa0 + inv_kappa1 * profit_share)
inv_g = max(0, profit_g)
inv_e = max(0, profit_e)
nature_extraction = delta_k * y_h * k_e * cu_e
x_g = k_g * cu_g / v
x_e = nature_extraction
matrix_x = np.matrix([[x_g], [x_e]])
matrix_xhat = np.matrix([[x_g, 0], [0, x_e]])
a_ee = eff_ext_by_k_ext / (delta_k * y_h)
a_eg = eff_ext_by_k_g * v + 1 / p_e * (inv_e + inv_g) / x_g
matrix_a = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
a_e = a_g*p_g/p_e
l_g = x_g/a_g
l_e = x_e/a_e
l_tot = l_g + l_e
employment_rate = l_tot/x_hc
w_g = w*l_g
w_e = w*l_e
w_tot = w_g + w_e
matrix_phat = np.matrix([[p_g, 0], [0, p_e]])
matrix_y = np.matmul(matrix_phat, matrix_x) - np.matmul(np.matmul(matrix_phat, matrix_a), matrix_x)
matrix_inv = np.matrix([[inv_g+inv_e], [0]])
matrix_c = matrix_y - matrix_inv
c_g = matrix_c.item(0)
c_e = matrix_c.item(1)
v_g_now = (profit_g + w_g + r * d_g + inv_g + inv_e)
v_e_now = (profit_e + w_e + r * d_e)
matrix_v = np.matrix([[v_g_now], [v_e_now]])
matrix_deprec = np.matrix([[gamma_deprec * k_g / x_g, 0], [gamma_deprec * k_e / x_e, 0]])
matrix_atilde = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v), a_ee]])
matrix_solve_price = np.matmul(np.linalg.inv(np.matmul(matrix_xhat, (np.identity(2) - matrix_deprec -
matrix_atilde.transpose()))),
matrix_v)
p_g_update = matrix_solve_price.item(0)
p_e_update = matrix_solve_price.item(1)
y_g_update = matrix_y.item(0)
y_e_update = matrix_y.item(1)
profit_g_update = p_g_update*x_g - p_g_update*a_gg*x_g - p_e_update*a_eg*x_g - w_g - \
r*d_g - p_g_update*gamma_deprec*k_g
profit_e_update = p_e_update * x_e - p_e_update * a_ee * x_e - p_g_update * a_ge * x_e - \
w_e - r * d_e - p_g_update * gamma_deprec * k_e
va_g_update = profit_g_update + w_g + r*d_g + p_g_update*gamma_deprec*k_g
va_e_update = profit_e_update + w_e + r*d_e + p_g_update*gamma_deprec*k_e
c_hc = c_e / p_e
v_c = 1 - (c_hc / (s * x_hc))
# Death rate of commoners and elites incluing the concept of famine ###
alpha_hc = alpha_min + ((np.fmax(0, v_c)) * (alpha_max - alpha_min))
matrix_intermediate = np.matmul(matrix_a, matrix_x)
intermediate_g = matrix_intermediate.item(0)
intermediate_e = matrix_intermediate.item(1)
62
targeted_consumption = c_hc + intermediate_e
ic_e = (w_h/cu_ext_delay)/targeted_consumption
cu_e_x = [0,0.25,0.50,0.75,1.00,1.25,1.50,1.75,2.00,2.25,1000.50]
cu_e_y = [0,0.30,0.55,0.75,0.85,0.90,0.94,0.98,0.99,1.00,1.0]
cu_e_1 = np.interp((1 / ic_e_perceived), cu_e_x, cu_e_y)
cu_e_indicated = cu_e_1
c_g_physical = c_g/p_g
targeted_consumption_g = c_g_physical + intermediate_g + (inv_g + inv_e)/p_g
ic_g = (g / cu_g_delay) / targeted_consumption_g
cu_g_1 = np.interp((1 / ic_g_perceived), cu_e_x, cu_e_y)
cu_g_indicated = cu_g_1
# targeted_consumption_lag = C_hc_lag + wealth_to_operate_K_goods_lag +
##########################
##########STATE EQUATIONS############
# WEALTH
w_h_dot = nature_extraction - c_hc - intermediate_e
# Change in Wealth when wealth must to go (i) consumption, (2) depreciation, (3) "power" input (possibly)
# and (4) wealth (in nature units) consumed per unit of investment (in "$/time" units)
# LABOR PRODUCTIVITY
a_dot = alpha_g * a_g # Labor productivity
# CAPITAL
k_g_dot = inv_g/p_g - gamma_deprec * k_g
k_e_dot = inv_e/p_g - gamma_deprec * k_e
# OUTPUT
# Y_dot = ((Investment/Y/v) - gamma_deprec)*Y # Change in Output
# POPULATION
x_hc_dot = beta_hc * x_hc - alpha_hc * x_hc # Change in Commoner Population
# WAGES
w_dot = w * ((ph_nonlin_yval - ph_nonlin_min) * np.exp(
(ph_nonlin_s / (ph_nonlin_yval - ph_nonlin_min)) * (employment_rate - ph_nonlin_xval)) +
ph_nonlin_min)
# w_dot = ph_func * w # Change in Real Wage according to the Phillips Curve
# NATURE
y_h_dot = gamma_hc * y_h * (lambda_h - y_h) - nature_extraction # Change in Available Nature
# DEBT
d_e_dot = inv_e - profit_e
d_g_dot = inv_g - profit_g
## CU_EXTRACT (actual)
cu_e_dot = (cu_e_indicated - cu_e) / cu_ext_delay
cu_g_dot = (cu_g_indicated - cu_g) / cu_g_delay
## Perceived Inventory Coverage
ic_e_perceived_dot = (ic_e - ic_e_perceived) / ic_perception_delay
ic_g_perceived_dot = (ic_g - ic_g_perceived) / ic_perception_delay
p_e_dot = (p_e_update - p_e) / p_e_delay
p_g_dot = (p_g_update - p_g) / p_g_delay
profit_e_dot = (profit_e_update - profit_e) / profit_e_delay
profit_g_dot = (profit_g_update - profit_g) / profit_g_delay
g_dot = x_g - c_g_physical - (inv_g+inv_e)/p_g - intermediate_g
y_e_dot = (y_e_update - y_e)/y_e_delay
y_g_dot = (y_g_update - y_g) / y_g_delay
va_e_dot = (va_e_update - va_e) / va_e_delay
63
va_g_dot = (va_g_update - va_g) / va_g_delay
return [a_dot, w_h_dot, k_g_dot, x_hc_dot, w_dot, y_h_dot, d_g_dot, cu_e_dot, ic_e_perceived_dot,
p_e_dot, cu_g_dot, ic_g_perceived_dot, g_dot, k_e_dot, d_e_dot, p_g_dot, profit_e_dot, profit_g_dot,
y_e_dot, y_g_dot, va_e_dot, va_g_dot]
def run_fix_inv_ratio_nodebt():
read_params('\params_final.csv')
read_initials('\initials_final_nodebt.csv')
yini = [a_g_o, w_h_o, k_g_o, x_hc_o, w_o, y_h_o, d_g_o, cu_e_o, ic_e_perceived_o, price_e_o, cu_g_o,
ic_g_perceived_o,
g_o, k_e_o, d_e_o, price_g_o, profit_e_o, profit_g_o, y_e_o, y_g_o, va_e_o, va_g_o]
times = np.linspace(t0, tfinal, (tfinal / it))
out = odeint(goodwinhandy_fix_inv_ratio_nodebt, yini, times)
#######################
# OUTPUT FOR DIFFERENT VARIABLES###############
#######################
labor_productivity = out[:, 0]
wealth = out[:, 1]
# real_output = out[,4]
k_g = out[:, 2] # total capital
population = out[:, 3]
w = out[:, 4]
nature = out[:, 5]
d_g = out[:, 6]
cu_e = out[:, 7]
ic_e_perceived = out[:, 8]
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract-max(CU_extract_y))
p_e = out[:, 9]
cu_g = out[:, 10]
ic_g_perceived = out[:, 11]
g = out[:, 12]
k_e = out[:, 13]
d_e = out[:, 14]
p_g = out[:, 15]
profit_e = out[:, 16]
profit_g = out[:, 17]
y_e = out[:, 18]
y_g = out[:, 19]
va_e = out[:, 20]
va_g = out[:, 21]
nature_extraction = delta_k * nature * k_e * cu_e
x_e = nature_extraction
x_g = k_g * cu_g / v
y_tot = y_g + y_e
va_tot = va_g + va_e
capital = k_e + k_g
d_tot = d_g + d_e
debt_ratio = d_tot / va_tot
debt_ratio_g = d_g / va_g
debt_ratio_e = d_e / va_e
profit_tot = profit_g+profit_e
# inv_e = inv_ratio_e * np.fmax(np.array([0] * int(tfinal/it)), np.array([inv_kappa0] * int(tfinal/it)) +
# inv_kappa1 * profit_tot / va_tot) * va_tot
# inv_g = (1-inv_ratio_e) * np.fmax(np.array([0] * int(tfinal/it)), np.array([inv_kappa0] * int(tfinal/it)) +
# inv_kappa1 * profit_tot / va_tot) * va_tot
inv_e = profit_e
inv_g = profit_g
inv_tot = inv_e + inv_g
64
l_g = x_g / labor_productivity
labor_productivity_e = labor_productivity*p_g/p_e
l_e = x_e / labor_productivity_e
l_tot = l_g + l_e
employment_rate = l_tot/population
plot_dict = {
'population (person)': population,
'nature (nature)': nature,
'investment (money per time)': {'total': inv_tot, 'extraction': inv_e, 'goods': inv_g},
'investment share (%)': {'total': inv_tot/y_tot*100, 'extraction': inv_e/y_e*100, 'goods': inv_g/y_g*100},
'debts (money)': {'total': d_tot, 'extraction': d_e, 'goods': d_g},
'employment rate (%)': employment_rate*100,
'profit (money per time)': {'total': profit_tot, 'extraction': profit_e, 'goods': profit_g},
'profit share (%)': {'total': profit_tot/va_tot *100, 'extraction': profit_e/va_e*100,
'goods': profit_g/va_g*100},
'capital (goods)': {'total': (k_g+k_e),'extraction': k_e, 'goods': k_g},
'GDP (money per time)': va_tot,
}
for plot_k, plot_v in plot_dict.items():
plot_separately(times=times, plot_item=[plot_k, plot_v],
plot_path='.\LaisThesisCodeFinalv1nodebt_'+plot_k
+'.png')
run_fix_inv_ratio_nodebt()
plt.close('all')
if __name__ == "__main__":
write_params('.\params_final.csv')
write_initials(f_params_path='.\params_final.csv',
f_initials_path='.\initials_final.csv')
goodwin_handy_king(0, 400, 0.1)
write_initials_nodebt(f_params_path='.\params_final.csv',
f_initials_path='.\initials_final_nodebt.csv')
goodwin_handy_king_nodebt(0, 400, 0.1)
4. CODE VERSION 2 # Code name: LaisThesisCodeFinalV2.py
# By Qiuying (Cho) Lai
65
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import logistic
import csv
from scipy.integrate import odeint
def add_parameters(params, **kwargs):
params.update(kwargs)
def write_params(f_params_path):
params = {}
add_parameters(params,
# depletion (production) factor
delta_k=25e-3,
# nature carrying capacity
lambda_h=100,
# depreciation rate of capital
gamma_deprec=0.03,
# Rate at which accumulated extraction depreciates
deprec_h=0.0,
# efficiency of use of extraction by extraction
eff_ext_by_k_ext=0.01, # 0.01
# efficiency of use of extraction by goods capital
eff_ext_by_k_g=0.01,
# Birth rate of the population
beta_hc=0.03,
# Regeneration rate of nature
gamma_hc=1e-2,
# normal minimum and maximum death rate
alpha_min=0.01,
alpha_max=0.07,
# consumption per person when not in famine
s=8 * 1e-2,
# minimum required consumption per capita before famine starts
rho=10e-1,
# minimum required consumption per capita before famine starts
rho_k=0.05,
# accelerator (capital/output ratio)
v=1.5,
# rate of increase in labor productivity (for goods and extraction sector)
alpha_g=0.0,
# The time lag delay to use for looking up past Capacity Utilization values
cu_ext_delay=1.0,
cu_g_delay=1.0,
ic_ext_ref = 1.0,
ic_g_ref = 1.0,
ic_perception_delay = 1.0,
p_e_delay = 1.0,
p_g_delay = 1.0,
profit_e_delay = 1.0,
profit_g_delay = 1.0,
y_e_delay = 1.0,
y_g_delay = 1.0,
66
va_g_delay = 1.0,
va_e_delay= 1.0,
# Values for different Constants in the Phillips curves
# linear
ph_lin_interc=5.0,
ph_lin_s=-3.25,
# nonlinear
ph_nonlin_xval=0.45,
ph_nonlin_yval=0.0,
ph_nonlin_s=0.13, # 1.6
ph_nonlin_min=-0.05,
# logistic
ph_log_min=-0.05,
ph_log_max=0.3,
ph_log_s=2.5,
# Values for different Constants in the investment curves
inv_xval=3 * 0.03333,
inv_yval=3 * 0.03333, # inv_xval,
inv_s=2.5,
inv_min=0.0,
profit_share_nom=0.1,
inv_kappa1=1.3, # 1.02 0.98 per King to enable investment > profits above nominal profit
# share (profit_share_nom)
inv_kappa0=0.0, # profit_share_inverse_nom * (1 - inv_kappa1),
# Investment function using a logistic curve
# Invest_func = plogis(employment,location=ph_mlogistic,scale=ph_slogistic,
# log=FALSE)*ph_func_max
# Invest_func = plogis(profit_share,location=m,scale=inv_slogistic,log=FALSE)*invest_func_max
inv_slogistic=0.02,
# val = 0.02 describes sharpness of curve (lower values, quicker change in function from
# lowest to highest value)
invest_func_max=0.31,
# val = 0.25 maximum investment as a fraction of profits (logistic function has leveled off)
invest_eq_profits=0.1,
# val = 0.1 value where we assume investment = profits (> value: investment is > profits <
# value: investment < profits)
inv_mlogistic=0.11,
# m=0.1078775 the value of ("x" = profit share) the logistic at its inflection point
# Fraction of investment going to extraction (versus industrial output)
f_min=0.2, # nominally 0.05
f_max=1, # nominally ~ 0.4
# Larger numbers for "f_s" mean that the fraction of capital allocated to resources
# for large amounts of resources left is small and that the fraction allocated as
# resources get small increases at a faster rate.
f_s=7,
xi=0.05,
phi=0.0,
# a_ee=0.1,
a_gg=0.3,
a_ge=0.4,
# a_eg=0.03
)
def write_initials(f_params_path, f_initials_path):
read_params(f_params_path)
initials = {}
67
x_hc_o = 30
a_g_o = 1
price_g_o = 1
price_e_o = 1
y_h_o = lambda_h
cu_e_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_e_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_e_o = np.interp(ic_ext_ref, cu_e_x, cu_e_y)
cu_g_x = [0, 0.25, 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 2.00, 2.25, 1000.50]
cu_g_y = [0, 0.30, 0.55, 0.75, 0.85, 0.90, 0.94, 0.98, 0.99, 1.00, 1.0]
cu_g_o = np.interp(ic_g_ref, cu_g_x, cu_g_y)
k_tot_o = 0.2*x_hc_o
k_e_o = k_tot_o*0.1
k_g_o = k_tot_o - k_e_o
x_e_o = delta_k * k_e_o * y_h_o * cu_e_o
x_g_o = k_g_o * cu_g_o / v
matrix_xhat_o = np.matrix([[x_g_o, 0], [0, x_e_o]])
matrix_x_o = np.matrix([[x_g_o], [x_e_o]])
matrix_price_o = np.matrix([[price_g_o], [price_e_o]])
matrix_pricehat_o = np.matrix([[price_g_o, 0], [0, price_e_o]])
matrix_deprec_o = np.matrix([[gamma_deprec * k_g_o / x_g_o, 0], [gamma_deprec * k_e_o / x_e_o, 0]])
a_ee = eff_ext_by_k_ext/(delta_k * y_h_o)
a_eg = eff_ext_by_k_g * v
matrix_atilde_o = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
matrix_vtilde_o = np.matmul(np.matmul(matrix_xhat_o, (np.identity(2)-matrix_deprec_o-
matrix_atilde_o.transpose())),
matrix_price_o)
va_g_o = matrix_vtilde_o.item(0)
va_e_o = matrix_vtilde_o.item(1)
va_tot_o = va_g_o + va_e_o
d_e_o = k_e_o
d_g_o = k_g_o
d_tot_o = d_g_o + d_e_o
inv_g_o = price_g_o * gamma_deprec * k_g_o
inv_e_o = price_g_o * gamma_deprec * k_e_o
inv_tot_o = inv_g_o + inv_e_o
l_g_o = x_g_o/a_g_o
a_e_o = a_g_o * price_g_o / price_e_o
l_e_o = x_e_o/a_e_o
l_tot_o = l_g_o + l_e_o
w_o = 0.5 * va_tot_o / l_tot_o
matrix_a_o = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v + 1/price_e_o*inv_tot_o/x_g_o), a_ee]])
matrix_y_o = np.matmul(matrix_pricehat_o, matrix_x_o) - np.matmul(np.matmul(matrix_pricehat_o, matrix_a_o),
matrix_x_o)
y_g_o = matrix_y_o.item(0)
y_e_o = matrix_y_o.item(1)
r_o = xi
profit_g_o = price_g_o*x_g_o - price_g_o*a_gg*x_g_o - price_e_o*(eff_ext_by_k_g * v +
1/price_e_o*inv_tot_o/x_g_o)*x_g_o - w_o*l_g_o -\
r_o*d_g_o - price_g_o*gamma_deprec*k_g_o
profit_e_o = price_e_o*x_e_o - price_e_o*a_ee*x_e_o - price_g_o*a_ge*x_e_o - w_o*l_e_o -\
r_o*d_e_o - price_g_o*gamma_deprec*k_e_o
profit_tot_o = profit_g_o + profit_e_o
68
w_h_o = x_e_o/(1/cu_ext_delay)
g_o = x_g_o/(1/cu_g_delay)
ic_e_perceived_o = ic_ext_ref
ic_g_perceived_o = ic_g_ref
add_parameters(initials,
r_o=r_o,
y_h_o=y_h_o,
x_hc_o=x_hc_o,
a_g_o=a_g_o,
price_g_o=price_g_o,
price_e_o=price_e_o,
k_g_o=k_g_o,
k_e_o=k_e_o,
k_tot_o=k_tot_o,
x_e_o=x_e_o,
y_g_o=y_g_o,
x_g_o=x_g_o,
y_e_o=y_e_o,
# y_tot_o=y_tot_o,
# x_tot_o=x_tot_o,
d_g_o=d_g_o,
d_e_o=d_e_o,
d_tot_o=d_tot_o,
l_g_o=l_g_o,
a_e_o=a_e_o,
l_e_o=l_e_o,
l_tot_o=l_tot_o,
w_o=w_o,
profit_g_o=profit_g_o,
profit_e_o=profit_e_o,
profit_tot_o=profit_tot_o,
va_g_o=va_g_o,
va_e_o=va_e_o,
w_h_o=w_h_o,
g_o=g_o,
cu_g_o=cu_g_o,
cu_e_o=cu_e_o,
ic_e_perceived_o=ic_e_perceived_o,
ic_g_perceived_o=ic_g_perceived_o
)
with open(f_initials_path, 'w', newline='') as f_initials:
writer_initials = csv.writer(f_initials)
for key, value in initials.items():
writer_initials.writerow([key, value])
f_initials.close()
# read the parameters from csv file as global variables
def read_params(f_params_path):
with open(f_params_path, 'r', newline='') as f_params:
reader_params = csv.reader(f_params)
mydict_params = {row[0]: float(row[1]) for row in reader_params}
globals().update(mydict_params)
f_params.close()
# read the initial values from csv file as global variables
def read_initials(f_initials_path):
with open(f_initials_path, 'r', newline='') as f_initials:
reader_initials = csv.reader(f_initials)
mydict_initials = {row[0]: float(row[1]) for row in reader_initials}
globals().update(mydict_initials)
69
f_initials.close()
def plot_multi_separately(times, changing_v, plot_dict, plot_path_prefix):
font = 20
tickfont = 15
num_fig = 0
for plot_k, plot_v in sorted(plot_dict.items()):
num_fig = num_fig + 1
fig_now = plt.figure(num=num_fig, figsize=(8, 5))
if type(plot_v) is dict:
for k,v in plot_v.items():
plt.plot(times, v, '-', label=k)
plt.legend(fontsize=tickfont, loc=1)
else:
plt.plot(times, plot_v, '-', label=changing_v)
plt.legend(fontsize=tickfont, loc=1)
plt.xlabel('time', size=font)
plt.ylabel(plot_k, size=font)
plt.tick_params(axis='x', labelsize=tickfont)
plt.tick_params(axis='y', labelsize=tickfont)
plt.tight_layout()
fig_now.savefig(plot_path_prefix + plot_k +'.png')
return
# Goodwin-HANDY model from t0 to tfinal ([t0, tfinal)) with certain interval (it)
def goodwin_handy_king(t0, tfinal, it):
def goodwinhandy_fix_inv_ratio(y, t, *parms):
a_g = y[0] # Labor Productivity
w_h = y[1] # Wealth
k_g = y[2] # Total Capital (for (i) extraction and (ii) industrial output)
x_hc = y[3] # Total Population
w = y[4] # Real wages
y_h = y[5] # Available Nature
d_g = y[6] # Debt
cu_e = y[7] # Capacity Utilization of extraction capital
ic_e_perceived = y[8] # Perceived inventory coverage
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract - max(CU_extract_y))
p_e = y[9] # "expected" price of wealth (or extracted nature)
cu_g = y[10]
ic_g_perceived = y[11]
g = y[12]
k_e = y[13]
d_e = y[14]
p_g = y[15]
profit_e = y[16]
profit_g = y[17]
y_e = y[18]
y_g = y[19]
va_e = y[20]
va_g = y[21]
d_tot = d_e + d_g
va_tot = va_e + va_g
y_tot = y_e + y_g
xi_now = xi
phi_now = phi
r = xi_now + phi_now * d_tot / va_tot
k_tot = k_g + k_e
profit_rate_g = profit_g/(p_g*k_g)
70
profit_rate_e = profit_e/(p_g*k_e)
profit_rate = (profit_g+profit_e)/(p_g*k_tot)
profit_share_g = profit_g/va_g
profit_share_e = profit_e/va_e
profit_share = (profit_g+profit_e)/va_tot
inv_func = max(0, inv_kappa0 + inv_kappa1 * profit_share)
inv_g = max(0, inv_func * va_tot * (1-inv_ratio_e))
inv_e = max(0, inv_func * va_tot * inv_ratio_e)
nature_extraction = delta_k * y_h * k_e * cu_e
x_g = k_g * cu_g / v
x_e = nature_extraction
matrix_x = np.matrix([[x_g], [x_e]])
matrix_xhat = np.matrix([[x_g, 0], [0, x_e]])
a_ee = eff_ext_by_k_ext / (delta_k * y_h)
a_eg = eff_ext_by_k_g * v + 1 / p_e * (inv_e + inv_g) / x_g
matrix_a = np.matrix([[a_gg, a_ge], [a_eg, a_ee]])
a_e = a_g*p_g/p_e
l_g = x_g/a_g
l_e = x_e/a_e
l_tot = l_g + l_e
employment_rate = l_tot/x_hc
w_g = w*l_g
w_e = w*l_e
w_tot = w_g + w_e
matrix_phat = np.matrix([[p_g, 0], [0, p_e]])
matrix_y = np.matmul(matrix_phat, matrix_x) - np.matmul(np.matmul(matrix_phat, matrix_a), matrix_x)
matrix_inv = np.matrix([[inv_g+inv_e], [0]])
matrix_c = matrix_y - matrix_inv
c_g = matrix_c.item(0)
c_e = matrix_c.item(1)
v_g_now = (profit_g + w_g + r * d_g + inv_g + inv_e)
v_e_now = (profit_e + w_e + r * d_e)
matrix_v = np.matrix([[v_g_now], [v_e_now]])
matrix_deprec = np.matrix([[gamma_deprec * k_g / x_g, 0], [gamma_deprec * k_e / x_e, 0]])
matrix_atilde = np.matrix([[a_gg, a_ge], [(eff_ext_by_k_g * v), a_ee]])
matrix_solve_price = np.matmul(np.linalg.inv(np.matmul(matrix_xhat, (np.identity(2) - matrix_deprec -
matrix_atilde.transpose()))),
matrix_v)
p_g_update = matrix_solve_price.item(0)
p_e_update = matrix_solve_price.item(1)
y_g_update = matrix_y.item(0)
y_e_update = matrix_y.item(1)
profit_g_update = p_g_update*x_g - p_g_update*a_gg*x_g - p_e_update*a_eg*x_g - w_g - \
r*d_g - p_g_update*gamma_deprec*k_g
profit_e_update = p_e_update * x_e - p_e_update * a_ee * x_e - p_g_update * a_ge * x_e - \
w_e - r * d_e - p_g_update * gamma_deprec * k_e
va_g_update = profit_g_update + w_g + r*d_g + p_g_update*gamma_deprec*k_g
va_e_update = profit_e_update + w_e + r*d_e + p_g_update*gamma_deprec*k_e
c_hc = c_e / p_e
v_c = 1 - (c_hc / (s * x_hc))
# Death rate of commoners and elites incluing the concept of famine ###
alpha_hc = alpha_min + ((np.fmax(0, v_c)) * (alpha_max - alpha_min))
71
matrix_intermediate = np.matmul(matrix_a, matrix_x)
intermediate_g = matrix_intermediate.item(0)
intermediate_e = matrix_intermediate.item(1)
targeted_consumption = c_hc + intermediate_e
ic_e = (w_h/cu_ext_delay)/targeted_consumption
cu_e_x = [0,0.25,0.50,0.75,1.00,1.25,1.50,1.75,2.00,2.25,1000.50]
cu_e_y = [0,0.30,0.55,0.75,0.85,0.90,0.94,0.98,0.99,1.00,1.0]
cu_e_1 = np.interp((1 / ic_e_perceived), cu_e_x, cu_e_y)
cu_e_indicated = cu_e_1
c_g_physical = c_g/p_g
targeted_consumption_g = c_g_physical + intermediate_g + (inv_g + inv_e)/p_g
ic_g = (g / cu_g_delay) / targeted_consumption_g
cu_g_1 = np.interp((1 / ic_g_perceived), cu_e_x, cu_e_y)
cu_g_indicated = cu_g_1
# targeted_consumption_lag = C_hc_lag + wealth_to_operate_K_goods_lag +
##########################
##########STATE EQUATIONS############
# WEALTH
w_h_dot = nature_extraction - c_hc - intermediate_e
# Change in Wealth when wealth must to go (i) consumption, (2) depreciation, (3) "power" input (possibly)
# and (4) wealth (in nature units) consumed per unit of investment (in "$/time" units)
# LABOR PRODUCTIVITY
a_dot = alpha_g * a_g # Labor productivity
# CAPITAL
k_g_dot = inv_g/p_g - gamma_deprec * k_g
k_e_dot = inv_e/p_g - gamma_deprec * k_e
# OUTPUT
# Y_dot = ((Investment/Y/v) - gamma_deprec)*Y # Change in Output
# POPULATION
x_hc_dot = beta_hc * x_hc - alpha_hc * x_hc # Change in Commoner Population
# WAGES
w_dot = w * ((ph_nonlin_yval - ph_nonlin_min) * np.exp(
(ph_nonlin_s / (ph_nonlin_yval - ph_nonlin_min)) * (employment_rate - ph_nonlin_xval)) + ph_nonlin_min)
# w_dot = ph_func * w # Change in Real Wage according to the Phillips Curve
# NATURE
y_h_dot = gamma_hc * y_h * (lambda_h - y_h) - nature_extraction # Change in Available Nature
# DEBT
d_e_dot = inv_e - profit_e
d_g_dot = inv_g - profit_g
## CU_EXTRACT (actual)
cu_e_dot = (cu_e_indicated - cu_e) / cu_ext_delay
cu_g_dot = (cu_g_indicated - cu_g) / cu_g_delay
## Perceived Inventory Coverage
ic_e_perceived_dot = (ic_e - ic_e_perceived) / ic_perception_delay
ic_g_perceived_dot = (ic_g - ic_g_perceived) / ic_perception_delay
p_e_dot = (p_e_update - p_e) / p_e_delay
p_g_dot = (p_g_update - p_g) / p_g_delay
profit_e_dot = (profit_e_update - profit_e) / profit_e_delay
profit_g_dot = (profit_g_update - profit_g) / profit_g_delay
g_dot = x_g - c_g_physical - (inv_g+inv_e)/p_g - intermediate_g
y_e_dot = (y_e_update - y_e)/y_e_delay
y_g_dot = (y_g_update - y_g) / y_g_delay
72
va_e_dot = (va_e_update - va_e) / va_e_delay
va_g_dot = (va_g_update - va_g) / va_g_delay
return [a_dot, w_h_dot, k_g_dot, x_hc_dot, w_dot, y_h_dot, d_g_dot, cu_e_dot, ic_e_perceived_dot,
p_e_dot, cu_g_dot, ic_g_perceived_dot, g_dot, k_e_dot, d_e_dot, p_g_dot, profit_e_dot, profit_g_dot,
y_e_dot, y_g_dot, va_e_dot, va_g_dot]
def run_try_fix_inv_ratio(inv_ratio_e_input):
read_params('.\params_final.csv')
read_initials('.\initials_final.csv')
global inv_ratio_e
inv_ratio_e = inv_ratio_e_input
yini = [a_g_o, w_h_o, k_g_o, x_hc_o, w_o, y_h_o, d_g_o, cu_e_o, ic_e_perceived_o, price_e_o, cu_g_o,
ic_g_perceived_o,
g_o, k_e_o, d_e_o, price_g_o, profit_e_o, profit_g_o, y_e_o, y_g_o, va_e_o, va_g_o]
times = np.linspace(t0, tfinal, (tfinal / it))
out = odeint(goodwinhandy_fix_inv_ratio, yini, times)
#######################
# OUTPUT FOR DIFFERENT VARIABLES###############
#######################
labor_productivity = out[:, 0]
wealth = out[:, 1]
# real_output = out[,4]
k_g = out[:, 2] # total capital
population = out[:, 3]
w = out[:, 4]
nature = out[:, 5]
d_g = out[:, 6]
cu_e = out[:, 7]
ic_e_perceived = out[:, 8]
# CU_goods = CU_goods_max + CU_goods_scalingFactor/(CU_extract-max(CU_extract_y))
p_e = out[:, 9]
cu_g = out[:, 10]
ic_g_perceived = out[:, 11]
g = out[:, 12]
k_e = out[:, 13]
d_e = out[:, 14]
p_g = out[:, 15]
profit_e = out[:, 16]
profit_g = out[:, 17]
y_e = out[:, 18]
y_g = out[:, 19]
va_e = out[:, 20]
va_g = out[:, 21]
nature_extraction = delta_k * nature * k_e * cu_e
x_e = nature_extraction
x_g = k_g * cu_g / v
y_tot = y_g + y_e
va_tot = va_g + va_e
capital = k_e + k_g
d_tot = d_g + d_e
debt_ratio = d_tot / va_tot
debt_ratio_g = d_g / va_g
debt_ratio_e = d_e / va_e
profit_tot = profit_g+profit_e
inv_e = inv_ratio_e * np.fmax(np.array([0] * int(tfinal/it)), np.array([inv_kappa0] * int(tfinal/it)) +
inv_kappa1 * profit_tot / va_tot) * va_tot
l_g = x_g / labor_productivity
73
labor_productivity_e = labor_productivity*p_g/p_e
l_e = x_e / labor_productivity_e
l_tot = l_g + l_e
employment_rate = l_tot/population
wage_share_g = w * l_g / va_g
wage_share_e = w * l_e / va_e
wage_share = w * l_tot / va_tot
profit_share = profit_tot/va_tot
plot_dict = {
'population (person)': population,
'nature (nature)': nature,
'investment for extraction (goods)': inv_e,
'debts (money)': d_tot,
'debt ratio': debt_ratio,
'employment rate(%)': employment_rate*100,
'profit (money)': profit_tot,
'GDP (money per time)': va_tot,
'goods capital (goods)': k_g,
'extraction capital (goods)': k_e,
'wage share (%)': wage_share*100,
'profit share (%)': profit_share*100
}
plot_multi_separately(times=times, changing_v='p_ext = '+str(inv_ratio_e), plot_dict=plot_dict,
plot_path_prefix='.\LaisThesisCodeFinalv2_')
for try_inv_ratio_e in [0.08, 0.25, 0.5, 0.68]:
run_try_fix_inv_ratio(try_inv_ratio_e)
plt.close('all')
if __name__ == "__main__":
write_params('.\params_final.csv')
write_initials(f_params_path='.\params_final.csv',
f_initials_path='.\initials_final.csv')
goodwin_handy_king(0, 400, 0.1)
74
References
AKARCA, A. T. & LONG, T. V. 1980. On the relationship between energy and GNP: a
reexamination. The Journal of Energy and Development, 326-331.
AYRES, R. U. & WARR, B. 2005. Accounting for growth: the role of physical work.
Structural Change and Economic Dynamics, 16, 181-209.
BOVARI, E., GIRAUD, G. & MC ISAAC, F. 2018. Coping With Collapse: A Stock-Flow
Consistent Monetary Macrodynamics of Global Warming. Ecological Economics,
147, 383-398.
COBB, C. W. & DOUGLAS, P. H. 1928. A theory of production. The American Economic
Review, 18, 139-165.
EDEN, S. & HWANG, B.-K. 1984. The relationship between energy and GNP: further
results. Energy economics, 6, 186-190.
EDEN, S. & JIN, J. C. 1992. Cointegration tests of energy consumption, income, and
employment. Resources and Energy, 14, 259-266.
EIA, U. 2017. Annual energy review. Energy Information Administration.
EIA, U. 2017. International energy outlook. Energy information administration (EIA).
ENGLE, R. F. & GRANGER, C. W. 1987. Co-integration and error correction:
representation, estimation, and testing. Econometrica: journal of the Econometric
Society, 251-276.
GODLEY, W. and LAVOIE, M., 2016. Monetary economics: an integrated approach to
credit, money, income, production and wealth.
GOODWIN, R. M. 1967. A growth cycle model. Socialism, Capitalism, and Economic
Growth, Cambridge University Press, Cambridge.
HARSHIT, J. 2017. Macroscale Modeling Linking Energy and Debt: A Missing Linkage.
The University of Texas at Austin.
HUMPHREY, T. M. 1997. Algebraic production functions and their uses before Cobb-
Douglas.
KEEN, S. 1995. Finance and economic breakdown: modeling Minsky’s “financial
instability hypothesis”. Journal of Post Keynesian Economics, 17, 607-635.
KEEN, S. 2013. A monetary Minsky model of the Great Moderation and the Great
Recession. Journal of Economic Behavior & Organization, 86, 221-235.
KEYNES, J. M. 2016. General theory of employment, interest and money, Atlantic
Publishers & Dist.
KRAFT, J. & KRAFT, A. 1978. On the relationship between energy and GNP. The Journal
of Energy and Development, 401-403.
75
LAVOIE, M. 2012. Perspectives for post-Keynesian economics. Review of Political
Economy, 24, 321-335.
LEONTIEF, W. W. 1951. The structure of American economy, 1919-1939: an empirical
application of equilibrium analysis.
LOTKA, A. J. 1925. Elements of Physical Biology, by Alfred J. Lotka.
MEADOWS, D. H., MEADOWS, D. L., RANDERS, J. & BEHRENS, W. W. 1972. The
limits to growth. New York, 102, 27.
MISHRA, S. 2007. A brief history of production functions.
MOTESHARREI, S., RIVAS, J. & KALNAY, E. 2014. Human and nature dynamics
(HANDY): Modeling inequality and use of resources in the collapse or
sustainability of societies. Ecological Economics, 101, 90-102.
ROSER, M. 2017. The short history of global living conditions and why it matters that we
know it. Published online at OurWorldInData. org.
SAMUELSON, P. A. 1939. Interactions between the multiplier analysis and the principle
of acceleration. The Review of Economics and Statistics, 21, 75-78.
SMIL, V. 1994. Energy in world history.
STERMAN, J. D. 2000. Business dynamics: systems thinking and modeling for a complex
world.
STERN, D. I. 2000. A multivariate cointegration analysis of the role of energy in the US
macroeconomy. Energy economics, 22, 267-283.
VON NEUMANN, J. uber ein okonomsiches Gleichungssystem und eine
Verallgemeinering des Browerschen Fixpunktsatzes. Erge. Math. Kolloq., 1937.
73-83.