Epidemic

due: Monday, May 12th, 11:59pm

In this project we will be working with the following model of a spread of a contagious disease.

We start with a rectangular grid of cells (i.e. small squares). Each cell has an associated numerical value, which indicates the status of the cell:

Value

Meaning

0

the cell is healthy

1

the cell is sick

2

the cell was sick, but is now recovered

The grid with cell values describes spread of a disease in the population of cells:

../../_images/epidemic-1.svg

Healthy, sick, and healed cells.

In order to model how the disease evolves from one day to the next, we select two numbers: \(p_I\) and \(p_R\), both in the range between 0 and 1. The number \(p_I\) is the probability of infection - it indicates how likely is a sick cell to infect healthy neighboring cells. The number \(p_R\) is the probability of recovery of a sick cell.

Given these two numbers, the disease spread changes according to the following rules:

  • if a cell is healthy one day, then the probability that it will get sick the following day is \(1 - (1-p_I)^k\), where \(k\) is the number of neighbors of the cell which are sick. A neighbor of a cell is any cell which shares with it either an edge or a corner. For example, on the picture below all black cells are neighbors of the orange cell.

../../_images/epidemic-2.svg

A cell and its neighbors

  • if a cell is sick one day then the probability that it will be healed the next day is \(p_R\).

  • if a cell is healed, then it stays healed - it won’t get sick again.

Project

Part 1. Consider a 200x200 cells grid, starting with 16 (4x4 grid) infected cells at its center. Develop a functions update_spread that takes a 200x200 grid of cells with given states (0,1,2) and returns the grid showing the states of the cells on the next days.

Part 2. The following code produces an animation.

%matplotlib qt

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

x = np.zeros((200,200), dtype = int)

fig = plt.figure()
im = plt.imshow(x,vmin=0,vmax=1)

def animate(i):
    x[:,:] = np.random.random(x.shape)
    im.set_data(x)
    return im

anim = FuncAnimation(fig,animate)
plt.show()

Modify the code to produce an animation of the evolving epidemic.

Part 3. Explore the effect the model parameters \(p_I\) and \(p_R\) on the spread of the disease.

Part 4. Suppose that a vaccine has been invented for the disease. A vaccinated cell will have the value -1, and such cell will never get sick.

../../_images/epidemic-3.svg

Healthy, sick, healed, and vaccinated cells.

Investigate how the spread of the disease will be affected if a given percentage of randomly selected cells in the population gets vaccinated.

Note. It is very useful to think of ways to present the dynamics of the epidemic with static plots. We will discuss some ideas in class that would be useful to include in your report.