← Deterministic Models

04

Initial conditions and population conservation

Differential equations describe how an epidemic changes, but they cannot determine one particular epidemic until its starting state is supplied. In this lesson, we define initial conditions and use Python to check whether they form a valid closed SIR population.

Biological scenario

A town has 5,000 residents. At the beginning of an outbreak, 12 residents are infectious and 3 have already recovered. Everyone else is susceptible.

Before using these values in a model, we must calculate the missing compartment and verify that the initial state is biologically consistent.

What is an initial condition?

An initial condition gives the value of a model variable at the starting time, usually \(t=0\).

\[I(0)=12,\qquad R(0)=3.\]

Because \(N=5000\), the susceptible population is

\[S(0)=N-I(0)-R(0)=5000-12-3=4985.\]

The notation \(S(0)\) means “the susceptible population at time zero.” It is not multiplication of \(S\) by zero.

Conditions for a valid initial state

Non-negative compartments\[S(0),I(0),R(0)\geq0\]
Positive population\[N>0\]
Correct total\[S(0)+I(0)+R(0)=N\]

For individual counts, whole numbers are normally supplied initially. A deterministic solution may later contain decimal compartment values because it is a continuous approximation.

Counts and proportions

The same epidemic state can be represented by numbers of people or by population proportions.

CompartmentCountProportion
Susceptible4,9850.9970
Infectious120.0024
Recovered30.0006
Total5,0001.0000

For proportions, define \(s=S/N\), \(i=I/N\) and \(r=R/N\). Then

\[s(0)+i(0)+r(0)=1.\]

What population conservation means

\[S(t)+I(t)+R(t)=N\qquad\text{for every time }t.\]

A quantity that remains unchanged throughout a model is called an invariant. In the closed SIR model, infection and recovery move people between compartments but do not change the total population.

This conservation statement depends on the modelling assumptions. It would change if the model included births, deaths unrelated to the disease, immigration or emigration.

Valid and invalid examples

Valid

S = 4985
I = 12
R = 3
N = 5000

All values are non-negative and their sum is 5,000.

Invalid

S = 4990
I = 12
R = 3
N = 5000

The compartment sum is 5,005, so five people have been counted twice or the data are inconsistent.

Programming objective

We will write a function that calculates the compartment total, checks each validity condition and returns a clear validation report.

Programming ideas used in the check

PythonMeaning
S >= 0Checks whether \(S\) is non-negative.
andRequires all connected conditions to be true.
==Tests whether two values are equal; it does not assign a value.
ifRuns a block only when its condition is true.
elseRuns the alternative block when the condition is false.
returnSends the validation results back from the function.

Build the validation program

Step 1: Calculate the missing susceptible population

S0 = N - I0 - R0

The zero in S0 is part of the variable name and indicates the value at time zero.

Step 2: Form Boolean conditions

non_negative = S0 >= 0 and I0 >= 0 and R0 >= 0
positive_population = N > 0
correct_total = S0 + I0 + R0 == N

Each comparison produces either True or False. These are Boolean values.

Step 3: Combine the checks

valid = non_negative and positive_population and correct_total

The state is valid only when every required condition is true.

Run the initial-condition validator

Change the values and run the code. The program will report each condition separately so that an invalid state can be diagnosed.

Interactive PythonInitial-condition validator

Output

Run the code to see the result.

Expected outcome

CheckOutcomeInterpretation
Non-negative valuesTrueNo compartment contains an impossible negative population
Positive populationTrueThe model has a population to describe
Correct totalTrueThe compartments contain exactly 5,000 people
Overall stateValidThe initial conditions can be used in the closed SIR model

Biological interpretation

The model begins with 4,985 susceptible, 12 infectious and 3 recovered residents. Infectious residents make up 0.24% of the population. The conditions are internally consistent and account for every resident exactly once.

Validation cannot prove that the data are factually correct. It checks that the values are mathematically and biologically consistent with the stated closed-population assumptions.

Why counts use exact equality here

The program uses compartment_total == N because the initial values are whole-person counts and their addition is exact. When checking calculated decimal proportions or numerical solutions, a small tolerance may be needed because decimal arithmetic can introduce tiny rounding differences.

Try an invalid state

Replace the calculated line S0 = N - I0 - R0 with S0 = 4990.

  1. Predict which condition will become False.
  2. Run the code and inspect the report.
  3. Calculate the compartment total by hand.
  4. Explain why the state violates the population assumption.