You can use this page to get a quick overview of the wide range of models that can be constructed in Simile. Each entry gives some text on the model, a model diagram (usually an outline view for all but the simplest of models), and a sample screen display from the running model. Models are arranged roughly in order of increasing complexity and increasing sophistication of the Simile techniques used.
Exponential population growth
The population is represented by a single state variable (compartment), whose dynamics depends on two flows: a reproduction inflow and a mortality outflow. Both occur at a rate proportional to population size, where r and m are the coefficients of proportionality.
The graph shows the expected exponential increase in population size.
Logistic (sigmoid, density-dependent) population growth
The previous model is modified by making r, the reproductive rate per individual, depend on population size, decreasing as population increases.
This causes the population to grow roughly exponentially to begin with, but then rise more slowly towards a “carrying capacity”.
Two-species competition
Each population grows logistically in the absence of competition, with its growth rate reduced as its population gets bigger. When a competitor is present, then the growth of each population is further reduced by the other. The outcome depends on the relative strength of within- and between-species factors.
The graph shows that both species initially grow at similar rates, but then species 1 escapes and suppresses species 2.
Predator – prey
The prey (N1) grows exponentially in the absence of predation. It is predated at a rate proportional to the number of predators. The growth rate of the predator propulation is proportional to prey consumption, and predator mortality is proportional to its population.
This model shows the classic (but rather mythical) predator-prey cycle.
Explicit compartments
The simplest way of making an age-class model is to have a separate compartment for the number in each class. The compartments are connected by flows representing the movement of animals between classes as they age. Reproduction feeds into the first class, and all classes have a mortality outflow. This particular model includes density-dependent reproduction.
The model eventually equilibrates with a fixed number in each class.
Multiple-instance submodel
In this model, each age-class is now one instance of a fixed-membership, multiple-instance submodel. It has a compartment (the number in that each class), and associated flows. Outside the submodel we have an array for transferring those leaving one class to the next class, an array for the births from each class, and a variable for total population size.
Running the model produces exactly the same results as for the previous model, though this time the results are shown for each instance of one variable.
Multiple-instance submodel with an association between classes
Again, a multiple-instance fixed-membership submodel is used to represent each age-class. But in this model the transfer of individuals from one class to the next takes place through an association submodel, defined in terms of the relationship between one class and the next. This is a more expressive, flexible and (for complex models) more efficient way of linking classes.
The results are excatly the same as for the previous model.
This shows how amazingly simple it is to make an individual-based model of population dynamics in Simile. We simply create a population submodel, add in symbols for the initial number, birth and death. In this model, the probabilities of reproduction and death are age-dependent, and reproduction also depends on the total population size, which is simply obtained by summing the number of individuals.
Since this is a stochastic model, each run is different. The graph shows the result of three runs., showing the population increasing and hovering around an equilibrium.
This model uses a population submodel to represent the trees in a forest stand. A simple, single-compartment model is used to simulate the growth of each tree, and this is summed outside the submodel to give the total volume of the stand of trees. The model also sets the initial number of trees in the population, the rate at which new trees are created, and the rule for killing off trees when they reach a certain size.
The graphs show the growth of each tree, from birth to death, and the volume of the whole stand. The custom “lollipop diagram” represents the stand structure during the simulation, using the tree’s (x,y) coordinates to position the trees.
Fractal branching models - frequently called Lindemeyer or L-system models - work by repeated application of the same branching rules. The Simile implementation uses a population submodel for the branch segments (intenodes), starting off with a single member (the base segment). An association submodel is used to define the relationship between one segment and its two daughters.
The behaviour of the model is visualised using a specially-developed display tool, showing the 3D structure of the simulated tree from the side and from the top.
We represent a number of animals using a fixed-membership multiple-instance submodel (it is easy to make it into a population submodel, if you wanted a dynamically-varying population). Each animal has got three state variables, representing its current x,y coordinates and the direction it’s going. Its direction changes slightly from one time step to the next, and this, along with its speed is used to update its position. Each animal is constrained to stay within the area.
We can visualise the animals’ movement using any display tool that can plot x,y values: here I've used the lollipop helper, in plane projection.
This example shows the use of a fixed-membership multiple-instance submodel for modelling the movement of water through soil layers. Each instance represents one layer, and has a single compartment, for the amount of water in that layer. The array variable outside the submodel is used to transfer the water flowing out of one layer into the one below it.
The graph shows the behaviour of the model in response to a pulse of rain lasting 8 hours. The top layer responds quickly, followed by the ones below it. The bottom layer has a lower discharge rate.
For a more in depth look at some models have a look at the worked examples and a wide range of models with varying quality of documentation can be found in the model catalogue.