<jupyter_start><jupyter_text>SIMULEER EEN EPIDEMIE: HET SIR-MODEL      In dit project bestudeer je hoe ziektes zich kunnen verspreiden doorheen een (sociaal) netwerk. Je onderzoekt hoe de structuur van een netwerk een invloed kan hebben op hoe snel een ziekte doorgegeven wordt. Finaal zal je ook verschillende strategieën bekijken om de verspreiding van een ziekte tegen te gaan.    In deze notebook maak je kennis met het wiskundig model SIR.<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
from scipy.spatial import distance_matrix<jupyter_output><empty_output><jupyter_text>Het SIR-modelEen van de eenvoudigste manieren om ziekteverspreiding in een gemeenschap te modelleren, is aan de hand van het SIR-model. **SIR staat voor *Susceptible* (vatbaar), *Infected* (geïnfecteerd) en *Resistant* (resistent of hersteld), de drie types individuen die in een gemeenschap voorkomen.** Het SIR-model bestaat uit drie vergelijkingen die de veranderingen van het aantal individuen in een bepaalde groep beschrijven. De variabelen die de toestand beschrijven zijn:-  $S(t)$: het aantal vatbare individuen op tijdstip $t$;-  $I(t)$: het aantal geïnfecteerde individuen op tijdstip $t$;-  $R(t)$: het aantal resistente individuen op tijdstip $t$.Hierbij is t de tijd in een bepaalde tijdseenheid (de tijdseenheid wordt gekozen afhankelijk van het probleem).Deze beschrijving maakt een eerste grote vereenvoudiging van de werkelijkheid. Er wordt aangenomen dat elk van deze variabelen een reëel getal is, en dat het aantal individuen in elke groep continu kan variëren. In werkelijkheid zijn het discrete waarden: het aantal geïnfecteerden en vatbare individuen is een natuurlijk getal, je bent immers besmet of je bent het niet. Modelleerders werken echter graag met continue variabelen, omdat ze dan de technieken van de wiskundige analyse kunnen gebruiken. > **Oefening 1**: Onder welke omstandigheden gaat deze continue benadering ongeveer op? Denk je dat je dit model kan gebruiken om een gezin van vier personen te beschrijven? Antwoord: Deze drie variabelen worden aan elkaar gelinkt aan de hand van drie differentiaalvergelijkingen (die elk een verandering in de tijd beschrijven). Hierbij wordt aangenomen dat de grootte van de populatie ongewijzigd blijft: je neemt dus aan dat, gedurende de tijdspanne die het model beschrijft, er niemand geboren wordt en ook niemand sterft. Eigenlijk beperk je je hier tot de verspreiding van een relatief onschuldige ziekte zoals een verkoudheid. Je kan de situatie dus voorstellen met het volgende stelsel differentiaalvergelijkingen:  $$\left\{    \begin{array}{31}        \Large\frac{\text{d}S(t)}{\text{d}t} \normalsize = -\beta \, S(t) \, I(t) \\        \Large\frac{\text{d}I(t)}{\text{d}t} \normalsize = \beta \, S(t) \,I(t) - \gamma \, I(t) \\        \Large\frac{\text{d}R(t)}{\text{d}t} \normalsize = \gamma \, I(t)    \end{array}\right. $$ Elke vergelijking vertelt hoe het aantal mensen in elke groep wijzigt doorheen de tijd. Daaruit kan je berekenen hoeveel mensen zich op een bepaald moment bevinden in elke groep. De parameters $\beta$ en $\gamma$ spelen daarbij een fundamentele rol. De vergelijkingen zijn gekoppeld via de *overgangspercentages* (zie figuur). Elk overgangspercentage vertelt hoe van de ene naar de andere groep wordt overgegaan. Het overgangspercentage van vatbaar (S) naar geïnfecteerd (I) hangt af van het contact tussen een vatbare persoon en een geïnfecteerde persoon. Men noemt dit *infectiepercentage* $\beta$. Dit betekent dat één geïnfecteerde persoon $\beta S$ personen zal besmetten. Het aantal vatbare personen vermindert dus met $\beta S I$ per tijdseenheid. Het overgangspercentage van geïnfecteerd (I) naar resistent (R) hangt alleen af van het *herstelpercentage*, dat men $\gamma$ noemt. Het aantal geïnfecteerde personen vermindert dus met  $\gamma I$ per tijdseenheid.Figuur 1: Overgang van de ene groep naar de andere groep binnen het SIR-model.  > **Oefening 2**: Schrijf op hoe de aantallen binnen elke groep veranderen per tijdseenheid. Antwoord: Het SIR-model is moeilijk om exact te worden opgelost. Dit is het geval bij veel differentiaalvergelijkingen die optreden in de biologische wetenschappen. Je moet dus een numerieke benadering van de oplossing vinden. Dit betekent dat je een algoritme zal gebruiken om een geschatte maar nauwkeurige oplossing te vinden. Vanuit deze oplossing kan je leren hoe de verschillende variabelen in de loop van de tijd veranderen. Er zijn verschillende mogelijkheden om dit te doen: -  Je zou het continue probleem kunnen vervangen door een **discrete** tegenhanger. Dit zou je toelaten bepaalde numerieke methoden te gebruiken om een benaderende oplossing te krijgen. -  Anderzijds kan je een **iteratieve** methode gebruiken. Uitgaande van een initiële schatting, maken iteratieve methoden opeenvolgende benaderingen die stapsgewijs convergeren naar de exacte oplossing.  Iteratieve manierMet behulp van computers is het gemakkelijk om iteratief een numerieke oplossing voor het SIR-model te vinden. - Om dit te doen, vertrek je van een *beginvoorwaarde*: het is logisch om te beginnen met een populatie met nul resistente personen, een paar geïnfecteerde personen en de rest vatbaar (zie voorbeelden). - Vervolgens kan je de numerieke oplossing gebruiken om het aantal mensen in elke groep op bepaalde tijdstippen te berekenen.Via de Python-module SciPy kan je eenvoudig dergelijke differentiaalvergelijkingen *simuleren*. - Eerst moet je de differentiaalvergelijkingen *implementeren*: je stopt daartoe de drie vergelijkingen hierboven gegeven in een *rijmatrix*. Met behulp van de Python-module NumPy kan een matrix ingegeven worden met een *NumPy array*.<jupyter_code># ingeven differentiaalvergelijkingen
def SIR(t, y, beta, gamma):
    """Differentiaalvergelijkingen die S, I en R in functie van de tijd t bepalen."""
    S, I, R = y
    return np.array([-beta * S * I,
                    beta * S * I - gamma * I,
                    gamma * I])<jupyter_output><empty_output><jupyter_text>- Nu kan je het stelsel differentiaalvergelijkingen *numeriek oplossen* met de functie `solve_ivp()` van de module SciPy voor een bepaalde *beginsituatie*.  Voorbeeld 1Beschouw een populatie met 1000 mensen, waarvan initieel één persoon ($I_0$) geïnfecteerd is en $S_0=999$ personen vatbaar zijn voor de ziekte.Ook de overgangspercentages geef je mee: $ \beta = 0,001$ en $\gamma = 0,1$.<jupyter_code># voorbeeld 1 
# beginsituatie
S0 = 999
I0 = 1
R0 = 0

beta = 0.001
gamma = 0.1

oplossing = solve_ivp(SIR,                     # functie met parameters
                      [0, 100],                # tijdsinterval waarin je simuleert
                      np.array([S0, I0, R0]),  # initiële omstandigheden
                      args=(beta, gamma))      # parameters van stelsel differentiaalvergelijkingen 
print(oplossing)       # oplossing geeft rij t-waarden en matrix y met als rijen S, I en R terug<jupyter_output><empty_output><jupyter_text>Deze oplossing geef je dan op verschillende manieren grafisch weer:<jupyter_code># voorbeeld 1 grafiek oplossing S, I, R 
plt.figure()

plt.plot(oplossing.t, oplossing.y[0], color="orange")  # S
plt.plot(oplossing.t, oplossing.y[1], color="purple")  # I 
plt.plot(oplossing.t, oplossing.y[2], color="green")   # R

plt.show()
# voorbeeld 1 grafiek verdeling populatie over S, I, R in functie van de tijd
plt.figure()

plt.stackplot(oplossing.t, oplossing.y[[1,0,2],:],
              labels=["I", "S", "R"],
              colors=["red", "yellow", "lightgreen"])
plt.xlabel("Tijd")
plt.ylabel("Aantal personen")
plt.legend(loc=0)

plt.show()
# grafiek voorbeeld 1 combinatie verdeling populatie en S, I, R
plt.figure()

plt.stackplot(oplossing.t, oplossing.y[[1,0,2],:],
              labels=["I", "S", "R"],
              colors=["red", "yellow", "lightgreen"])
plt.xlabel("Tijd")
plt.ylabel("Aantal personen")
plt.legend(loc=0)

plt.plot(oplossing.t, oplossing.y[1], color="purple")  # I 
plt.plot(oplossing.t, oplossing.y[2], color="green")   # R
plt.plot(oplossing.t, oplossing.y[0], color="orange")  # S

plt.show()<jupyter_output><empty_output><jupyter_text>> **Oefening 3**: Pas voorbeeld 1 aan en simuleer een aantal situaties door de parameters aan te passen: -  Wat als initieel de helft van de populatie resistent was? -  Wat als initieel 80 % van de populatie resistent was?  Voorbeeld 2Zelfde probleem als in voorbeeld 2 maar met andere overgangspercentages.<jupyter_code># voorbeeld 2 
# beginsituatie
S0 = 999
I0 = 1
R0 = 0

beta = 0.0001
gamma = 0.048


oplossing4 = solve_ivp(SIR,                    # functie met parameters
                      [0, 365],                # tijdsinterval waarin we simuleren
                      np.array([S0, I0, R0]),  # initiële omstandigheden
                      t_eval=np.linspace(0,365,36),   # aantal punten van oplossing
                      args=(beta, gamma))      # parameters van stelsel differentiaalvergelijkingen 
# voorbeeld 2 grafiek oplossing S, I, R 
plt.figure()

plt.plot(oplossing4.t, oplossing4.y[0], color="orange")  # S
plt.plot(oplossing4.t, oplossing4.y[1], color="purple")  # I 
plt.plot(oplossing4.t, oplossing4.y[2], color="green")   # R

plt.show()
# grafiek voorbeeld 2 grafiek verdeling populatie over S, I, R in functie van de tijd
plt.figure()

plt.stackplot(oplossing4.t, oplossing4.y[[1,0,2],:],
              labels=["I", "S", "R"],
              colors=["red", "yellow", "green"])
plt.xlabel("Tijd")
plt.ylabel("Aantal personen")
plt.legend(loc=0)

plt.show()
# grafiek voorbeeld 2 combinatie verdeling populatie en S, I, R
plt.figure()

plt.stackplot(oplossing4.t, oplossing4.y[[1,0,2],:],
              labels=["I", "S", "R"],
              colors=["red", "yellow", "lightgreen"])
plt.xlabel("Tijd")
plt.ylabel("Aantal personen")
plt.legend(loc=0)

plt.plot(oplossing.t, oplossing.y[1], color="purple")  # I 
plt.plot(oplossing.t, oplossing.y[2], color="green")   # R
plt.plot(oplossing.t, oplossing.y[0], color="orange")  # S

plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09102614896988906, 'fraction_numerical': 0.012381141045958796, 'mean_word_length': 4.138422391857507, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '88532', 'license': 'CC0-1.0', 'n_tokens_mistral': 3677, 'n_tokens_neox': 3619, 'n_words': 1190, 'path': 'STEM/Epidemie/0200_SIRModel.ipynb', 'repo_name': 'dwengovzw/PythonNotebooks', 'size': '10096'}