Skip to content

simple system dynamics in python - wrapper around scipy odeint using stocks and flows

License

Notifications You must be signed in to change notification settings

jdherman/stockflow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

stockflow

System dynamics in Python

Lightweight data structures for readable, maintainable models. Stocks are nouns and flows connect them. Wrapper around scipy.integrate.odeint, which is a wrapper around the Fortran library odepack using lsoda. The goal of this project is to provide an easy interface for describing stock/flow systems that will set up the ODEs automatically and solve them.

Requires NumPy and SciPy

How to use

Create simulation

from stockflow import simulation
import numpy as np

tmax = 100
dt = 0.01
t = np.arange(0,tmax,dt)
s = simulation(t)

Create stocks

# define names of states and their initial conditions
s.stocks({'A': 0, 'B': 10, 'C': 20})

Define flows and their functions

# The flow called 'Q' moves (stuff) from stock 'A' to stock 'B'. 
# Function f(t) is evaluated at each timestep.
s.flow('Q', start='A', end='B', f=lambda t: k*s.A - l*s.B)

# Flow 'P' starts outside the control volume (None) and ends at C. 
s.flow('P', start=None, end='C', f=lambda t: m*s.C if s.B > 2 else 0)
# etc.

Forcing flows that originate outside the system (control volume) will have start='None'. Flows that originate inside the system but leave will have end='None'. Flow functions f can depend on any stocks or flows that already exist, or will exist at runtime.

Flow functions can also depend on t, as will usually be the case with forcing functions. This can either be continuous (e.g. sin(t)) or discrete (P[t]). If you are using discrete flow functions, run the model with s.run(discrete=True). This allows t to be used as an array index in the forcing functions, which would cause an error if discrete=False.

Define parameters (global constants)

k = 0.2; l = 0.7; m = 1.2

Run simulation and look at time series of stocks/flows

s.run() # use discrete=True for discrete flow functions
# now access/plot any of s.A, s.B, s.C, s.Q, s.P, which are all vectors of length len(t)

####Examples For more examples check out these IPython notebooks.

####License Copyright (c) 2014 Jon Herman. Released under the MIT license.

About

simple system dynamics in python - wrapper around scipy odeint using stocks and flows

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages