The Logistic Population Model

The Problem with Malthus's Model

Malthus's population model predicts either population growth without bound or inevitable extinction. The difference is based on whether the growth rate r is postive or negative.

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.

The Logistic Population Model

The logistic model, a slight modification of Malthus's model, is just such a model. As with Malthus's model the logistic model includes a growth rate r. This parameter represents the rate at which the population would grow if it were unencumbered by environmental degradation.

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.


  1. Determine the equilibrium populations X(*) for this model. Do they appear reasonable given the interpretations of the parameters r and K?
  2. Assuming normal biological conditions, which equilibrium do you suspect is stable? unstable?
  3. Using the Stella version of Malthus's model as a starting point, create a Stella model for the logistic population growth model.
  4. Setting parameter values r=0.07 and K=1000, and using an initial population of 150, run your Stella logistic model for 200 years, plotting the population as a function of time. Note the population's behavior. Does it match your expectations?
  5. Try other values of r, K and initial populations. In particular, try initial populations which are greater than K and less than K. Try to identify when the model behaves correctly and when the model seems "broken."

Bidirectional Flows

In question 5 above you may have noticed that the model works fine when the initial population is below the carrying capacity, but does seem to work for larger initial populations. In the model these larger populations do not decrease toward the carrying capacity as we might expect. Rather, the large populations don't change at all.

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.

Birth and Death Rates

The second and preferred way of dealing with the uni-directional difficulty is to reformulate the model. Instead of simply computing the net change in population (which may be positive or negative) rearrange the model to keep track of the birth and death rates, both of which are likely to be nonnegative.

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


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.


  1. Change the flow in the original logistic Stella model to be bidirectional and repeat the earlier exercises with initial populations in excess of the carrying capacity. Does the model now conform to expectations?
  2. Repeat the above using the explicit birth and death rate model discussed in the article. Does this model conform to expectations?
  3. Compare the results of these two exercises. If the results differ, explain the difference. If the results are identical, explain why they should be identical.