System Dynamics Basics
The Wikipedia defines system dynamics as “an approach to understanding the nonlinear behavior of complex systems over time using stocks, flows, internal feedback loops, table functions and time delays”, and “a methodology and mathematical modeling technique to frame, understand, and discuss complex issues and problems” .[21] That’s correct, but it also assumes a fair bit of prior knowledge about how to build dynamic models. I prefer to strip this back to its basics, and describe system dynamics as a method to build systems of ordinary differential equations using a graphical user interface.
An Ordinary Differential Equation (ODEs) describes the rate of change of some variable as a function of itself and/or other variables. The fundamental variable in an ODE is time. In this sense, differential equations are calculus applied to processes in time, which is the essence of dynamics.[22]
A simple Differential Equation is the statement that the rate of change of a variable is a constant— for example, if you’re walking at the speed of 2 metres per second, then the rate of change of your location is 2 metres per second. If we call your location “x”, then this equation is:
To model this in a system dynamics program, you first have to convert this into an integral equation . This is because when most system dynamics programs simulate a model, they do so numerically, and integration is a much more stable numerical process than differentiation. This is because differentiation gives you the slope of a curve, which can change very radically, while integration gives you the area beneath a curve, which changes more slowly than its slope.[23]
Expressed as an integral equation, this is:

>
Figure 84: A simple differential equation in Minsky

An Ordinary Differential Equation is the statement that the rate of change of a variable is a function of its value. Population growth (and radioactive decay) is the simplest such model. A fish population (with an effectively unlimited food supply) can be modelled as having a constant annual rate of d growth per year. The percentage rate of growth of a variable is its rate of change divided by F its current level , so the statement that “F grows at a% per year” is in mathematical form: T% F dt d F

As an ODE, this is:
Expressed as an integral equation, this is:

Figure 85: A simple population growth model

At a growth rate of 10% per annum, the number of fish doubles every 7 years—illustrating the so called “Rule of 70”: a growth rate of x% per year means that the population will double every years.[24] After 21 years, the population has risen 8-fold. 70/T
This, in a nutshell, is why there must be dynamic systems : though hypothetically a given population can rise exponentially, in practice it can’t, because the world—even the Universe—isn’t infinite (Murphy 2021).[25] Something else must limit this process—whether that’s the exhaustion of the falsely assumed infinite supply of fish food, or the existence of a predator that eats the fish.
Here entereth our first true system dynamics model, the “predator-prey” model of a pair of interacting species, which keep limits on the numbers of both species. As I explain in Manifesto (Keen 2021, pp. 76-78), it was initially developed by the Italians Lotka and Volterra in the early 1900s—long before the technology of system dynamics was developed by Forrester in the 1950s.
I’ll use this example to illustrate many of Minsky ’s user interface features.
6.1 Predator-Prey model
Lotka’s predator-prey model (Lotka 1920) was the first mathematical model to demonstrate the hallmarks of complexity: nonlinear interactions in a system leading to sustained non-equilibrium 24 The rule simply derives from the fact that the natural logarithm of 2 is roughly 0.7. Exponential growth as shown in Figure 82 means that the population in year T will be the initial population times . If this is twice the initial population, then you have the formula 0 0 . Cancel the initial conditions and take Af×T l (2) logs and you get . Therefore T—the year by which the population doubles—is , where 2 × F = F × Af×T =70%. So if you divide 70% by the growth rate in %, you get how long a growth process takes to LS(2) = f× T f double the population. In this example with , the doubling period is 7years. 25 LS(2) ≈0.7 Tom Murphy’s excellent (free and online) book Energy and Human Ambitions on a Finite Planet: Assessing and Adapting to Planetary Limits makes the case that if human energy consumption grows at 2.3% per annum f= 10% (which is roughly our current growth rate, and which leads to energy usage increasing by a factor of ten every century), then waste heat necessarily generated on the surface of the planet, according to the Laws of Thermodynamics and without any consideration of the factors causing global warming, will be sufficient to drive the average temperature of the planet’s surface to the boiling point of water—100°C—in just 400 years (Murphy 2021, p. 12).
behavior. Its foundations are extremely simple: two population models, a prey species with an assumed limitless supply of food, as in the previous section, coupled to a predator population whose survival depends on the availability of prey.
We can start from the equation for population growth—or rather population change. I’ll stick with Fish for the prey species and introduce Sharks as the predator species S (for Sharks).[26] Then we start from the same percentage change logic, where Fish numbers grow exponentially at the rate per year, and Shark numbers fall at the rate per year (I’m reserving and for the interaction terms). The “hat” notation is a mathematician’s shorthand for 1 ∙ d : T% c% L S F� 1 d d dt

Expanding this out into differential equation form gives us:

In integral equation form, this is:

This is precisely how Minsky models it in Figure 83, where the equation (11) can be seen by reading Minsky ’s symbols from right to left:
Figure 86: Predator and Prey without interaction

The model in Figure 83 also demonstrates one of Minsky ’s shortcuts: to negate a number, simply feed it into the bottom port of a minus operator . With no input to the top port, Minsky interprets this as . Now we need to include the interaction between the species: predation by sharks reducing fish (0 −c) = −c
Now we need to include the interaction between the species: predation by sharks reducing fish numbers, and increasing shark numbers. Lotka made the simplest possible assumption, that sharks reduce the growth rate of fish by a constant, and decrease the death rate of sharks by another constant. This is most easily shown using the hat notation used in equation (9):

In integral form, this is

This can be put into Minsky by adding the widgets shown in grey in Figure 84, and the characteristic cycles of the predator-prey model emerge.
Figure 87: Predator and Prey with interaction

I was actually lucky here: I simply used “suck it and see” values for the parameters and initial conditions, and they worked out OK: the ranges for the numbers of fish and sharks were reasonable. But if you do the same, you may well get “crazy” cycles, because the combination of your initial values and your parameters may have numbers of both species cycling wildly. This is because, in one of the neatest illustrations of how complex systems behave, the equilibrium value for the number of fish depends on the parameters for sharks, and the equilibrium for the number of sharks depends on the parameter for fish.
This is easiest to see by setting the equations in (12) to zero—since this shows you the point at which the rates of change of the number of fish and the number of sharks are both zero:


Figure 85 adds the equilibrium calculations with the greyed widgets, as well as a phase diagram showing the repeating cycles over time, the equilibrium here (the other equilibrium—which is unstable—zero sharks and zero fish), and the initial values on the phase plot.
Figure 88: Predator and Prey with phase diagram and equilibria

I was lucky that my choice for the initial number of fish and sharks—1000 and 10 respectively— weren’t too far from the equilibrium values for fish and sharks—1667 and 33.3 respectively—given the values I used for the parameters. But if you give initial conditions that differ substantially from the equilibrium determined by the parameters, you will get wild cycles where each species “almost disappears” before spiking up dramatically and then collapsing once more—as illustrated by Figure 86.
Your best bet, when designing a model, is to either (a) check the equilibrium conditions of your model, and choose initial conditions that aren’t too far removed from (one of) the equilibria; (b) if you’re working from data for the initial conditions, choose parameter values that generate equilibria that aren’t radically different; or (c) if you’re working on a large-scale empirically based model, follow the parameter estimation techniques outlined in Chapter 11.
Figure 89: The same model with badly chosen initial conditions

The final things needed to reproduce the figure in Manifesto is to replace the androgynous parameters with more meaningful labels, and to put in the plot with the two Y-axes. We can do the T, L, c, S former quickly using the right-mouse button menu item “Rename all instances”—see Figure 87.

Figure 88 shows the final model including two plots with 2 y-axes—one showing the numbers of Sharks and Fish, and the other showing the rates of change of the two populations. This is partly to
show off Minsky ’s rate of change operator —which, unlike similar operators in most other system dynamics programs, actually performs a symbolic differentiation rather than a numerical one—and partly to make the point that, no matter how often you “first/second/third difference” these variables, they will always be out of phase. This is despite the complete lack of time lags in this model: the instantaneous value of ( the rate of change of ) Fish depends on the instantaneous value of Sharks, but in a nonlinear way. So no matter how often they are “differenced”, they will remain “not cointegrated” in the jargon of econometrics.
Figure 91: The final model with rates of change shown as well

6.2 Organizing a model
This model is essentially very simple, but with the layout I’ve used, it won’t fit completely on a computer monitor running at 1920x1080 pixels—see Figure 89.
Figure 92: The model in Figure 88 on a 1920x1080 resolution monitor

This can be simply fixed by clicking on the “fit to window” magnifying glass—the last one of the four on the control panel bar. But with a large model, that will reduce the variables, parameters etc., to an illegible size. So, you need to organize the model.
There are two ways to do this, and one of them—the standard method used by all other system dynamics programs—I recommend that you don’t use, yet. This is grouping.
6.2.1 Grouping—coming soon
The reason I don’t recommend using grouping, yet, is that in the early days of developing Minsky , we consulted a professional interface designer and he made the novel recommendation of making our groups transparent : at a preset level of magnification, the contents of a group become visible, and you can edit the group while still working at the scale of the overall model. It was a clever idea, but it generated issues concerning scaling when a miniaturized group was ungrouped. We have resolved these issues, but these problems meant that, with our limited development funding, we have had to delay implementing other features, including whether a group’s contents are local to the group, or globally accessible. We will complete these details after version 3.0 is released.
Given the absence of effective grouping, we developed a workaround that works as well, and exploits Minsky’s uniquely huge 100,000x100,000 pixel design space: Bookmarks .
6.2.2 Bookmarks
Bookmarks are a top-level menu item in Minsky . When you click on a bookmark on the Bookmark menu, the screen is shifted so that the bookmark’s XY coordinate become the upper left corner of the canvas. If you bookmark critical elements of your model—its plots, its control parameters, the more flowchart equations, etc.—then you can easily navigate and develop a huge model in Minsky .
There are three ways to insert a bookmark:
- Insert a Note using the widget on the toolbar;
- Choose “Bookmark this position…” under the Bookmark main menu item; and
- Type the Note shortcut of the % sign (this changes to the # symbol in version 3.0) on the canvas.
In the current release of Minsky (2.35.0), these methods work somewhat inconsistently, and the best one to use is the first. We’ll make them consistent in Minsky 3.0, with a Javascript front end, which will be released in August 2022.
The first method is to bring up the “Note” dialog box—see Figure 90. If you don’t click the Bookmark? Box, this command will insert a text string at the cursor, where the string will be whatever you type to replace the “Enter your note here”. This can be quite extensive—paragraphs of text rather than just lines—and some LaTeX formatting is supported, so you can have Greek letters, superscripts and subscripts in what you type. If you type anything in the “Short Description” window, that will appear as a tool tip when the mouse hovers over the Note on the canvas.
Figure 93: The Note Widget

However, if you click the “Bookmark?” box, then the note functions as a bookmark as well: the text you type in “Enter your note here” still appears on the canvas, the Short description still appears as a tool tip; and as well , the location of the Note on screen is recorded as a Bookmark, with the Short Description turning up on the Bookmarks menu.
To navigate to the Bookmark, simply click on it on the Bookmarks menu. The screen view of the canvas will then be reset so that the Note occupies the top-left-hand-corner of the screen.
In Figure 91, I have inserted several bookmarks; in Figure 92, I have chosen the “Equilibrium Calculations” bookmark from the Bookmarks menu, and the screen has been reset so that that Note is in the upper left-hand corner of the screen.
Figure 94: The model with several bookmarks inserted.


Figure 95: The view of the canvas when you click on the "Equilibrium Calculations" Bookmark

Once a Bookmark is defined, you can move it, and the elements of the model you use it to bookmark, by selecting them and then moving or cut-and-pasting them to a new location. In Figure
93, I have moved the bookmark “Plots” and the plots themselves to a new location on the canvas. Clicking on the bookmark “Plots” from the Bookmark menu will relocate the visible canvas so that the word “Plots” is in the top left hand position.
Figure 96: Figure 92 with the Bookmark "Plots" and the model elements associated with it moved to a new location

6.2.3 Using intermediate variables
Another way to group components of a model in Minsky is to use intermediate variables, which can then be deployed anywhere else on the model. For example, we can reduce the two equations for Fish and Sharks to the simple form of:

This can be done by defining the positive component of the original equations as “Births” and the negative as “Deaths”—see Figure 94. This approach doesn’t do much to reduce the complexity of this model, since it is quite simple already, but it is very helpful in much more complicated models.
Figure 97: The Fish-Sharks model with simplified system equations

6.3 Documenting a model
Future versions of Minsky, starting with the first Javascript version that we’ll release in early 2022, will have a “Publication” Tab, where selected elements of a model can be placed to create an explanation of the model. This will include text notes, Godley Tables, Plots, selections of flowchart elements, etc.
The current version, which is the final version to be released with a Tcl/Tk frontend, lets you export the various Tabs in a range of formats, with the most useful—in terms of producing documentation of a model—being the vector graphic format SVG (“Scalable Vector Graphic”). Most writing and presentation programs accept this format, and these graphics files can be inserted into them easily. Figure 95 and Figure 96 show exports of the Parameters and Plots Tabs respectively.
Figure 98: The Parameters Tab of this model, exported as an SVG file

Figure 99: The Plots Tab of the model exported as an SVG file

As (pardon me!) noted above, Notes have some capacity for text formatting that makes them useful to document a model as well—though they can take up a fair bit of screen real estate as a result. The Publication Tab will ultimately enable in-situ documentation of a model without taking up canvas space, but at the moment, the Notes widget is the best we can offer.
That said, it has some flexibility since it partially supports the LATEX document formatting language that is also used by Minsky to enable the equations of a model to be exported and then imported
into word processor equation editors (including MathType, which I’ve used in this book). The next quote shows the text typed into a Note, and Figure 97 shows how this appears on screen.
Notes can contain
more than one line of text,
and the text can contain elements formatted using the L_A^TE_X
formatting language too, including _{subscripts} and ^{superscripts},
Greek letters like \lambda, and so on.
You have to get a bit creative with using spaces and
carriage returns to lay text out, but overall it's more flexible than the text documentation features of our rivals, so hey...
With additional funding, we'll make this a decent little \LaTeX formatter one day.
Figure 100: How Note formats the text in the quote above.

6.3.1 The Equations, Parameters, Variables, Plots and Godleys Tabs
As you develop a model, these additional Tabs to the “Wiring” tab where you design the model are auto-populated. They are not editable themselves in this version of Minsky—except for the Godleys and Plots Tabs, where you can relocate each Godley Table and Plot as you wish on the Tab—but they will be in future versions. You can also control which Plots appear on the Plots Tab, using the rightclick menu on each plot on the design canvas.
In terms of designing a model, probably the most useful Tab is for Equations. This transforms the flowchart and Godley Table elements of a model into the actual differential equations that are used to simulate it. This gives you a second way to check whether the model actually expresses what you want to express—if a model doesn’t work as it should, you might find you’ve forgotten a minus sign, or used a multiplication symbol rather than a division, etc.—these things happen. You can often work this out by reading just the flowcharts and Godley Tables on the Wiring Tab, but sometimes the different—but entirely consistent—view provided by the Equations Tab can help you identify problems in a model more rapidly.
6.4 Exporting and importing a model
Minsky’s files use the structured-text language XML. Here, for example, are the first few lines of the actual MKY file for the predator-prey model developed in this section:
<Minsky xmlns="http://minsky.sf.net/minsky">
<schemaVersion>3</schemaVersion>
<minskyVersion>2.35.0</minskyVersion>
<wires>
<Wire>
261
6 2
</Wire>
<Wire> 262 17 20 </Wire> <Wire> 263 28 24 </Wire>
This file format makes it relatively easy for Minsky to interface with other file formats, and we currently support exporting to SVG, PDF, Postscript, PNG, EMF, LaTeX and Matlab—see Figure 98. This feature is accessed through the “Export Canvas” option on the File menu, and what is exported is based upon the Tab which you currently have open (except for the last two formats, LaTeX and Matlab, which are independent of the Tab you have open).
Figure 101: The choices in the Export Canvas menu

We also support importing models from one of the two market leaders in the System Dynamics marketplace, Vensim; this is an option on the File menu. Because the layout philosophy of Vensim is so different to Minsky ’s, there are often SNAFUs in how an imported model is laid out, and some models will fail to import at all. We will repair these over time—and the more people who use this feature and report bugs back to us, the better.
That’s enough on the interface: now to the crucial issue of why would you want to use Minsky rather than the more conventional modelling tools—spreadsheets, Eviews, etc.—that economists currently use. It’s all about time, and economists, as a rule, handle time very badly.
6.5 A Keen Rant : How not to handle time
The vast majority of economic models, whether Neoclassical (Sargent and Stachurski 2020b, 2020a) or Post Keynesian (Godley and Lavoie 2007b), use what economists term “periods”. A recent example is the debate in Post Keynesian macroeconomics between Claudio Sardoni (Sardoni 2019) and Marc Lavoie and Gennaro Zezza (Lavoie and Zezza 2020), where both sides advocate what they term a “sequential” approach, in preference to “equilibrium” analysis. Sardoni states, quite correctly, that
sequential analysis represents a clearer conceptual framework to cope with processes that occur in time. The analysis of the multiplier effects of investment is one of the cases in which the occurring of events in time should not be ignored. (Sardoni 2019, p. 243)
But he also comments, immediately before this, and also quite correctly , that:
Keynes may have been right to underline the difficulties of sequential analysis and, in particular, the difficulty to provide a precise definition of the length of periods. (Sardoni 2019, p. 243)
The resolution to this paradox is itself paradoxical: there is no “period ”. There are instead, economic processes which, at a “micro” level, are discrete acts—each individual act of consumption, investment, borrowing, etc. Each of them takes a different amount of time to complete, and each recurs at a different frequency: no one individual act of consumption is timed precisely with others, nor each act of investment: they are asynchronous . All these individual “periods”, when viewed from the perspective of an aggregate economic system, overlap, and a macro-level period cannot be defined.
While it would be feasible to model these as discrete processes in a multi-agent model,[27] at the level of aggregate macroeconomic modelling, asynchronous microeconomic processes are best treated as happening in what mathematicians call “continuous” time, as opposed to “discrete” time. This in turn means that the proper mathematical technology for dynamic economic modelling is not the “difference equation”, but the “differential equation”.
Therefore, equations like the “discrete-time” Equation (17), from the seminal Godley and Lavoie paper “Fiscal policy in a stock-flow consistent (SFC) model” (Godley and Lavoie 2007a, p. 84, Equation 19), which defines government debt as a difference equation:
should instead be written as a differential equation in “continuous time”:
While “sequential analysis” is indeed preferable to equilibrium analysis, continuous time modelling is preferable to both. There are, of course, rejoinders to this, which I have heard many, many times from my Post Keynesian colleagues (especially from Marc Lavoie: we are good friends, and, when our schedules and geography permit, tennis rivals/buddies, as well as intellectual collaborators).
The commonest defense of “sequential analysis” is that economic data is periodic, and therefore economic models should use equivalent periods. This is a fallacy, as stated bluntly by the father of System Dynamics, the engineer Jay Forrester, when he first reported on his study of economic models to his Faculty Seminar at MIT in 1956:
The incremental time intervals for which the variables of a model are solved stepby-step in time must be much shorter than often supposed… This solution interval is unrelated to the interval at which national statistics and economic indicators are measured… (Forrester 2003, pp. 337-345)
Forrester backgrounded this didactic statement in his textbook Industrial Dynamics :
A discontinuous model, which is evaluated at infrequent intervals, such as an economic model solved for a new set of values annually, should never be justified by the fact that data in the real system have been collected at such infrequent intervals. The model should represent the continuously interacting forces in the system being studied. The frequency with which measurements on the real system may happen to have been taken is not relevant to the frequency with which internal dynamic performance must be calculated. (Forrester 2013, p. 65)
Another frequently made rejoinder is that economic decisions, such as investment, are based on lagged data, rather than current data, and therefore period analysis is needed to capture these lags. For example, Godley & Lavoie 2007 assume:
that governments react to lagged inflation rates, rather than to actual or expected inflation rates, on the realistic grounds that fiscal policy may have a reaction time somewhat longer than monetary policy. (Godley and Lavoie 2007a, p. 92)
Therefore, they use the two equations shown in Equation (19) to represent “real pure government expenditures” g , and the “growth rate of real pure government expenditures”, grG , where the rate of growth of government expenditure is a function of “the growth rate of potential output” gr , the change in the lagged inflation rate −1 , and the deviation of the lagged inflation rate from the target inflation rate : Δπ πT g = g − 1 ⋅( 1 + grG )

In fact, lags are easily represented in differential equations, using what is known as a “first-order time lag”, to relate the delayed perception of the rate of inflation to the actual, instantaneous rate of inflation . I’ll use rather than −1 for the time-lagged inflation rate, since a time lag can be any length, not merely “one period”. The time-lagged inflation rate is defined by its rate of L π π π convergence to the actual inflation rate, which is given by the “time constant” (which, in an elaborate model, can be a variable if desired) which measures the length of time, in years, that it π takes for the perceived rate of inflation to converge to the actual rate of inflation τ . If = 0.5 , this is a 6-month lag; if = 1 , a year, and so on. This rate of convergence is given by the differential L π π π τ equation shown in Equation (20): π τ

Similarly, the growth rate of government expenditure is expressed as a differential equation:
dt G The variable growth rate g can now defined as something like Equation (22), or it could be replaced with its own differential equation. G
This approach is vastly superior to the discrete approach to time lags (which is more correctly called a time-delay , rather than a time-lag), for many reasons.
Time-lags are flexible. Your lag can be a fraction of a year, or multiple years, or even an irrational number if you wish: it doesn’t have to be 1,2, 3 “time periods”, as in conventional economic modeling. And of course, I’m being generous in saying that! Economic models use a time delay of “1 period” for almost everything. In Lavoie and Godley 2007, interest payments have a lag of -1 (equation 1); spending is negatively related to the interest rate with a lag of -1 (equation 2); taxes on wealth are lagged -1 (equation 7). This is typical. Factors which in the real world occur at vastly different frequencies—consumption, for example, has a much higher frequency than investment— are all corralled into the same arbitrary frequency.
Therefore, the time-delays (not time-lags) in discrete time economic models—which is to say, the majority of economic models—are spurious. They have nothing to do with the actual characteristics of time-dependent actions in the real economy. Time lags, on the other hand, can be derived from empirical data. They are also easy to edit: a time lag is a simple scalar, and if you find that you’re using the wrong value—say, data shows that the time lag in investment is actually 1.5 years when
your model uses 3 years—then all you have to alter is that number. On the other hand, if discretetime economic models did time delays properly, they would have different delays for consumption (short) versus investment (long). This simply isn’t done. If it were, and then empirical data indicated that the delay was different to what the model used, a wholesale re-writing of the model is necessary.
The final objection made to using continuous time is, how then do we derive the values for parameters in such models, and test them, when the economic data we have is in discrete time format (quarterly or yearly)? This is in fact a valid issue, since it does take care to do this properly. A common method is to interpolate intermediate (continuous-time) data points from yearly, quarterly or monthly data using cubic-spline interpolation. This procedure derives a set of third order polynomials that join each pair of points in a series, producing a smooth series that approximates what would have been found by statisticians as the sum of the underlying asynchronous processes, if they had used a higher sampling rate. The model can then be fitted to the interpolated time series.[28]
The bottom line is, stop using difference equations for economic models ! They are simply the wrong technology for the macro modelling of asynchronous micro processes in general, let alone economics in particular. Difference equations are really only appropriate for macro-level modelling when the micro-level processes that generate it are synchronized. This is the case for, for example, the birth dynamics of Christmas Island Red Crabs. These crabs give birth on the same day, coordinated by the full moon, so that the sheer number born on that day overwhelms predators, and enables the survival of the species (Adamczewska and Morris 2001). So, if you’re modelling the life cycle of Christmas Island Red Crabs, go right ahead and use difference equations. But if you’re modelling anything else…, then don’t use them .
Given how inappropriate difference-equation models are for modelling the economy, and yet how much they are used by economists, Minsky deliberately does not support timedelays: “ friends don’t let friends use periods ” . We may need to introduce time-delays at some point, to enable the importing of models from other system dynamics programs, but if so, they will exist solely for that purpose.
6.6 Mathematics and Minsky
One of the reasons that economists have used difference equations is because they’re easy to write down: anyone can define a simple equation in terms of time differences, and it can easily be modelled with conventional software like a spreadsheet. You need specialist software (including mathematics programs like R and Matlab , in addition to system dynamics programs like Minsky ) to simulate differential equations, and it is also much harder to think in terms of differential equations initially. For this reason, I recommend undertaking some study of differential equations, even though you can use Minsky without that training.
If you do study them, do a course given by mathematicians rather than economists, and make sure the tuition extends to third order nonlinear differential equations (or at least their qualitative features compared to 2nd order equations), since, as I explain in Manifesto, 3-dimensional models are the foundation of complex systems modelling: as Li and Yorke put it, “Period Three Implies Chaos” (Li and Yorke 1975). Alternately, get a good textbook: my favourite, because it is so well written, and because it covers stability analysis, qualitative analysis, and the basics of the linear algebra needed for differential equations as well, is Braun’s Ordinary Differential Equations and their Applications (Braun 1993).
6.7 Integrals versus differentials
Since system dynamics programs simulate systems that change over time, differential equations are fundamental to them. However, differentiation (working out the slope of a curve) is a much more volatile operation than integration (working out the area under a curve): the slope of a curve can vary dramatically over a short interval, but the area beneath it will change less dramatically. Approximating the slope of a curve numerically can result in large errors, so for this reason (and a few others), system dynamics programs work with integration rather than differentiation.
Therefore, if you start with a differential equation for population growth, like Equation (23):
Where births and deaths are proportional to the existing population:

Then, in a system dynamics program, you would express Equation (23) in integral form by integrating both sides:

In Minsky , this looks like Figure 99:
Figure 102: A simple equation for population, with the parameters being varied during the simulation

6.8 A first model, done two ways
Now let’s build a first serious model using Minsky : Goodwin’s growth cycle model (Goodwin 1967). Normally, a system dynamics model is designed by considering causal relationships between elements of a model, and then connecting them all into a causal loop. We’ll do that in a moment,
and also follow up with a second method, of deriving the model directly from macroeconomic definitions. This is to emphasize the point I made in Manifesto that Goodwin’s model—and my extension of it to model Minsky’s Financial Instability Hypothesis (Keen 1995, 2020b)—are foundational models for a modern, complex systems approach to macroeconomics.
Figure 100 shows the opening paragraphs of Goodwin’s paper, where he sets out the assumptions underlying his model (Goodwin 1967, p. 54). I’ll follow this structure in deriving the model in a system dynamics way, though Goodwin’s own derivation was closer to the second approach we’ll use later. I should note that I found Goodwin’s explanation of his model interesting but inscrutable when I first read it, and only properly understood the model—and its potential—when I read Blatt’s masterful exposition of it in Dynamic economic systems: a post-Keynesian approach (Blatt 1983). If you’re reading this book with serious intent—in that you plan to become proficient at system dynamics modelling in economics—then I strongly suggest that you buy a copy of Blatt’s recently republished masterpiece.[29]
Figure 103: Goodwin's statement of the assumptions from which his model is derived

Working from Goodwin’s exposition here—and using slightly different notation—his first two assumptions are constant exogenous growth of the output to labour ratio and of population . Using for the rate of growth of the output to labour ratio and for the rate of growth of T N population, that gives us these two equations: α β
>

In Minsky, these equations are entered as shown in Figure 101:
Figure 104: Exogenous growth rates of technology and population in Minsky

Goodwin’s assumption 6 gives us a constant ratio between capital K and output Y, while assumption 5 means that the level of gross investment equals profits Π , which in this simple twov class (workers and capitalists) model equals output minus wages . Goodwin neglected to include G I depreciation of capital, so I include that as well, defining net investment to be equal to gross investment minus depreciation, which is a constant Y times K: W I IG K δK

These equations can be used to commence building the model, as shown in Figure 102.
Figure 105: Partial Goodwin model, from the definition of profit to the determination of employment

- Reading from left to right in Figure 102: • Output minus Wages determines profit: Π ; • all profit is invested: ) ; Y W (Y−W→Π) G
- (Π →I
- net investment is gross investment minus depreciation : ;
- • net investment, integrated and added to the initial level of capital stock 0 , is the current G K G K
- I I δ ∙K (I −δ ∙K→I)
- capital stock: 0� ; K
- • Capital stock divided by the capital output ratio is output: ; and �K
- �∫I→K+ K
- • Output divided by the output to labour ratio is Labour: v �Y v →Y� .
- This leaves just his assumption 7: “a real wage that rises somewhere in the neighbourhood of full T a →L�
This leaves just his assumption 7: “a real wage that rises somewhere in the neighbourhood of full employment” (Goodwin 1967, p. 54). I’ll use for the employment rate, but I’ll relate this to the L total population N, and not just the proportion of the total population that is employable, which is λ= N what Goodwin and Blatt used.[30] In generic mathematical notation, the Phillips Curve relationship is as stated two equivalent ways in Equation (28):

We’ve already built a linear version of this, in Figure 80 and Equation (3). So all we need to do is add the equation defining as ⁄ , and then to define as : λ LN L W w∙L

This adds the terms in white in the causal diagram part of Figure 103.
Figure 106: The completed model, with the original terms in grey and the new ones in white__31

- Reading right to left in this section—since I have “flipped” the model components to close the causal loop:[32] • Labour divided by population determines the employment rate ; • The employment rate fed into the “Phillips Curve” function determines the rate of change of L N λ
- wages ; d
- • Multiplied by the current wage, integrated and added to the initial wage 0 , this determines dt w
- the wage rate ;
- • From this point on, it’s what one of my undergraduate maths lecturers described as “money w w
- for old rope”:
• for old rope”: o The wage rate times determines W; o Subtract from , and the causal loop is closed. L With this completed, we can now see the dynamics of the Goodwin model. A few plots inserted and W Y wired up to Y, and generate Figure 104. ω λ
31 Notice the strange wiring at the bottom left, where the wire crosses over the w ? That’s a bug: the rotation of the integral block didn’t update where the output wire emanated from. It’s a good example of the sort of debugging that is needed to make a computer program work well. We’ve since fixed it (see Figure 104). Repairing errors like this, as well as adding new features, is a major reason why continued funding is needed to develop Minsky .
develop Minsky . 32 This wasn’t necessary—I could have designed the whole model left to right, and terminated it with another instance of —but that resulted in a model whose elements were too small to read on an A4 wide page. W
Figure 107: Goodwin model with plots

There are many interesting features to this model that we’ll explore later, but I want to address a criticism that I’ve frequently heard of this model, that it is in some way contrived or “ad hoc”. In fact, as I noted in Manifesto , this model—and my “Minskian” extension of it to include private debt—can be derived directly from incontrovertible macroeconomic definitions. For this reason, I regard these two models as not “ad hoc”, but as foundational models for a complex systems approach to macroeconomics. I’ll explain why here as I redo the derivation of the model directly from macroeconomic definitions.
In English, the definitions behind the Goodwin model are:

Using the symbols we’ve already employed in building the flowchart version of Goodwin’s model, these are:

I’ll derive the dynamic model using the differentiation shortcuts that I noted in Manifesto :
- The percentage rate of change of a variable, say , (expressed as a ratio rather than 1
- percentage) is ; T
- dx 1
- • The notation mathematicians use for this expression is x dt dx
- • The percentage rate of change of a ratio is equal to the percentage rate of change of the T�≡ x dt
- numerator, minus the percentage rate of change of the denominator, so that ; �X �
- and �= X�−Y�Y
- • The percentage rate of change of a product is the sum of the percentage rates of change of the two parts of the product so that .
- Putting the definitions in (31) into percentage rate of change format, and using the differentiation X∙Y�= X�+ Y�
Putting the definitions in (31) into percentage rate of change format, and using the differentiation shortcuts, yields:

In words, Equation (32) is saying that:
- The employment rate will rise if the workforce grows faster than population; and
- The wages share of GDP will rise if total wages rise faster than GDP.
At the moment, these are still true-by-definition statements. To get from here to a model, we need to introduce one more definition—the output to labour ratio ⁄ —and the assumption of a uniform wage rate . This lets us make the following substitutions: T≡YL w Y



And for : ω

As did Goodwin, we’ll assume a constant rate of technological growth and a constant rate of population growth. This lets us make the substitutions:

Our almost completed model is now:

-
- ω = w −α
- Now we need to expand and . To do this, we need two more of Goodwin’s simplifying assumptions: Y� w�
- • A constant capital to output ratio (which I discuss further in Chapter 10 on page 195 et K
- seq. ); and v= Y
- An investment function (with depreciation, which Goodwin omitted). Goodwin assumed that all profits were invested.
- Because is assumed to be a constant, the percentage rate of change of is identical to the percentage rate of change of : v Y
- K K

= K Therefore, once we work out , we can substitute this for , otherwise known as the rate of economic growth. We also insert Goodwin’s assumption that all profits are invested, so that = Π . K� Y� G I

K v That leaves just the rate of change of wages , which is the “Phillips Curve”. Using the same linear function as in Figure 80 give us: w�
Substituting (39) and (40) into (37) yields the reduced-form version of Goodwin’s model:

Expressed in differential equation form, this is:

This model, using the same parameter values as the previous model (plus initial conditions similar to the initial values for and ) yields the same dynamics as Figure 104: λ ω
Figure 108: The Goodwin model in reduced form

This is a foundational model for macroeconomics, firstly, because it can be derived directly from incontestable macroeconomic definitions and a set of reasonable simplifying assumptions, and secondly, because the simplifying assumptions themselves suggest ways in which the model can be generalized and extended.
The assumption that all profits are invested, for example, is defensible as a first-order approximation (in the Taylor series sense) in that investment is ultimately a function of profit; but the obvious extension is that capitalists invest more than profits during a boom, and less than profits during a slump.[33] This generates a “finance … demand for money”, the omission of which from The General Theory (Keynes 1936) Keynes later realized was a significant error:
Investment finance in this sense is, of course, only a special case of the finance required by any productive process; but since it is subject to special fluctuations of its own, I should (I now think) have done well to have emphasised it when I analysed the various sources of the demand for money . It may be regarded as lying half-way, so to speak, between the active and the inactive balances. If investment is proceeding at a steady rate, the finance (or the commitments to finance) required can be supplied from a revolving fund of a more or less constant amount, one entrepreneur having his finance replenished for the purpose of a projected investment as another exhausts his on paying for his completed investment. But if decisions to invest are (e.g.) increasing, the extra finance involved will constitute an additional demand for money . (Keynes 1937, p. 247. Emphasis added)
In an “endogenous money” world in which bank loans create money, this adds to aggregate demand and income when the change in debt is positive, and subtracts from it when it is negative (Keen 2020b). As I explain in Chapter 9.2 on page 185, replacing “capitalist invest all their profits” with this more realistic assumption is how I started the development of my model of Minsky’s Financial Instability Hypothesis (Keen 1995).
There are therefore at least two methods to go about designing dynamic, complex-systems models of the economy: the conventional flowchart method, and deriving a model from definitions using calculus. Both approaches have their strengths: the flowchart method is easier, while the definitional approach gives you some insights into how a model might be extended—by, for another example, replacing the single-commodity definitions of and with multiple commodities and input-output dynamics. The closed form solution is also more appropriate for stability analysis. Personally, I find K Y myself using the two approaches symbiotically as I build models.
But there’s one thing I could never model properly with flowcharts: the dynamics of the monetary system. My first successful attempts to model monetary dynamics used systems of equations in the mathematics program Mathcad , with a matrix keeping track of relationships between accounts (Chapman and Keen 2006). But this only generated “static” plots of the models, when I wanted to also show the system changing through time, as I could do with the system dynamics program Vissim . However, every time I tried to put one of my models into Vissim , I’d make a mistake—by changing one equation (say for debt) but not a related one (for money), or putting the wrong sign in one equation, and so on. In 2008, I realized that I could generate the equations directly from the matrix (which I originally did in the program Mathcad). This became the inspiration for creating Godley Tables, and funding from INET in 2012 finally turned that into reality.
I’ve learnt a lot about money from building Minsky , and extending the capabilities of its Godley Tables—so much so that I now know that some of what I wrote about money in Debunking Economics (Keen 2011a) was wrong. I will start work on a 3rd (and final!) edition after completing this book. And now to Minsky’s raison d’etre , Godley Tables.
Footnotes
21 https://en.wikipedia.org/wiki/System_dynamics
22 Partial Differential Equations (PDEs) add a second fundamental variable of location—space. The formal mathematics of PDEs is much more complicated than that of ODEs, which itself is far more complicated than the mathematics of differentiation. PDEs are essential for modelling processes that intimately combine movement with time—such as fluid dynamics. In other areas where space matters, but the convolution of time and space is not so intimate (or the spatial dimension is much more granular than a fluid), the convention is to treat processes as if they occur at a point, by having time as the only fundamental variable. Then to take space into account, you introduce multiple points which interact with each other over time. In economics, these points can be different economies, different regions within one economy, etc.
23 Minsky has symbolic modelling capabilities which don’t have the same problem, but we follow the system dynamics convention in using integral rather than differential equations. This may change, if we ever secure sufficient development funding.
26 I’m showing my Australian roots here: most European models use Rabbits and Foxes.
27 I briefly discuss multi-agent modelling in (Keen 2021, p. 149).
28 - - The blog post https://timodenk.com/blog/cubic spline interpolation/ gives a nice outline of the procedure, for which there are normally built-in routines in programs like R, Matlab, Mathematica, etc. At some point, funding permitting, we will add interpolation features to Minsky .
29 https://www.taylorfrancis.com/books/dynamic-economic-systems-john-blatt/e/10.4324/9781315496290
30 This approach yields a value of for stable wages of roughly 0.60 , versus the value of about 0.96 that Blatt used, which arose from treating as one minus the unemployment rate . Blatt’s approach results in the “no-wage-change” value for λ being 0.96. If you use a linear function as an approximation of the Phillips Curve—which is what Goodwin did—then the model generated dynamics that give returns silly results like the λ (1 −E) employment rate exceeding 100%. This doesn’t happen as easily if the stable wages value of λ is 0.60 . λ
33 Other factors, such as a desired level of capacity utilization, can be added. Matheus Grasselli and colleagues are working on fitting my Minsky extension of Goodwin to US data, and preliminary results indicate that the rate of investment should be modelled as depending upon the wages share of GDP (which includes the profit share and hence the profit rate as an argument), the employment rate (which can be shown to be a proxy for capacity utilization) and loans and deposit ratios of corporations.