Neither case is typically observed in genuine biological communities. What is often observed instead is that small populations often (though not always) increase in number while very large populations tend to decline in number. In both cases a steady state is often reached after which significant changes in population are not observed unless a significant environmental change is encountered. A good population model must therefore reproduce this behavior.
From a biological point of view the missing feature of Malthus's model is the idea of carrying capacity. As a population increases in size the environment's ability to support the population decreases. As the population increases per capita food availability decreases, waste products may accumulate and birth rates tend to decline while death rates tend to increase. It seems reasonable to consider a mathematical model which explicitly incorporates the idea of carrying capacity.
A second parameter, K, represents the carrying capacity of the system being studied. Carrying capacity is the population level at which the birth and death rates of a species precisely match, resulting in a stable population over time.
Letting X(i) represent the population at the beginning of time period i the logistic model is:
X(i+1) - X(i) = r*X(i)*(1 - X(i)/K)
where * represents multiplication.
In fact, our expectations of the model are correct. The large initial populations should decrease toward the carrying capacity. What is wrong is not our model of our understanding of the model. Instead, the difficult lies in an important subtlety with the Stella software.
The subtlety is this: unless Stella is explicitly told otherwise, Stella forces all flows to be non-negative. If the formula for a flow yields a negative number, Stella just sets the flow to zero and proceeds. Most of the time this is not a problem, but as we saw above, it can pose difficulties at times. If a model is not behaving as expected, it is always a good idea to see if this behavior by Stella could be a source of difficulty.
There are two ways to overcome this difficulty. The first is to inform Stella that a particular flow is bi-directional. In this case if a formula for a flow yields a negative value Stella will move material in the direction opposite its normal flow. In the case of our logistic model material will flow from the stock (reservoir) back into the cloud.
To accomplish this, double click on the flow, just as you did when typing in the formula for the flow. In the upper left-hand part of the window will be a line indicating whether or not the flow should be bi-directional. Clicking on the appropriate circle will allow the flow to move in one or two directions. After clicking on the circle, click on the OK icon to save the change.
This reformulation of the model involves a slight change in the Stella model we developed earlier. The new model will still have one stock (reservoir) containing the population level. However, there will now be two flows, one associated with births and a second associated with deaths. To create a flow out of the stock select the flow icon while on the modeling level, place the cursor inside the stock and hold the mouse button down as you drag the cursor out of the stock. When you release the mouse button a flow will be laid down which runs from the stock into a cloud. This flow should be labelled something like deaths while the flow into the stock should be relabelled something like births.
The deaths flow has no formula in it. The formula in the original flow, the births flow, needs to be changed. What formulas should go into these flows? The answer comes from rearranging the logistic equation into its positive and negative parts. We demonstrate this procedure here:
X(i+1) - X(i) = r*X(i)*(1 - X(i)/K)
X(i+1) - X(i) = r*X(i) - r*X(i)*X(i)/K
The first term of this formula, r*X(i), can be interpreted as the birth rate in this model, while the second term, r*X(i)*X(i)/K can be interpreted as the death rate. Noting that the birth rate only depends on r while the death rate depends on both r and K, the appropriate connectors can be created and erased in order to place the required formula in each flow.
This approach of explicitly determining the birth and death rates in a population model is routinely implemented because it gives the modeler a chance to look at the model components to see if the birth and death formulas are reasonable. It also provides experimentalists with a way to break the larger problem of population dynamics into two simpler pieces. Instead of having to derive one experiment to measure population changes as a function of population size, an experimentalist (or theorist for that matter) can consider the birth process and death process separately.
The analysis which can be performed by separating out the birth and death processes is well illustrated by the logistic model. The birth rate seems quite reasonable. It depends only on the per capita birth rate r. It may strike some as odd that the per capita birth rate does not decline as population increases. This is a weakness in the logistic model, and various attempts at correcting this problem have given rise to many variations on the logistic model.
A more serious weakness in the logistic model becomes clear when the death rate formula is considered. The number of deaths, given by
r*X(i)*X(i)/K,
does increase as the population increases. This represents the effects of congestion. The carrying capacity K plays a significant role in this formula, as it should. However, it seems odd that r, the per capita birth rate appears in this formula. It does not seem reasonable that the birth rate should directly affect the number of deaths experienced in a population. This is regarded by many as an indication that the logistic model is probably not a good representation of biological reality.
Despite the weaknesses illustrated above, the logistic model is frequently used in biological modeling, either a basis for more complicated modeling, or as an approximate model when the details of a population dynamics are not known.