Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Bonjour!
Ce programme est une simulation de l'épidémie de covid19 sur base d'un modèle différentiel SIR modifié. Deux méthode d'intégration sont proposée :
- la méthode d'Euler (la plus simple)
- la méthode de Runge Kutta d'ordre 4 (la plus performante)
Cette simulation présente un scénario plutôt pessimiste, pour lequel le déconfinement provoque une deuxième vague suite à une remontée du taux de reproduction R au dessus de 1.
Covid 19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import matplotlib.pyplot as plt
import numpy as np
max_t = 360 #durée de la simulation
sub = 1 #subdvision
integrator = 'RK4'#Methode d'intégration : Euler ou RK4
R0 = 4.0 #R0 : taux de reproduction initial
Rc = 0.8 #Rc : taux de reproduction en confinement
Rd = 1.2 #Rd : taux de reproduction en déconfinement
tc = 20 #jour du confinement
td = 60 #jour du déconfinement
te = 6 #temps d'incubation
ti = 6 #temps d'infection
th = 20 #temps d'hospitalisation
tr = 180 #durée d'immunisation
k = 0.1 #proportion détectée
dr0 = 0.05*k #taux de mortalité
ir = 0.001 #portion contaminée au départ
# Part réelle d'hospitalisation des malades (Belgique : 50% des cas détectés)
hr = 0.5*k
# Seuil de dépassement des hopitaux (Belgique : 50% de 5.6 lits/1000hab occupés)
threshold= 0.5*0.0056/hr
t = np.linspace(1., max_t,max_t*sub)
def seihrd(v,time):
s,e,i,h,r,d = v
Rt = R0 if time<tc else Rc if time<td else Rd
dr = dr0 if h<threshold else dr0*(1+4*(h-threshold))
return [-Rt/ti*s*i+r/tr,-e/te+Rt/ti*s*i, e/te-i/ti,i/ti-h/th,h/th*(1-dr)-r/tr,h/th*dr]
def euler(f,v0,t):
v = np.array(v0)
res=np.expand_dims(np.array(v0),axis=0)
dt=t[1]-t[0]
for s in t[1:]:
v=v+np.array(f(v,s))*dt
res = np.concatenate((res, np.expand_dims(v, axis=0)), axis=0)
return res
def rk4(f,v0,t):
v = np.array(v0)
res=np.expand_dims(np.array(v0),axis=0)
dt=t[1]-t[0]
for s in t[1:]:
k1=np.array(f(v,s))*dt
k2=np.array(f(v+k1/2,s+dt/2))*dt
k3=np.array(f(v+k2/2,s+dt/2))*dt
Enter to Rename, Shift+Enter to Preview
Exercice
Comparer les résultats des deux méthodes d'intégration avec différentes valeurs de subdivisions.
Open Source Your Knowledge: become a Contributor and help others learn. Create New Content