Last Updated June 6, 2026
Stocks, flows, and accumulation are the structural foundation of systems modeling because they explain how systems remember the past, carry pressure forward, and generate behavior over time. A stock is an accumulated quantity. A flow is a rate that increases, decreases, transfers, replenishes, depletes, or transforms that stock. Accumulation is the process through which past inflows and outflows become present system conditions.
Without stocks and flows, systems analysis often collapses into event thinking. Analysts see a shortage, a backlog, a debt burden, a pollution level, a trust crisis, a capacity failure, or an ecological collapse and treat it as a current problem. Stock-flow modeling asks a deeper question: what accumulated over time to produce the current condition, and which flows must change for the condition to change?
This distinction is central to system dynamics, public policy modeling, environmental modeling, infrastructure planning, health systems modeling, organizational analysis, energy systems, climate risk, supply chains, and resilience research. Many complex problems are not caused by a single event. They are caused by accumulations that become visible only after they have crossed a threshold.
Stocks and flows also discipline interpretation. They force modelers to distinguish levels from rates, conditions from changes, symptoms from accumulations, and temporary relief from structural correction. A system may improve its flow temporarily while the stock continues to worsen. A backlog may keep rising even after processing capacity improves. Atmospheric carbon may continue accumulating even after emissions growth slows. Infrastructure condition may keep degrading even after maintenance budgets increase if repair flows remain below wear flows.

This article explains stocks, flows, and accumulation as a foundational concept in systems modeling. It covers stock-flow structure, rates of change, dimensional consistency, conservation, accumulation logic, feedback through stocks, delays, nonlinear flows, queues, backlogs, reservoirs, aging chains, co-flows, environmental stocks, infrastructure condition, public policy implications, mathematical foundations, professional workflows, R and Python examples, responsible use, common pitfalls, and authoritative references.
Why Stocks and Flows Matter
Stocks and flows matter because many system behaviors are produced by accumulation rather than by immediate cause and effect. A stock preserves the influence of past flows. This gives systems memory. It explains why current conditions may reflect long histories of growth, depletion, neglect, investment, exposure, learning, degradation, or recovery.
In system dynamics, stocks and flows are among the basic structural elements used to connect feedback with behavior over time. MIT OpenCourseWare’s Introduction to System Dynamics materials explicitly include mapping stock-flow structures and linking feedback with the dynamics of stocks and flows as core course topics. :contentReference[oaicite:1]{index=1}
The practical consequence is simple but powerful: changing a flow does not instantly change a stock. A bathtub continues filling if the inflow remains larger than the outflow. A debt stock continues rising if new borrowing and interest exceed repayment. A pollution stock continues increasing if emissions exceed removal. A backlog continues growing if arrivals exceed completions. A trust stock continues eroding if failures exceed repair.
| Observed problem | Underlying stock | Relevant flows | Modeling question |
|---|---|---|---|
| Service delays | Backlog | New cases, completed cases | Are arrivals exceeding processing capacity? |
| Climate warming | Atmospheric greenhouse gases | Emissions, removals, natural absorption | Are net additions still increasing the stock? |
| Infrastructure failures | Asset condition | Maintenance, renewal, wear, shocks | Is repair flow below degradation flow? |
| Debt burden | Outstanding debt | Borrowing, interest, repayment | Does repayment exceed new accumulation? |
| Institutional mistrust | Trust | Reliable performance, accountability, failure, betrayal | Are trust-building flows stronger than trust-eroding flows? |
| Resource depletion | Resource stock | Regeneration, extraction, waste | Does extraction exceed regeneration? |
Stocks and flows therefore help systems modelers identify why visible symptoms persist even after interventions begin.
What Is a Stock?
A stock is a quantity that exists at a point in time because of past accumulation. It is a level, state, reservoir, inventory, population, condition, capacity, balance, burden, or memory. Stocks are measured in units such as people, dollars, tons, cases, hectares, vehicles, megawatt-hours, kilometers of pipe, percentage condition, units of trust, or number of trained workers.
Stocks do not change by themselves. They change because flows add to them or subtract from them. This is what makes stock-flow modeling disciplined. A modeler cannot simply say that backlog decreases, trust rises, debt falls, or infrastructure improves. The model must specify the flows that produce those changes.
Stocks are also important because they often change slowly. They may accumulate silently before becoming visible. Soil degradation, carbon accumulation, institutional distrust, debt burdens, deferred maintenance, knowledge loss, and ecosystem stress can build for years before reaching crisis conditions.
| Stock type | Example | Why it matters |
|---|---|---|
| Material stock | Water reservoir, inventory, fuel supply | Defines available quantity for use or survival. |
| Population stock | People, animals, infections, workers | Tracks demographic, epidemiological, or workforce state. |
| Financial stock | Debt, savings, capital, reserves | Preserves past borrowing, investment, or surplus. |
| Environmental stock | Carbon, groundwater, biomass, pollutant load | Captures accumulated environmental pressure or capacity. |
| Infrastructure stock | Road condition, bridge condition, grid assets | Represents accumulated maintenance, wear, and renewal. |
| Social stock | Trust, legitimacy, knowledge, morale | Tracks slowly accumulated institutional and cultural conditions. |
| Operational stock | Backlog, queue, unfinished work, open tickets | Determines delay, workload, and service performance. |
A stock is not always physical. It can be conceptual or institutional if it accumulates over time and affects future behavior. The modeler’s task is to define the stock clearly enough that its flows, units, boundary, and interpretation can be examined.
What Is a Flow?
A flow is a rate of change that increases, decreases, transfers, converts, or redistributes a stock. Flows are measured per unit time: people per year, dollars per month, tons per day, cases per week, repairs per quarter, emissions per year, failures per day, or units shipped per hour.
Flows are not the same as stocks. A stock is how much exists. A flow is how fast it is changing. Confusing these two is one of the most common errors in public reasoning and model interpretation. A high flow can be temporary. A large stock may persist long after the flow changes. A reduced inflow may still leave the stock increasing if the inflow remains greater than the outflow.
| Flow type | What it does | Example |
|---|---|---|
| Inflow | Adds to a stock. | Births increase population; new cases increase backlog. |
| Outflow | Subtracts from a stock. | Deaths reduce population; completed cases reduce backlog. |
| Transfer flow | Moves material or state from one stock to another. | Susceptible people become infected; raw material becomes finished goods. |
| Conversion flow | Transforms one category into another. | Trainees become certified workers; leads become customers. |
| Regeneration flow | Restores or replenishes a stock. | Groundwater recharge, forest regrowth, trust rebuilding. |
| Degradation flow | Reduces quality or capacity. | Wear, erosion, corrosion, fatigue, knowledge decay. |
Flows are often governed by other variables. A completion rate may depend on staff capacity. A failure rate may depend on asset condition. A regeneration rate may depend on remaining ecosystem health. A trust-building rate may depend on institutional performance. This is where stocks and flows become connected to feedback loops.
What Is Accumulation?
Accumulation is the process through which flows change stocks over time. It is the mathematical and conceptual bridge between past activity and present condition. A stock at time \(t\) is the result of its initial value plus all inflows and minus all outflows over the relevant time period.
Accumulation is why many systems show momentum. A stock does not instantly reset when conditions improve. A city with decades of deferred maintenance does not recover from one funding increase. A lake with accumulated nutrients does not become healthy the moment new pollution slows. A hospital backlog does not disappear when new arrivals fall if prior cases remain unresolved. A trust deficit does not vanish after one credible action.
| Accumulation pattern | Description | Example |
|---|---|---|
| Growth | Inflows exceed outflows over time. | Population growth, debt accumulation, backlog increase. |
| Decline | Outflows exceed inflows over time. | Resource depletion, inventory drawdown, trust erosion. |
| Equilibrium | Inflows and outflows balance. | Stable reservoir level, steady workforce, constant inventory. |
| Overshoot | Stock grows beyond sustainable level before correction occurs. | Resource use exceeds carrying capacity. |
| Recovery | Restorative flows exceed degradation flows. | Infrastructure renewal, ecosystem restoration, backlog reduction. |
| Lock-in | Accumulated stock reinforces continuation of a path. | Installed infrastructure, debt obligations, institutional routines. |
Accumulation is often the hidden reason why policy response feels slow. Even when flows improve, the accumulated stock may remain far from the desired condition.
The Stock-Flow Distinction
The stock-flow distinction is one of the most important forms of discipline in systems modeling. Stocks are levels. Flows are rates. A stock is measured at a moment. A flow is measured over an interval. Stocks persist. Flows act. Stocks reveal accumulated condition. Flows reveal the speed and direction of change.
Many flawed interpretations come from confusing these categories. Emissions are a flow; atmospheric concentration is a stock. Hiring is a flow; workforce is a stock. New claims are a flow; case backlog is a stock. Maintenance spending is a flow; infrastructure condition is a stock. Learning activities are flows; organizational capability is a stock.
| Question | Stock answer | Flow answer |
|---|---|---|
| How much exists? | Inventory level, population, accumulated debt, backlog. | Not a flow question. |
| How fast is it changing? | Not a stock question. | Sales per month, births per year, repairs per week. |
| Why is the condition still bad? | The accumulated stock remains high or low. | Current flows may not yet be large enough to reverse it. |
| Why did the condition change? | The stock changed because net flow changed. | Inflows and outflows shifted in magnitude or timing. |
| What should policy target? | The stock that represents the problem. | The flows that can change the stock. |
Good systems modeling keeps stock and flow language precise because imprecise language often leads to bad intervention design.
Units, Dimensions, and Model Discipline
Stock-flow modeling requires dimensional consistency. A stock and its flows must use compatible units. If a stock is measured in cases, its inflow and outflow must be measured in cases per unit time. If a stock is measured in tons, its flows must be tons per unit time. This discipline is not cosmetic. It prevents conceptual mistakes from becoming hidden inside equations.
Dimensional consistency helps modelers identify errors. A model should not add a rate directly to a level without multiplying by a time step. It should not compare dollars to people, tons to percentages, or cases to probabilities without a meaningful conversion. It should not treat a ratio as a physical quantity unless the interpretation is clear.
| Model element | Example unit | Correct relationship |
|---|---|---|
| Stock | Cases | Backlog contains cases. |
| Inflow | Cases per week | New cases add to backlog over time. |
| Outflow | Cases per week | Completed cases remove from backlog over time. |
| Time step | Weeks | Flow multiplied by time step changes the stock. |
| Parameter | Fraction per week | Decay or completion fraction converts stock into a flow. |
| Auxiliary variable | Dimension depends on formula | Must be interpretable and unit-consistent. |
Dimensional checking is one of the simplest ways to improve model credibility. It forces vague causal claims into accountable quantitative structure.
Boundaries, Conservation, and Accounting
Stock-flow models require boundary judgment. A stock changes only through flows that cross the model boundary or transfer between stocks inside the model. This means modelers must define what is inside the system, what is outside it, and which flows are measured.
Conservation matters when material, population, or financial quantities are transferred. If people move from susceptible to infected, they should leave one stock and enter another. If raw material becomes finished goods, it should move between stocks. If money transfers from one account to another, total accounting should remain coherent unless there is creation, destruction, loss, or external flow.
Not every system is physically conserved. Trust, attention, legitimacy, and knowledge are not conserved in the same way as water or inventory. But even non-material stocks require careful accounting. A model should still specify how they are built, depleted, reinforced, forgotten, repaired, or transformed.
| Boundary issue | Modeling risk | Better practice |
|---|---|---|
| Hidden inflow | The stock changes for unexplained reasons. | Identify all major sources entering the stock. |
| Hidden outflow | Loss, decay, or transfer is ignored. | Represent depletion, leakage, attrition, or completion. |
| Boundary leakage | Costs or harms are shifted outside the model. | Document externalized effects and spillovers. |
| Double counting | The same quantity appears in multiple stocks. | Use clear transfer logic and accounting identities. |
| False conservation | Non-material stocks are treated like physical reservoirs. | Use appropriate generation and decay assumptions. |
| Missing time horizon | Accumulation appears harmless over a short period. | Simulate long enough for stock effects to appear. |
Boundary choices are not merely technical. They determine which accumulations become visible and which remain outside the model’s concern.
Stock-Flow Structures in System Dynamics
System dynamics uses stock-flow structures to connect feedback, accumulation, and behavior over time. The MIT Sloan System Dynamics group describes the field as modeling relationships among system parts and how those relationships influence behavior over time. :contentReference[oaicite:2]{index=2} Stock-flow diagrams operationalize this idea by showing how levels change through rates.
A basic stock-flow diagram contains stocks, inflows, outflows, auxiliaries, parameters, connectors, and feedback relationships. Stocks are usually shown as boxes. Flows are shown as pipes or valves. Auxiliaries calculate rates or intermediate values. Connectors show information influence, not physical transfer.
| Stock-flow element | Role | Example |
|---|---|---|
| Stock | Accumulated quantity. | Inventory, population, backlog, carbon stock. |
| Inflow | Adds to stock. | Production, births, emissions, new cases. |
| Outflow | Subtracts from stock. | Sales, deaths, removals, completed cases. |
| Auxiliary | Computes intermediate relationship. | Demand gap, utilization, service pressure. |
| Parameter | Fixed or scenario-varying value. | Completion rate, decay fraction, capacity. |
| Connector | Information influence on a variable. | Backlog affects hiring rate. |
| Feedback loop | Recursive influence through stock and flow. | Backlog raises hiring, hiring raises capacity, capacity reduces backlog. |
Stock-flow models are useful because they prevent feedback loops from remaining purely verbal. They force recursive claims to pass through concrete accumulations and rates of change.
Feedback Through Stocks
Feedback often operates through stocks. A stock influences a flow, and that flow changes the stock. This recursive relationship can generate growth, stabilization, oscillation, overshoot, collapse, or recovery.
For example, a backlog may increase pressure to hire staff. Hiring increases service capacity. Service capacity increases completion flow. Completion flow reduces backlog. This is a balancing feedback loop operating through a stock. But if backlog also increases staff burnout, burnout reduces capacity, and reduced capacity increases backlog, then the same system contains a reinforcing degradation loop.
| Stock | Flow influenced by stock | Feedback effect | Possible behavior |
|---|---|---|---|
| Population | Births | More population can generate more births. | Reinforcing growth. |
| Inventory | Production orders | Low inventory increases production. | Balancing adjustment. |
| Backlog | Hiring or completion effort | High backlog increases corrective action. | Stabilization or oscillation. |
| Trust | Compliance and cooperation | High trust improves cooperation, which may build more trust. | Reinforcing legitimacy. |
| Infrastructure condition | Failure rate | Poor condition increases failures, which increase repair burden. | Degradation spiral. |
| Resource stock | Extraction or regeneration | Low resource stock may reduce regeneration or extraction yield. | Collapse or recovery threshold. |
Feedback through stocks is one of the main reasons systems behave dynamically. The stock is not just a result. It becomes part of the cause of future results.
Delays and Accumulated Pressure
Delays make stock-flow systems harder to manage because corrective flows often respond after a stock has already accumulated pressure. A service system may hire new staff only after backlog has grown. A city may repair assets only after condition has deteriorated. A climate policy may respond after atmospheric accumulation has already shifted long-term risk. A public-health system may expand capacity after disease transmission has increased.
Delays can cause overshoot and oscillation. If decision-makers respond to an outdated stock level, they may overcorrect or undercorrect. If material implementation takes time, the system may continue accumulating before relief arrives. If perception lags reality, intervention may be politically late even if technically sound.
| Delay | Stock affected | Resulting risk | Modeling response |
|---|---|---|---|
| Information delay | Backlog, disease burden, infrastructure condition | Decision-makers see the problem late. | Represent observed stock separately from actual stock. |
| Implementation delay | Capacity, repairs, policy effects | Corrective flows arrive after further accumulation. | Use lagged response or pipeline stocks. |
| Material delay | Inventory, construction, maintenance | Supply arrives after demand changes. | Model order pipelines and delivery delays. |
| Ecological delay | Pollutants, biomass, soil, groundwater | Damage appears after intervention window narrows. | Use long time horizons and precautionary thresholds. |
| Learning delay | Knowledge, trust, institutional capacity | Correction is slow because capability accumulates slowly. | Model learning and forgetting flows explicitly. |
Delays connect directly to Delay, Oscillation, and Policy Resistance. Accumulation explains why delayed systems often surprise decision-makers.
Nonlinear Flows, Thresholds, and Capacity Limits
Flows are often nonlinear. A flow may increase slowly at first and then accelerate. It may saturate near a capacity limit. It may collapse when a stock falls below a threshold. It may become less effective as congestion grows. It may increase sharply when pressure crosses a trigger.
Nonlinear flows are especially important in ecological, infrastructure, health, climate, financial, and organizational systems. A resource may regenerate only if enough remains. A repair system may work well until overload creates coordination failure. A queue may grow slowly until utilization approaches capacity, then delays increase rapidly. A trust stock may erode gradually and then collapse after repeated failures.
| Nonlinear flow pattern | Mechanism | Example |
|---|---|---|
| Saturation | Flow approaches a maximum capacity. | Service completions limited by staff hours. |
| Threshold | Flow changes sharply after a critical point. | Infrastructure failures accelerate below condition threshold. |
| Regeneration limit | Recovery depends on remaining stock. | Fish population growth depends on viable breeding population. |
| Congestion effect | Higher stock reduces effective flow. | Large backlog slows completion due to complexity and coordination costs. |
| Learning curve | Flow improves as experience accumulates. | Production rate increases as knowledge stock grows. |
| Burnout effect | Excess pressure reduces future capacity. | Workload increases attrition and reduces completion flow. |
Linear flows are sometimes useful approximations. But when systems approach limits, thresholds, or overload, nonlinear flow assumptions are often essential.
Queues, Backlogs, and Service Systems
Queues and backlogs are among the clearest examples of stock-flow logic. A backlog is a stock of unfinished work. New demand adds to it. Completion removes from it. If demand exceeds completion capacity, the backlog grows. If completion exceeds demand, the backlog declines. If demand and completion balance, the backlog stabilizes.
Backlogs are important because they affect delay, workload, quality, morale, customer satisfaction, institutional legitimacy, and system resilience. A small backlog may be manageable. A large backlog may generate reinforcing failure: more backlog creates more pressure, pressure creates errors, errors create rework, rework reduces effective completion, and lower completion increases backlog.
| Service-system stock | Inflow | Outflow | Feedback risk |
|---|---|---|---|
| Case backlog | New cases | Resolved cases | Backlog increases delay and complexity. |
| Customer queue | Arrivals | Service completions | Long waits cause abandonment or escalation. |
| Maintenance backlog | New defects | Completed repairs | Unrepaired defects create more failures. |
| Technical debt | Shortcuts and unresolved issues | Refactoring and cleanup | Debt reduces future development capacity. |
| Hiring pipeline | Applicants entering process | Completed hires | Slow hiring worsens capacity shortages. |
Queue and backlog models are useful because they reveal the difference between temporary overload and structural imbalance. A backlog is not solved by effort alone if the underlying inflow remains greater than sustainable outflow.
Resource Depletion and Regeneration
Resource systems are stock-flow systems. Forest biomass, groundwater, soil fertility, fish populations, mineral reserves, and ecological habitat all change through inflows and outflows. Regeneration adds to the stock. Extraction, consumption, damage, or mortality subtract from it.
The critical modeling question is whether the resource stock can regenerate fast enough to keep pace with extraction and disturbance. If extraction exceeds regeneration for long enough, the stock declines. If the stock falls below a threshold, regeneration itself may weaken. At that point, recovery becomes slower, harder, or impossible within the modeled time horizon.
| Resource stock | Regenerative inflow | Depleting outflow | Threshold risk |
|---|---|---|---|
| Fish population | Reproduction and recruitment | Harvest and mortality | Low breeding population reduces future recruitment. |
| Groundwater | Recharge | Pumping and evaporation | Aquifer depletion can cause long recovery times. |
| Forest biomass | Growth and succession | Logging, fire, disease | Fragmentation can reduce regrowth capacity. |
| Soil fertility | Organic matter formation | Erosion, nutrient mining | Degraded soil may lose productive capacity. |
| Pollution assimilative capacity | Natural processing and dilution | Pollutant loading | System may shift into degraded regime. |
Resource stock-flow models are essential for sustainability because they show that reducing the rate of depletion is not the same as restoring the stock.
Infrastructure Condition and Maintenance Backlogs
Infrastructure systems depend on accumulated condition. Roads, bridges, pipes, power lines, substations, buildings, tracks, drainage systems, and digital infrastructure all degrade through use, age, weather, shocks, and deferred maintenance. Maintenance and renewal flows restore condition. Wear and damage flows reduce it.
Infrastructure failure is often an accumulation problem disguised as an event. A bridge closure, water-main break, grid outage, or transit failure may appear sudden, but the underlying stock of asset condition may have been declining for years. Deferred maintenance creates a stock of unresolved work. That backlog can increase future failures, emergency repair costs, service disruption, and public distrust.
| Infrastructure stock | Improving flow | Degrading flow | System behavior |
|---|---|---|---|
| Asset condition | Maintenance and renewal | Wear, shocks, corrosion, fatigue | Condition improves or degrades over time. |
| Maintenance backlog | New defects | Completed repairs | Backlog rises if repair capacity is insufficient. |
| Service capacity | Upgrades and restoration | Failures and overload | Capacity changes with investment and degradation. |
| Public trust | Reliable service and communication | Failure, delay, opacity | Legitimacy accumulates or erodes. |
| Emergency repair burden | Failures needing urgent repair | Completed emergency work | Emergency work crowds out preventive maintenance. |
Infrastructure stock-flow modeling helps distinguish preventive maintenance from reactive repair. The timing of flows matters because early maintenance may prevent nonlinear degradation later.
Information, Social, and Institutional Stocks
Not all important stocks are physical. Systems also contain accumulated knowledge, trust, legitimacy, attention, morale, social capital, institutional memory, technical debt, organizational capability, and political will. These stocks are harder to measure, but they often shape system behavior profoundly.
Social and institutional stocks are built and depleted through repeated experience. Trust grows through reliable performance, transparency, accountability, and fairness. It erodes through failure, corruption, exclusion, opacity, and betrayal. Organizational knowledge grows through learning, documentation, practice, and retention. It erodes through turnover, neglect, fragmentation, and forgetting.
| Non-material stock | Building flow | Depleting flow | Modeling caution |
|---|---|---|---|
| Trust | Reliability, fairness, accountability | Failure, betrayal, opacity | Measurement is context-dependent and value-laden. |
| Institutional memory | Documentation, learning, continuity | Turnover, neglect, fragmentation | Knowledge may be unevenly distributed. |
| Morale | Support, progress, recognition | Burnout, overload, disrespect | Aggregate morale can hide subgroup strain. |
| Political will | Public support, leadership, visible progress | Fatigue, polarization, failure | Can shift suddenly after events. |
| Technical debt | Shortcuts and deferred quality work | Refactoring and maintenance | Often invisible until failure or slowdown appears. |
Modeling non-material stocks requires humility. These variables should not be treated as precise physical reservoirs unless the measurement and interpretation are carefully justified.
Aging Chains and Co-Flows
More advanced stock-flow models often use aging chains and co-flows. An aging chain divides a stock into stages so modelers can represent movement through categories over time. A co-flow tracks an attribute that moves with a stock, such as experience, cost, quality, contamination, age, emissions intensity, or knowledge.
Aging chains are useful for workforce models, disease models, infrastructure condition models, customer pipelines, housing stock, equipment fleets, and education systems. Co-flows are useful when the quantity of a stock is not enough; the model must also track quality or composition.
| Advanced structure | Purpose | Example |
|---|---|---|
| Aging chain | Represents progression through stages. | Trainees → junior staff → experienced staff → retirees. |
| Condition chain | Represents deterioration or improvement states. | Good roads → fair roads → poor roads → failed roads. |
| Pipeline stock | Represents delay between decision and completion. | Orders placed → orders in transit → inventory received. |
| Co-flow | Tracks quality or attribute moving with quantity. | Average workforce experience, pollution concentration, asset age. |
| Distributed delay | Represents variable timing rather than one fixed delay. | Hiring, permitting, construction, repair, training. |
These structures make stock-flow models more realistic, but they also increase data and validation demands. Model complexity should serve the modeling question rather than merely making the diagram more elaborate.
Why Accumulation Confuses Intuition
Accumulation confuses intuition because people often focus on current flows rather than accumulated stocks. They may assume that slowing a harmful inflow fixes the problem even if the stock continues rising. They may assume that increasing an improving flow produces immediate recovery even if the accumulated burden is large. They may underestimate how long reversal takes.
This is sometimes called stock-flow failure: the tendency to misunderstand how levels change when inflows and outflows differ. It appears in climate reasoning, debt reasoning, inventory reasoning, staffing reasoning, public-health reasoning, maintenance planning, and institutional reform.
| Intuitive mistake | Stock-flow reality | Example |
|---|---|---|
| “Emissions growth slowed, so atmospheric carbon should fall.” | The stock falls only if removals exceed emissions. | Lower growth in emissions may still increase concentration. |
| “We hired more staff, so backlog should disappear.” | Backlog falls only if completions exceed arrivals long enough. | Hiring may only slow backlog growth at first. |
| “Maintenance funding increased, so assets are fixed.” | Condition improves only if renewal exceeds degradation. | Deferred maintenance may require years of excess repair flow. |
| “Debt payments are being made, so debt is shrinking.” | Debt shrinks only if repayment exceeds interest and new borrowing. | Debt can rise despite payments. |
| “Trust-building has started, so trust should recover.” | Trust recovers only if positive experience exceeds continuing harm. | Repeated failures can keep eroding legitimacy. |
Stock-flow modeling helps correct these errors by making accumulation explicit.
Implications for Policy, Sustainability, and Governance
Stocks and flows have major implications for policy and governance. Many policies target flows while public outcomes depend on stocks. A policy may reduce new pollution but leave accumulated contamination. It may reduce new homelessness but leave an existing housing shortage. It may slow new debt while leaving a large debt stock. It may increase new training while the experienced workforce continues retiring.
Governance systems often fail when they measure flows but ignore stocks. Budgets track annual spending, but not accumulated maintenance need. Agencies count new programs, but not accumulated institutional capacity. Sustainability plans count yearly emissions reductions, but not cumulative atmospheric burden. Organizations count hiring, but not accumulated experience or burnout.
| Governance issue | Flow-focused view | Stock-flow view |
|---|---|---|
| Climate policy | Annual emissions reductions. | Cumulative greenhouse gas stock and net removal balance. |
| Infrastructure | Annual maintenance spending. | Asset condition, deferred maintenance, and renewal backlog. |
| Housing | New units built. | Housing stock, affordability gap, vacancies, displacement pressure. |
| Health systems | New appointments or staff hires. | Backlog, workforce capacity, burnout, care continuity. |
| Education | Annual enrollment. | Accumulated learning, completion, debt, institutional capacity. |
| Organizations | Quarterly output. | Knowledge stock, morale, technical debt, process quality. |
Policy that ignores accumulation may understate the time, effort, and flow imbalance required for real recovery.
Mathematical Lens: Stock-Flow Equations and Accumulation
The basic continuous-time stock-flow equation is:
\frac{dS}{dt}=I(t)-O(t)
\]
Interpretation: The rate of change of stock \(S\) equals inflow \(I(t)\) minus outflow \(O(t)\).
The corresponding discrete-time model is:
S_{t+1}=S_t+\Delta t\,[I_t-O_t]
\]
Interpretation: The next stock equals the current stock plus net flow over the time step \(\Delta t\).
A stock with proportional outflow can be written as:
\frac{dS}{dt}=I-kS
\]
Interpretation: The outflow is a fraction \(k\) of the stock. This appears in decay, completion, attrition, mortality, depreciation, and drainage models.
A capacity-limited flow can be written as:
O_t=\min(C, kS_t)
\]
Interpretation: The outflow depends on the stock but cannot exceed capacity \(C\).
A regenerative resource model can be written as:
S_{t+1}=S_t+rS_t\left(1-\frac{S_t}{K}\right)-H_t
\]
Interpretation: The resource stock grows through regeneration limited by carrying capacity \(K\), while harvest \(H_t\) subtracts from the stock.
A backlog model can be written as:
B_{t+1}=B_t+A_t-\min(C_t,B_t+A_t)
\]
Interpretation: Backlog \(B\) increases with arrivals \(A_t\) and decreases by completions constrained by available capacity \(C_t\).
A delayed corrective flow can be written as:
O_t=kS_{t-\tau}
\]
Interpretation: The outflow responds to a past stock level rather than the current stock level, which can produce oscillation or overshoot.
These equations show why stock-flow modeling is so powerful: it connects intuitive system concepts to explicit rules of accumulation.
The Stock-Flow Modeling Workflow
Professional stock-flow modeling requires more than drawing reservoirs and arrows. The workflow must define the system question, identify accumulations, specify flows, check units, represent feedback, test scenarios, and interpret results responsibly.
1. Define the Persistent Condition
Identify the accumulated condition that matters: backlog, debt, emissions stock, resource stock, trust, maintenance need, capacity, or degradation.
2. Name the Stock Clearly
Define what the stock contains, its unit, its boundary, its initial value, and what would count as a meaningful change.
3. Identify Inflows
List every major flow that adds to the stock, including external arrivals, growth, generation, degradation, or transfer from another stock.
4. Identify Outflows
List every major flow that removes from the stock, including completion, death, decay, repayment, repair, removal, consumption, or transfer.
5. Check Units and Time Step
Ensure stock units, flow units, time step, conversion factors, and parameters are dimensionally consistent.
6. Add Feedback Relationships
Determine whether the stock affects its own inflows or outflows through demand, pressure, capacity, regeneration, failure, learning, or response.
7. Represent Delays
Identify information, implementation, material, biological, institutional, and learning delays that separate stock conditions from flow responses.
8. Test Scenarios and Sensitivity
Compare baseline, policy, stress, capacity, delay, and threshold scenarios to see how accumulation changes over time.
9. Validate Behavior
Check whether model behavior is plausible, unit-consistent, bounded where appropriate, and aligned with historical or expert evidence.
10. Communicate Accumulation Clearly
Explain whether the stock is growing, shrinking, stabilizing, overshooting, recovering, or approaching a threshold, and why.
Strengths and Limitations
Stock-flow modeling strengthens systems analysis by making accumulation explicit. It helps distinguish levels from rates, symptoms from accumulated conditions, and short-term flow changes from long-term stock recovery. It also supports scenario testing, sensitivity analysis, threshold analysis, and policy comparison.
At the same time, stock-flow models have limits. They can oversimplify heterogeneous populations, spatial variation, institutional behavior, data uncertainty, and qualitative social dynamics. They can also create false precision when poorly measured stocks are treated as exact quantities. Responsible use requires clear definitions, evidence, uncertainty analysis, and boundary review.
| Strength | Why it matters | Limitation to watch |
|---|---|---|
| Clarifies accumulation | Shows why problems persist after flows change. | Stocks may be hard to measure directly. |
| Improves policy timing | Reveals delays and long recovery periods. | Time horizons may be chosen too narrowly. |
| Supports dimensional discipline | Forces unit-consistent reasoning. | Modelers may still use unjustified parameters. |
| Connects feedback to structure | Shows how stocks influence future flows. | Feedback relationships may be uncertain. |
| Supports scenario testing | Compares alternative flow changes over time. | Scenario design can bias interpretation. |
| Reveals thresholds | Identifies when stocks approach critical levels. | Thresholds may be unknown or contested. |
The value of stock-flow modeling is not that it predicts perfectly. It makes accumulation visible enough to reason about more responsibly.
R Workflow: Simulating Accumulation, Depletion, and Recovery
The R workflow below uses base R. It simulates three stock-flow systems: a backlog, a regenerative resource, and infrastructure condition. It exports trajectories and diagnostics for stock level, net flow, minimum value, maximum value, and recovery behavior.
# stock_flow_accumulation_diagnostics.R
# Base R workflow:
# simulating backlog accumulation, resource depletion, and infrastructure recovery.
#
# Suggested repository placement:
# articles/stocks-flows-and-accumulation/r/stock_flow_accumulation_diagnostics.R
args <- commandArgs(trailingOnly = FALSE)
file_arg <- grep("^--file=", args, value = TRUE) if (length(file_arg) > 0) {
script_path <- normalizePath(sub("^--file=", "", file_arg[1]), mustWork = TRUE)
article_root <- normalizePath(file.path(dirname(script_path), ".."), mustWork = TRUE)
} else {
article_root <- normalizePath(getwd(), mustWork = TRUE)
}
tables_dir <- file.path(article_root, "outputs", "tables")
figures_dir <- file.path(article_root, "outputs", "figures")
dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE)
dir.create(figures_dir, recursive = TRUE, showWarnings = FALSE)
n_steps <- 120
time <- seq_len(n_steps)
backlog <- numeric(n_steps)
resource <- numeric(n_steps)
condition <- numeric(n_steps)
backlog[1] <- 80
resource[1] <- 600
condition[1] <- 72
backlog_arrivals <- numeric(n_steps)
backlog_completions <- numeric(n_steps)
resource_regeneration <- numeric(n_steps)
resource_extraction <- numeric(n_steps)
condition_maintenance <- numeric(n_steps)
condition_wear <- numeric(n_steps)
for (t in 2:n_steps) {
backlog_arrivals[t] <- ifelse(t < 50, 18, 13)
backlog_completions[t] <- min(backlog[t - 1] + backlog_arrivals[t], 12 + 0.08 * backlog[t - 1])
backlog[t] <- max(0, backlog[t - 1] + backlog_arrivals[t] - backlog_completions[t])
resource_regeneration[t] <- 0.045 * resource[t - 1] * (1 - resource[t - 1] / 1000)
resource_extraction[t] <- ifelse(t < 70, 24, 12)
resource[t] <- max(0, resource[t - 1] + resource_regeneration[t] - resource_extraction[t])
condition_wear[t] <- 1.4 + 0.012 * max(0, 100 - condition[t - 1])
condition_maintenance[t] <- ifelse(t < 60, 0.9, 2.8)
condition[t] <- min(100, max(0, condition[t - 1] + condition_maintenance[t] - condition_wear[t]))
}
trajectory_df <- data.frame(
time = time,
backlog = backlog,
backlog_arrivals = backlog_arrivals,
backlog_completions = backlog_completions,
backlog_net_flow = backlog_arrivals - backlog_completions,
resource = resource,
resource_regeneration = resource_regeneration,
resource_extraction = resource_extraction,
resource_net_flow = resource_regeneration - resource_extraction,
infrastructure_condition = condition,
condition_maintenance = condition_maintenance,
condition_wear = condition_wear,
condition_net_flow = condition_maintenance - condition_wear
)
summary_df <- data.frame(
stock = c("backlog", "resource", "infrastructure_condition"),
initial_value = c(backlog[1], resource[1], condition[1]),
final_value = c(backlog[n_steps], resource[n_steps], condition[n_steps]),
minimum_value = c(min(backlog), min(resource), min(condition)),
maximum_value = c(max(backlog), max(resource), max(condition)),
mean_net_flow = c(
mean(trajectory_df$backlog_net_flow),
mean(trajectory_df$resource_net_flow),
mean(trajectory_df$condition_net_flow)
),
interpretation = c(
"service backlog accumulates when arrivals exceed completions",
"resource stock declines when extraction exceeds regeneration",
"infrastructure condition recovers only when maintenance exceeds wear"
)
)
write.csv(
trajectory_df,
file.path(tables_dir, "r_stock_flow_trajectories.csv"),
row.names = FALSE
)
write.csv(
summary_df,
file.path(tables_dir, "r_stock_flow_summary.csv"),
row.names = FALSE
)
png(file.path(figures_dir, "r_stock_flow_trajectories.png"), width = 1200, height = 700)
plot(
trajectory_df$time,
trajectory_df$backlog,
type = "l",
lwd = 2,
xlab = "Time",
ylab = "Stock Level",
main = "Stock-Flow Accumulation Across Three Systems"
)
lines(trajectory_df$time, trajectory_df$resource / 10, lwd = 2, lty = 2)
lines(trajectory_df$time, trajectory_df$infrastructure_condition, lwd = 2, lty = 3)
legend(
"topright",
legend = c("Backlog", "Resource / 10", "Infrastructure condition"),
lwd = 2,
lty = c(1, 2, 3),
bty = "n"
)
grid()
dev.off()
print(summary_df)
cat("R stock-flow accumulation diagnostics complete.\n")
This workflow shows why recovery depends on sustained net flow. A stock does not recover because an intervention begins; it recovers only when improving flows exceed worsening flows long enough to change the accumulated condition.
Python Workflow: Stock-Flow Scenario Diagnostics
The Python workflow below uses only the standard library. It simulates baseline and intervention scenarios for backlog, resource depletion, and infrastructure condition, then exports trajectory, summary, and validation tables.
#!/usr/bin/env python3
"""
Stocks, flows, and accumulation workflow.
Dependency-light workflow demonstrating:
1. Backlog accumulation
2. Resource depletion and regeneration
3. Infrastructure condition and maintenance
4. Scenario comparison
5. Net-flow diagnostics
6. Validation checks
All data are synthetic.
"""
from __future__ import annotations
from pathlib import Path
import csv
from statistics import mean
ARTICLE_ROOT = Path(__file__).resolve().parents[1]
TABLES = ARTICLE_ROOT / "outputs" / "tables"
def write_csv(path: Path, rows: list[dict[str, object]]) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
if not rows:
raise ValueError(f"No rows to write: {path}")
with path.open("w", newline="", encoding="utf-8") as handle:
writer = csv.DictWriter(handle, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
def simulate_scenario(scenario: str, steps: int = 120) -> list[dict[str, object]]:
backlog = 80.0
resource = 600.0
condition = 72.0
rows: list[dict[str, object]] = []
for time in range(1, steps + 1):
if scenario == "baseline":
backlog_arrivals = 18.0
resource_extraction = 24.0
maintenance = 0.9
elif scenario == "capacity_and_conservation":
backlog_arrivals = 16.0 if time < 50 else 13.0
resource_extraction = 22.0 if time < 70 else 12.0
maintenance = 1.2 if time < 60 else 2.8
elif scenario == "delayed_response":
backlog_arrivals = 18.0 if time < 75 else 13.0
resource_extraction = 24.0 if time < 85 else 12.0
maintenance = 0.9 if time < 85 else 2.8 else: raise ValueError(f"Unknown scenario: {scenario}") backlog_completion_capacity = 12.0 + 0.08 * backlog backlog_completions = min(backlog + backlog_arrivals, backlog_completion_capacity) backlog_net_flow = backlog_arrivals - backlog_completions backlog = max(0.0, backlog + backlog_net_flow) regeneration = 0.045 * resource * (1.0 - resource / 1000.0) resource_net_flow = regeneration - resource_extraction resource = max(0.0, resource + resource_net_flow) wear = 1.4 + 0.012 * max(0.0, 100.0 - condition) condition_net_flow = maintenance - wear condition = min(100.0, max(0.0, condition + condition_net_flow)) rows.append({ "scenario": scenario, "time": time, "backlog": round(backlog, 6), "backlog_arrivals": round(backlog_arrivals, 6), "backlog_completions": round(backlog_completions, 6), "backlog_net_flow": round(backlog_net_flow, 6), "resource": round(resource, 6), "resource_regeneration": round(regeneration, 6), "resource_extraction": round(resource_extraction, 6), "resource_net_flow": round(resource_net_flow, 6), "infrastructure_condition": round(condition, 6), "condition_maintenance": round(maintenance, 6), "condition_wear": round(wear, 6), "condition_net_flow": round(condition_net_flow, 6), }) return rows def summarize(rows: list[dict[str, object]]) -> list[dict[str, object]]:
summary_rows: list[dict[str, object]] = []
for scenario in sorted(set(str(row["scenario"]) for row in rows)):
subset = [row for row in rows if row["scenario"] == scenario]
for stock_name, column, net_flow_column in [
("backlog", "backlog", "backlog_net_flow"),
("resource", "resource", "resource_net_flow"),
("infrastructure_condition", "infrastructure_condition", "condition_net_flow"),
]:
values = [float(row[column]) for row in subset]
net_flows = [float(row[net_flow_column]) for row in subset]
summary_rows.append({
"scenario": scenario,
"stock": stock_name,
"initial_value": round(values[0], 6),
"final_value": round(values[-1], 6),
"minimum_value": round(min(values), 6),
"maximum_value": round(max(values), 6),
"mean_net_flow": round(mean(net_flows), 6),
"final_direction": (
"accumulating"
if net_flows[-1] > 0
else "depleting"
if net_flows[-1] < 0 else "balanced" ), }) return summary_rows def main() -> None:
all_rows: list[dict[str, object]] = []
for scenario in ["baseline", "capacity_and_conservation", "delayed_response"]:
all_rows.extend(simulate_scenario(scenario))
summary_rows = summarize(all_rows)
validation_rows: list[dict[str, object]] = []
for row in summary_rows:
for metric, low, high in [
("initial_value", 0.0, 1000000.0),
("final_value", 0.0, 1000000.0),
("minimum_value", 0.0, 1000000.0),
("maximum_value", 0.0, 1000000.0),
("mean_net_flow", -1000000.0, 1000000.0),
]:
value = float(row[metric])
validation_rows.append({
"scenario": row["scenario"],
"stock": row["stock"],
"metric": metric,
"value": round(value, 6),
"target_low": low,
"target_high": high,
"passed": low <= value <= high,
})
write_csv(TABLES / "python_stock_flow_trajectories.csv", all_rows)
write_csv(TABLES / "python_stock_flow_summary.csv", summary_rows)
write_csv(TABLES / "python_stock_flow_validation_checks.csv", validation_rows)
print("Stock-flow accumulation workflow complete.")
print(TABLES / "python_stock_flow_summary.csv")
if __name__ == "__main__":
main()
This workflow demonstrates the core logic of accumulation: intervention timing matters because the stock reflects the full history of net flows, not only current effort.
GitHub Repository
Complete Code Repository
Companion repository for the article, including stock-flow simulations, accumulation diagnostics, backlog models, resource depletion and regeneration workflows, infrastructure condition models, delay and capacity scenarios, validation checks, synthetic datasets, documentation assets, and multi-language examples for professional systems modeling.
Ethics and Responsible Use
Stock-flow models can make accumulated harm visible, but they can also hide responsibility if used carelessly. A model may describe accumulated poverty, pollution, mistrust, disease burden, debt, or infrastructure failure without identifying who created the flows, who benefits from them, who bears the burden, and who has authority to change them.
Responsible stock-flow modeling requires attention to distribution, power, boundary choices, data quality, and interpretation. Aggregated stocks may hide unequal exposure. A citywide backlog may hide neighborhood disparities. A national emissions stock may hide sectoral responsibility. A trust stock may hide differences across communities. A workforce stock may hide burnout concentrated in particular roles.
| Ethical issue | Risk | Responsible practice |
|---|---|---|
| Aggregate masking | A single stock hides unequal burden. | Disaggregate by place, group, sector, or exposure where relevant. |
| Boundary exclusion | Costs are shifted outside the model. | Document spillovers, externalities, and omitted stocks. |
| False neutrality | Stock definitions encode values without disclosure. | Explain why the stock matters and whose perspective it reflects. |
| Blame diffusion | Accumulation is treated as impersonal inevitability. | Identify flows, rules, incentives, and decisions producing the stock. |
| False precision | Uncertain social stocks are treated as exact quantities. | Use ranges, proxies, qualitative evidence, and caveats. |
| Transition burden | Changing flows creates costs for vulnerable groups. | Model transition impacts and support mechanisms. |
Stock-flow analysis should make accumulated consequences more accountable, not less.
Common Pitfalls
Stock-flow modeling can fail when modelers confuse stocks and flows, ignore units, omit important outflows, treat proxy variables as physical quantities, or interpret short-term flow changes as long-term stock recovery.
| Pitfall | Why it matters | Correction |
|---|---|---|
| Confusing stocks with flows | Leads to wrong intervention timing and interpretation. | Label each variable as a level, rate, auxiliary, or parameter. |
| Ignoring units | Creates mathematically invalid relationships. | Check dimensional consistency before simulation. |
| Omitting outflows | Stocks appear to grow or persist unrealistically. | Represent completion, decay, attrition, mortality, leakage, or removal. |
| Omitting inflows | Recovery appears easier than it is. | Represent continuing arrivals, damage, emissions, or demand. |
| Using short time horizons | Accumulation effects remain hidden. | Simulate long enough for stock dynamics to emerge. |
| Treating proxies as exact stocks | Social and institutional variables may be over-quantified. | Use proxies carefully and report uncertainty. |
| Ignoring nonlinear flows | Thresholds and capacity limits are missed. | Test saturation, overload, and regeneration limits. |
| Assuming intervention immediately changes the stock | Creates unrealistic expectations. | Explain the net-flow imbalance required for recovery. |
The central correction is simple: always ask what stock is accumulating, which flows change it, and whether net flow is large enough for the desired stock trajectory.
Conclusion
Stocks, flows, and accumulation are foundational to systems modeling because they explain how past activity becomes present condition and future constraint. Stocks preserve the history of flows. Flows change stocks. Accumulation creates memory, inertia, delay, pressure, resilience, fragility, and path dependence.
This is why stock-flow thinking is essential for complex systems. Many persistent problems are not caused by a single event. They are produced by accumulated imbalance: emissions exceeding removal, degradation exceeding repair, demand exceeding capacity, extraction exceeding regeneration, failures exceeding trust-building, or debt growth exceeding repayment.
Stock-flow modeling helps decision-makers understand why current conditions may continue worsening even after policy begins, why recovery can take longer than expected, why flows must be sustained over time, and why some interventions fail when they do not change the net accumulation process.
Used responsibly, stock-flow modeling turns vague concern about “systems” into disciplined reasoning about levels, rates, delays, boundaries, feedback, and recovery. It shows that the question is not only what is happening now, but what has been accumulating all along.
Related Articles
- What Is Systems Modeling?
- Systems Thinking vs Systems Modeling
- Why Complex Systems Require Models
- Core Principles of Systems Modeling
- System Dynamics Modeling
- Modeling Feedback Loops
- Leverage Points in Complex Systems
- Delay, Oscillation, and Policy Resistance
- Nonlinearity, Thresholds, and Regime Change
- Scenario Modeling and Simulation
- Sensitivity Analysis in Systems Models
- Stress Testing and Robustness Analysis
Further Reading
- MIT OpenCourseWare. Introduction to System Dynamics: Readings. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/pages/readings/.
- MIT OpenCourseWare. Introduction to System Dynamics: Syllabus. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/pages/syllabus/.
- MIT OpenCourseWare. Mapping the Stock and Flow Structure of Systems. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/resources/mit15_871f13_ass3/.
- MIT Sloan System Dynamics. About Us. Available at: https://mitsloan.mit.edu/faculty/academic-groups/system-dynamics/about-us.
- MIT OpenCourseWare. Systems Thinking and Modeling for a Complex World. Available at: https://ocw.mit.edu/courses/res-15-004-system-dynamics-systems-thinking-and-modeling-for-a-complex-world-january-iap-2020/.
- System Dynamics Society. System Dynamics Society. Available at: https://systemdynamics.org/.
- Meadows, D.H. (2008) Thinking in Systems: A Primer. White River Junction, VT: Chelsea Green.
- Sterman, J.D. (2000) Business Dynamics: Systems Thinking and Modeling for a Complex World. Boston: Irwin/McGraw-Hill.
- Forrester, J.W. (1961) Industrial Dynamics. Cambridge, MA: MIT Press.
- Forrester, J.W. (1969) Urban Dynamics. Cambridge, MA: MIT Press.
- Richardson, G.P. (1991) Feedback Thought in Social Science and Systems Theory. Philadelphia: University of Pennsylvania Press.
- Morecroft, J.D.W. (2015) Strategic Modelling and Business Dynamics: A Feedback Systems Approach. 2nd edn. Hoboken: Wiley.
- Ford, A. (2010) Modeling the Environment. 2nd edn. Washington, DC: Island Press.
- Bossel, H. (2007) Systems and Models: Complexity, Dynamics, Evolution, Sustainability. Norderstedt: Books on Demand.
- Barlas, Y. (1996) ‘Formal aspects of model validity and validation in system dynamics’, System Dynamics Review, 12(3), pp. 183–210.
References
- Barlas, Y. (1996) ‘Formal aspects of model validity and validation in system dynamics’, System Dynamics Review, 12(3), pp. 183–210.
- Bossel, H. (2007) Systems and Models: Complexity, Dynamics, Evolution, Sustainability. Norderstedt: Books on Demand.
- Ford, A. (2010) Modeling the Environment. 2nd edn. Washington, DC: Island Press.
- Forrester, J.W. (1961) Industrial Dynamics. Cambridge, MA: MIT Press.
- Forrester, J.W. (1969) Urban Dynamics. Cambridge, MA: MIT Press.
- Meadows, D.H. (2008) Thinking in Systems: A Primer. White River Junction, VT: Chelsea Green.
- MIT OpenCourseWare. (2013) Introduction to System Dynamics: Readings. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/pages/readings/.
- MIT OpenCourseWare. (2013) Introduction to System Dynamics: Syllabus. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/pages/syllabus/.
- MIT OpenCourseWare. (2013) Mapping the Stock and Flow Structure of Systems. Available at: https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/resources/mit15_871f13_ass3/.
- MIT Sloan System Dynamics. (n.d.) About Us. Available at: https://mitsloan.mit.edu/faculty/academic-groups/system-dynamics/about-us.
- Morecroft, J.D.W. (2015) Strategic Modelling and Business Dynamics: A Feedback Systems Approach. 2nd edn. Hoboken: Wiley.
- Richardson, G.P. (1991) Feedback Thought in Social Science and Systems Theory. Philadelphia: University of Pennsylvania Press.
- Sterman, J.D. (2000) Business Dynamics: Systems Thinking and Modeling for a Complex World. Boston: Irwin/McGraw-Hill.
- System Dynamics Society. (n.d.) System Dynamics Society. Available at: https://systemdynamics.org/.
