SIR model

SIR model

by pbuzin

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.99.7/jsxgraphcore.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.99.7/jsxgraph.css">
<div id="jxgbox" class="jxgbox" style="width:600px; height:600px;">
</div>

JavaScript

board = JXG.JSXGraph.initBoard('jxgbox', {
  boundingbox: [-5, 105, 105, -5],
  axis: true,
  grid: false,
  showCopyright: false
});


beta_slider = board.createElement('slider', [
  [10.0, 95.5],
  [40.0, 95.5],
  [0.0, 0.75, 1.0]
], {
  name: '&beta;',
  strokeColor: 'black',
  fillColor: 'black'
});
beta_text = board.createElement('text', [10, 92.5, "beta"], {
  fixed: true
});

gamma_slider = board.createElement('slider', [
  [60.0, 95.5],
  [90.0, 95.5],
  [0.0, 0.25, 1.0]
], {
  name: '&gamma;',
  strokeColor: 'black',
  fillColor: 'black'
});
gamma_text = board.createElement('text', [60, 92.5, "gamma"], {
  fixed: true
});


startSusceptible = board.createElement('glider', [0, 95, board.defaultAxes.y], {
  name: 'Susceptible',
  strokeColor: 'blue',
  fillColor: 'blue'
});
startInfected = board.createElement('glider', [0, 5, board.defaultAxes.y], {
  name: 'Infected',
  strokeColor: 'red',
  fillColor: 'red'
});
startRecovered = board.createElement('glider', [0, 0, board.defaultAxes.y], {
  name: 'Recovered',
  strokeColor: 'green',
  fillColor: 'green'
});
var T = 100;
var N = 100;
var g3 = null;
var g4 = null;
var g5 = null;

function solve_ode(x0, I, T, f) {
  var data = [x0];
  var dt = (I[1] - I[0]) / T;
  for (let i = 1; i < T; ++i) {
    var dS_dt = data[i - 1][0] + dt * f(0, data[i - 1])[0];
    var dI_dt = data[i - 1][1] + dt * f(0, data[i - 1])[1];
    var dR_dt = data[i - 1][2] + dt * f(0, data[i - 1])[2];    
    data.push([dS_dt, dI_dt, dR_dt]);
  }

  return data
}

function ode() {
  var I = [0, 100];
  var T = 1000;

  var f = function(t, x) {
    var beta = beta_slider.Value();
    var gamma = gamma_slider.Value();

    var y = [];
    y[0] = - beta * x[0] * x[1]/N;
    y[1] = beta * x[0] * x[1]/N - gamma * x[1];
    y[2] = gamma * x[1];    
   
    return y;
  };

  var x0 = [startSusceptible.Y(), startInfected.Y(), startRecovered.Y()];

  var data = solve_ode(x0, I, T, f);

  var q = I[0];
  var h = (I[1] - I[0]) / T;
  for (let i = 0;...