sir_simulation
    
    
    
      sir_simulation,
      a MATLAB code which
      simulates the spread of a disease through a hospital room of M by N beds,
      using the Susceptible/Infected/Recovered (SIR) model.
    
    
      We consider the evolution of a disease in a hospital
      in which patients are arranged on an array of beds.
    
    
      We assume that the beds form an array of M rows and N columns, so that
      there are a total of M * N patients.
    
    
      We assume that the patients can be classified as Susceptible, Infected or
      Recovering, with the properties that:
      
        - 
          Susceptible: A patient who has never been infected with the
          disease.  A susceptible patient can get the disease.
        
 
        - 
          Infected: A patient who has never gotten the disease.
          A patient stays infected for K days.  On the K+1 of the disease,
          the patient "recovers".
        
 
        - 
          Recovered: A patient who has had the disease, that is,
          has caught the disease and been sick for a full K days.  A recovered
          patient never gets sick again.
        
 
      
    
    
      We set up an M by N array A to represent the patients.
      A(I,J) contains information on the patient in row I, column J.
      A(I,J) will be
      
        - 
          0, if the patient is susceptible.
        
 
        - 
          a value between 1 and K, if the patient is infected.  The value
          is the number of days the patient has been infected.
        
 
        - 
          -1, if the patient is recovered.
        
 
      
    
    
      The rules for transmission of the disease essentially update the
      patient array once a day.  If patient A(I,J) was:
      
        - 
          0, then check the four neighbors A(I-1,J), A(I+1,J), A(I,J-1)
          and A(I,J+1).  For each neighbor that is infected, pick a random
          number, and if that random number is less than TAU, then patient
          A(I,J) becomes infected, that is, we set A(I,J) to 1.
        
 
        - 
          a value between 1 and K, then the value is increased by 1.
          But if the value was already K, it is now reset to -1, because the
          patient has recovered.
        
 
        - 
          -1, nothing happens.
        
 
      
    
    
      Quantities of interest include an animation of the day to day status
      of patients in the hospital (the "geometry") and the values of S, I, and R,
      that is, the total number of patients in each category, as it evolves 
      over time.
    
    
      Since this problem contains a probabilistic element in the transmission of
      disease, the outcome of any single run has limited meaning.  It is much
      more valuable to run many simulations, and thus to get both average or "expected"
      values, as well as a feeling for the variance of the data from these averages.
    
    
      Usage:
    
    
      
        sir = sir_simulation ( m, n, a, k, 
          tau, t_max )
      
      where
      
        - 
          m is the number of rows of patients.
        
 
        - 
          n is the number of columns of patients.
        
 
        - 
          a is the M by N matrix of the initial patient states.
        
 
        - 
          k is the number of days a patient stays infected.
        
 
        - 
          tau is the probability that a susceptible patient will become
          infected because of one "nearby" infected patient (north, south, east 
          or west) over one day.
        
 
        - 
          t_max is the total number of days to consider, counting the initial
          condition as day 1.
        
 
      
    
    
      Licensing:
    
    
      The information on this web page is distributed under the MIT license.
    
    
      Languages:
    
    
      sir_simulation is available in
      a MATLAB version and
      an Octave version and
      a Python version.
    
    
      Related Data and codes:
    
    
      
      sir_simulation_test
    
    
      
      matlab_simulation,
      a MATLAB code which
      uses simulation to study card games, contests, and other processes
      which have a random element.  Usually, the purpose is to try to
      predict the average behavior of the system over many trials.
    
    
      Reference:
    
    
      
        - 
          Dianne OLeary,
          Models of Infection: Person to Person,
          Computing in Science and Engineering,
          Volume 6, Number 1, January/February 2004.
         
        - 
          Dianne OLeary,
          Scientific Computing with Case Studies,
          SIAM, 2008,
          ISBN13: 978-0-898716-66-5,
          LC: QA401.O44.
         
      
    
    
      Source Code:
    
    
      
        - 
          sir_area_display.m, 
          displays an area plot of the SIR percentages over time.
        
 
        - 
          sir_line_display.m,
          displays a line plot of the SIR percentages over time.
        
 
        - 
          sir_simulation.m, 
          the main code, which takes user parameter values,
          computes the configuration for each time step, 
          displays an image of the configuration for each time,
          and returns the SIR percentages.
        
 
        - 
          timestep_display.m,
          displays an image of the hospital room at each timestep,
          indicating the locations of suceptible, infected, and recovered
          patients.
        
 
      
    
    
    
      Last revised on 17 March 2019.