Le modèle S.Z.R.

Bonjour j'ai un problème pour tracer P
voici l'exercice
Le modèle S.Z.R. est une variation du modèle S.I.R proposée par Munz, Hudea, Imad et Smith en 2009 pour modéliser une apocalypse zombie.

À chaque instant on décide de diviser la population en trois catégories (qu’on appelle « compartiments » dans le langage de l’épidémiologie)
- les individus « Susceptibles » ou « Sains » (S) : ceux qui n’ont jamais eu la maladie, et peuvent la contracter ;
- les individus « Zombies » (Z) ;
- les individus « Rétablis » (R, comme « Recovered » en anglais) : les personnes décédées qui ont la faculté de revenir à la vie (terme $\zeta R$) mais aussi les individus débarrassés de leur infection (suite à un coup de hache bien placé).
On pourrait les appeler
- $S$ les vivants
- $Z$ les morts-vivants
- $R$ les morts
On travaillera avec des variables normalisées : leur valeur est comprise entre $0$ et $1$ et représente une fraction de la population totale.
Le modèle s’écrit $$

\begin{cases}
S'(t)=-\beta S(t)Z(t)\\
Z'(t)=\beta S(t)Z(t)+\zeta R(t)-\alpha S(t) Z(t)\\
R'(t)=\alpha S(t)Z(t)-\zeta R(t)
\end{cases}

$$ Testons ce modèle avec les coefficients
- $\alpha=1$ [humains sains moyennement violents]
- $\beta=0.5$ [zombies peu agressifs]
- $\zeta=0.25$ [résurrection des zombies non négligeable]
Dans la suite, considérons les données initiales:
- $Z(0)=0.05$
- $S(0)=0.95$
- $R(0)=0$

On simulera pour $t\in[0;60]$ jours.
Calculer la solution approchée obtenue par la méthode d'Euler progressif avec $61$ points.
Afficher sur le même repère $t\mapsto S(t)$, $t\mapsto Z(t)$, $t\mapsto R(t)$ et $t\mapsto P(t)$.

Voici ce que j'ai fait.
def euler_progressif(phi1,phi2,phi3,tt):
    uu = [Z0]
    ww = [S0]
    vv = [R0]
    for i in range(len(tt)-1):
        uu.append(uu[ i]+h*phi1(tt[ i],uu[ i],ww[ i],vv[ i]))
        ww.append(ww[ i]+h*phi2(tt[ i],uu[ i],ww[ i],vv[ i]))
        vv.append(vv[ i]+h*phi3(tt[ i],uu[ i],ww[ i],vv[ i]))
    return [uu,ww,vv]

[uu_ep, ww_ep,vv_ep] = euler_progressif(phi1,phi2,phi3,tt)
print(uu)

figure(figsize=(20,20))
plot(tt,uu_ep)
plot(tt,ww_ep,'*')
plot(tt,vv_ep,'--')
Pour commencer ma démarche est elle juste ? Deuxième question je n’arrive pas à tracer $P $ sachant que $P$ est $P(t)=S(t)+Z(t)+R(t).$

[Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]

Réponses

  • Bonjour,

    Normalement, $P$ est constante et égale à $1$ puisque représente toute la population ?

    Cordialement,

    Rescassol
  • Merci

    j'ai peut êtres trouver la solution en créant P
    %reset -f
    %matplotlib inline
    from matplotlib.pylab import *
    
    t0 = 0
    tfinal = 60
    tt = linspace(t0,tfinal,61)
    h  = tt[1]-tt[0]
    Z0 = 0.05
    S0 = 0.95
    R0 = 0
    P0=0.05+0.95
    a=1
    b=0.5
    c=0.25
    phi1 = lambda t,s,z,r : -b*s*z
    phi2 = lambda t,s,z,r: b*s*z+c*r-a*s*z
    phi3 = lambda t,s,z,r : a*s*z-c*r
    phi4 = lambda t,s,z,r : (-b*s*z) +(b*s*z+c*r-a*s*z)+(a*s*z-c*r)
    
    def euler_progressif(phi1,phi2,phi3,phi4,tt):
       uu = [Z0]
       ww = [S0]
       vv = [R0]
       pp=[P0]
       for i in range(len(tt)-1):
          uu.append(uu[ i]+h*phi1(tt[ i],uu[ i],ww[ i],vv[ i]))
          ww.append(ww[ i]+h*phi2(tt[ i],uu[ i],ww[ i],vv[ i]))
          vv.append(vv[ i]+h*phi3(tt[ i],uu[ i],ww[ i],vv[ i]))
          pp.append(pp[ i]+h*phi4(tt[ i],uu[ i],ww[ i],vv[ i]))
       return [uu,ww,vv,pp]
    
    [uu_ep, ww_ep,vv_ep,pp_ep] = euler_progressif(phi1,phi2,phi3,phi4,tt)
    figure(figsize=(20,20))
    plot(tt,uu_ep)
    plot(tt,ww_ep,'*')
    plot(tt,vv_ep,'--')
    plot(tt,pp_ep,'--')
    xlabel('t')
    grid()
    
    Mon graphe est il cohérent ?

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]102300
  • Bonjour,

    Voilà ce que j'obtiens.

    Cordialement,

    Rescassol102302
  • Donc j'ai faux ...
    Une idée de mes erreurs ?
  • Bonjour,

    Je ne sais pas, ton code ne compile pas chez moi.
    J'utilise Pyzo 4.73 avec Python 3.72 sous Windows 10.

    C'est la ligne
    phi1 = lambda t,s,z,r : -b*s*z
    qui produit la première erreur:
    TypeError: can't multiply sequence by non-int of type 'float'

    D'autre part, tu peux vérifier tes équations de départ et tes conditions initiales.

    Cordialement,

    Rescassol
  • Bonjour,

    Tu t'es trompé dans l'ordre de tes $u,v,w$.
    Si tu avais gardé les lettres $S,Z,R$, ce ne serait pas arrivé.

    Cordialement;

    Rescassol
  • J'ai enfin trouver mon erreur :-D qui était l'ajout de valeur dans la mauvaise liste
    phi1 = lambda t,z,r,s :-b*s*z
    phi2 = lambda t,z,r,s : b*s*z+c*r-a*s*z
    phi3 = lambda t,z,r,s : a*s*z-c*r
    phi4 = lambda t,z,r,s :(-b*s*z)+(b*s*z+c*r-a*s*z)+(a*s*z-c*r)
    
    def euler_progressif(phi1,phi2,phi3,phi4,tt):
        zz = [z0]
        ss = [s0]
        rr=[r0]
        pp=[p0]
        for i in range(len(tt)-1):
            ss.append(ss[ i]+h*phi1(tt[ i],zz[ i],rr[ i],ss[ i]))
            zz.append(zz[ i]+h*phi2(tt[ i],zz[ i],rr[ i],ss[ i]))
            rr.append(rr[ i]+h*phi3(tt[ i],zz[ i],rr[ i],ss[ i]))
            pp.append(pp[ i]+h*phi4(tt[ i],zz[ i],rr[ i],ss[ i]))
        return [zz,ss,rr,pp]
    
    Dernière petite question auriez-vous une réponse rigoureuse pour la question suivante.
    Soit $P(t)=S(t)+Z(t)+R(t)$. Montrer que $P$ est un invariant.

    [Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]102324
  • Bonsoir,

    > Montrer que $P$ est un invariant.

    C'est évident, sa dérivée est nulle.

    Cordialement,

    Rescassol
  • C'est un peu bizarre de mettre les fonctions phi et tt en arguments de ta fonction euler_progressif mais pas z0, s0, r0 et p0.
  • Bonsoir,

    Voilà mon propre code:
    ###################################################################
    # Modélisation d'une épidémie (modèle SZR)
    # Rescassol - 17/05/2020
    ###################################################################
    
    ###################################################################
    # Importations
    ###################################################################
    
    import numpy as np
    from scipy.integrate import odeint
    
    import matplotlib.pyplot as plt
    import matplotlib.patches as mpatches
    
    ###################################################################
    
    def EpidemieSZR():
        def F(v,t):
        # Prend v=[S,Z,R] et renvoie [-b*S*Z, b*S*Z+c*R-a*S*Z, a*S*Z-c*R]
            return np.array([-b*v[0]*v[1], b*v[0]*v[1]+c*v[2]-a*v[0]*v[1], a*v[0]*v[1]-c*v[2]])
        # Initialisations
        tmin, tmax, tpas = 0.0, 60.0, 1.0
        t = np.arange(tmin,tmax,tpas)
        S0, Z0, R0, a, b, c = 0.95, 0.05, 0.0, 1.0, 0.5, 0.25
        Sol0=np.array([S0, Z0, R0])
        # Calcul
        Sol=odeint(F,Sol0,t)
        # Graphique
        fig=plt.figure(linewidth=10,facecolor = 'gold',edgecolor='red')
        plt.plot(t,Sol[:,0],'b',t,Sol[:,1],'r',t,Sol[:,2],'g',linewidth=3)
        maxfig()
        # Titre et légende
        plt.title("Propagation d'une épidémie",size=40,color='m',fontweight='bold')
        plt.xlabel("Modèle S.Z.R.",size=40,color='m',fontweight='bold')
        label1 = mpatches.Patch(color='b', label='Vivants')
        label2 = mpatches.Patch(color='r', label='Morts-Vivants')
        label3 = mpatches.Patch(color='g', label='Morts')
        lg=plt.legend(loc='right', fontsize='xx-large', shadow=True, fancybox = True, handles=[label1, label2, label3])
        lg.get_frame().set_facecolor('cyan')
        lg.get_frame().set_edgecolor('orchid')
        lg.get_frame().set_linewidth(5.0)
    
        plt.show()
    
    ###################################################################
    
    def maxfig():
        mng = plt.get_current_fig_manager()
        mng.window.showMaximized()
    
    ###################################################################
    # Programme principal
    ###################################################################
    
    EpidemieSZR()
    

    Cordialement,

    Rescassol
  • Bonjour je voudrais savoir si mon modelé et juste
    Le modèle S.Z.R. est une variation du modèle S.I.R proposée par Munz, Hudea, Imad et Smith en 2009 pour modéliser une apocalypse zombie.
    En 2013 deux biologistes Witwoski et Blais proposent une alternative à ce modèle, le modèle SEZR.

    À chaque instant on décide de diviser la population en quatre catégories (qu’on appelle « compartiments » dans le langage de l’épidémiologie):
    - les individus « Susceptibles » ou « Sains » (S) : ceux qui n’ont jamais eu la maladie, et peuvent la contracter ;
    - les individus « Exposed » : personnes infectées en passe de devenir zombies mais pas encore contagieuses ;
    - les individus « Zombies » (Z) ;
    - les individus « Rétablis » (R, comme « Recovered » en anglais) : les personnes ou les zombies décédées.

    Au contact des zombies, les individus sains passent temporairement dans le groupe E au taux $\beta$. Les individus du groupe E deviennent inexorablement des zombies à un taux $\zeta$. Les individus sains peuvent, en se suicidant, intégrer directement la classe R au taux $\delta$. Enfin, en visant la tête, les individus sains peuvent se débarrasser définitivement des zombies au taux $\alpha$.
    On travaillera avec des variables normalisées : leur valeur est comprise entre $0$ et $1$ et représente une fraction de la population totale.
    Le modèle s’écrit $$

    \begin{cases}
    S'(t)=-\beta S(t)Z(t)-\delta S(t)\\
    E'(t)= \beta S(t)Z(t)-\zeta E(t)\\
    Z'(t)= \zeta E(t)-\alpha S(t) Z(t)\\
    R'(t)= \alpha S(t)Z(t)+\delta S(t)
    \end{cases}


    $$ Pour le film *La Nuit des Morts-Vivants* ils ont détérminé
    - $\alpha=0.9$ [humains sains moyennement violents]
    - $\beta=1.1$ [zombies très agressifs]
    - $\zeta=3.6$ [résurrection des zombies]
    - $\delta=0$
    Dans la suite, considérons les données initiales:
    - $Z(0)=0.05$
    - $S(0)=0.95$
    - $R(0)=0$

    On simulera pour $t\in[0;60]$ jours
    from matplotlib.pylab import *
    
    t0 = 0
    tfinal = 60
    a=0.9
    b=1.1
    c=3.6
    d=0
    s0=0.95
    z0=0.05
    r0=0
    p0=z0+s0+r0+e0
    e0=0
    
    S = lambda t,s,z,e:-b*s*z-d*s
    E= lambda t,s,z,e:b*s*z-c*e
    Z= lambda t,s,z,e:c*e-a*s*z
    R= lambda t,s,z,e:a*s*z+d*s
    P= lambda t,s,z,e:(-b*s*z-d*s)+(b*s*z-c*e)+(c*e-a*s*z)+(a*s*z+d*s)
    tt = linspace(t0,tfinal,201)
    h  = tt[1]-tt[0]
                               
    def euler_progressif(phi1,phi2,phi3,phi4,phi5,tt):
        ss = [s0]
        zz = [z0]
        ee = [e0]
        rr = [r0]
        pp = [p0]
        for i in range(len(tt)-1):
            ss.append(ss[i]+h*phi1(tt[i],ss[i],zz[i],ee[i]))
            zz.append(zz[i]+h*phi2(tt[i],ss[i],zz[i],ee[i]))
            ee.append(ee[i]+h*phi3(tt[i],ss[i],zz[i],ee[i]))
            rr.append(rr[i]+h*phi4(tt[i],ss[i],zz[i],ee[i]))
            pp.append(pp[i]+h*phi5(tt[i],ss[i],zz[i],ee[i]))
        return [ss,zz,ee,rr,pp]
    
    [S_ep, Z_ep, E_ep, R_ep,P_ep] = euler_progressif(S,Z,E,R,P,tt)
    figure(figsize=(18,7))
    plot(tt,S_ep,"g",tt,Z_ep,"b",tt,E_ep,tt,R_ep,tt,P_ep)
    grid()
    

    [Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]102402
  • Bonjour,
    .
    1) Ce message devrait être dans ton précédent fil
    2) A quoi sert d'introduire $\delta$ s'il est nul ?
    3) Il n'y a pas grand chose à modifier dans mon code du fil d'à côté pour modéliser ça.
    4) Ton énoncé ne donne pas $E(0)$.

    Cordialement,

    Rescassol
  • Bonjour vous pensez que c'est qu'un oubli de mon professeur pour le E(0).
  • Bonjour,

    Je ne sais pas de qui c'est un oubli, mais ça manque.
    On a besoin de toutes les conditions initiales.
    Il est aussi possible que $E(0)=0$ soit une conséquence d'un raisonnement physique, je ne sais pas.
    Tu n'as pas dit si c'était un exercice d'un cours de mathématiques, ou de programmation, ou de biologie ...

    Cordialement,

    Rescassol
  • On a à tout moment $S+E+Z+R=1$ donc si $S(0)$, $Z(0)$ et $R(0)$ sont donnés on connaît $E(0)$.
  • d'accord merci
    mais hormis E(0)
    mon graphe est il cohérent?
Connectez-vous ou Inscrivez-vous pour répondre.