Le but du présent TP est de découvrir les systèmes dynamiques (système proies-prédateurs, modélisations d'épidémies).
En général, on ne sait pas les résoudre exactement. On présente donc les études qualitatives, et les méthodes approchées qui permettent d'obtenir toutes sortes d'informations sur les solutions de ces systèmes.
Soit $x(t)$ et $y(t)$ le nombre respectif de proies et de prédateurs à l'instant $t$.
Le modèle de Malthus (1766-1834) suppose une croissance exponentielle des proies en l'absence de prédateurs : $\frac{dx}{dt} = a x(t)$ et une décroissance exponentielle des prédateurs en l'absence de proies : $\frac{dy}{dt} = -c y(t)$
Une hypothèse supplémentaire conduit au système de Lokta-Volterra (1918-1939) : les taux de disparition des proies et de croissance des prédateurs sont proportionnels au nombre $x(t)y(t)$ de rencontres entre les deux populations. $ \left\{ \begin{array}{ll} \frac{dx}{dt} & = a x(t) - b x(t) y(t) \\ \frac{dy}{dt} & = -c y(t) + d x(t) y(t) \\ \end{array} \right. $
La fonction du système : $f(x,y) = (x(a-by);y(-c+dx))$ est $C^1$.
Sous ces conditions, le théorème de Cauchy-Lipschitz affirme l'existence d'une solution maximale au problème ($u=(x,y)$) : $\left\{ \begin{array}{ll} u'(t) & = f(u(t))\\ u(0) & = u_0 \end{array} \right. $ dans $C \left( [O, T^*[, \mathbb{R}^2 \right)$.
Il suffit que $f$ soit localement lipschitzienne (localement, tout segment reliant deux points de son graphe a une pente inférieure à une constante donnée) pour appliquer ce théorème.
De plus, comme la solution maximale $u(t) = (x(t), y(t))$ est bornée, un théorème affirme l'existence globale des solutions : $T^* = + \infty$.
On a $y' (ax-bxy) = x' (-c+dxy)$ soit $y'(a-by)/y=x'(dx-c)/x$ D'où $H(x,y)=dx-c lnx + by - a ln x$ est une intégrale première du système : pour toute solution $(x(t),y(t)), H(x(t),y(t)) = C^{te}$
Par passage à l'exponentielle, $A(x) B(y) = D (C^{te})$ avec $A(x) = x^c e^{-dx}$ et $B(y) = y^a e^{-by}$.
Une étude de fonction prouve que $A(x)$ admet un maximum $M_A$ en c/d, et tend en décroissant vers 0 quand $x \rightarrow + \infty$. De même, $B(y)$ admet un max $M_B$ en a/b, et tend vers 0.
Comme $0 \leqslant D \leqslant M_A M_B, \exists T \in [0, M_A], D = T M_A$. Si $x$ est non bornée, alors $x \rightarrow +\infty$, et d'après le théorème des valeurs intermédiaires, $\exists t_0, A(x(t_0)) \leqslant T/2$, et donc $B(y(t_0)) = D/A(x(t_0)) \geqslant 2 M_B$.
Ceci est absurde (le max de $B$ est $M_B$), donc $x$ est borné. Pareil pour $y$.
Pour trouver des points stationnaires, on résoud le système :
$ \left\{ \begin{array}{ll} ax - b xy & = 0 \\ -cy + d xy & = 0 \end{array} \right. $
On trouve les points $(0,0)$ et $(c/d, a/b)$.
On a résultat suivant :
Théorème : Si $f$ est différentiable en $(0,0)$, et $f(0) = 0$, alors... S'il existe une valeur propre de $D_f(0)$ à partie réelle strictement positive, alors le point 0 est instable.
Ici, $D = \left( \begin{array}{cc} a-by & -bx \\ dy & -c+dx \end{array}\right)$ donc $D_f(0,0)$ a une valeur propre de partie réelle $>0$ : $(0,0)$ est un point d'équilibre instable.
En clair, si l'on part d'un point voisin de $(0,0)$, par exemple si au départ on n'a qu'un tout petit peu de proies et de prédateurs, alors on s'éloigne de cette configuration.
Définition : Soit $U$ un voisinage de $0$, et $V : U \rightarrow \mathcal{R}$ une fonction continue et différentiable sur $U \setminus \{0 \}$, telle que :
Alors on dit que cette fonction est une '''fonction de Lyapunov .
Théorème : S'il existe une fonction de Lyapunov pour le système, alors le point d'équilibre est stable.
Ici, $V(x,y) = H(x,y) - H(c/d, a/b)$ est une fonction de Lyapunov, donc $(c/d, a/b)$ est stable.
$\bigtriangledown V(x,y) = (d-c/b, b-a/y)$, donc le produit scalaire entre $f(u)$ et $\bigtriangledown V(u)$ est nul.
De plus, $V(x,y) \geqslant 0$, et $V(x,y) = 0 \Longleftrightarrow (x,y) = (c/d, a/b)$.
Les solutions du système de Lotka-Volterra sont périodiques.
La démonstration de ce point n'est pas très compliqué. Il me manque juste le courage et le temps pour la faire figurer ici :)
On ne sait pas calculer une solution exacte du système de Lotka-Volterra à l'aide d'une formule analytique. C'est pourquoi les méthodes de résolution numériques sont intéressantes...
Elle consiste à approcher la fonction solution du problème $\left\{ \begin{array}{ll} u'(t) & = f(u(t))\\ u(0) & = u_0 \end{array} \right. $ par une fonction affine par morceaux, de la façon suivante : on confond la courbe de la fonction solution sur [$t_n ; t_{n+1}$] avec sa tangente en $(t_n, y(t_n))$.
Comme $y(t) = y(t_n) + (t-t_n) y'(t_n)$ sur [$t_n ; t_{n+1}$], on a alors $y(t) = y(t_n)+(t-t_n) f(t_n, y(t_n))$
Partant de $y_0 = y(t_0)$, on calcule $y(t_n)$ par : $y(t_{n+1}) = y(t_n)+(t_{n+1}-t_n) f(t_n, y(t_n))$
Une loi des mailles donne : $Ve = RC \frac{d Vs}{dt} + Vs$, soit $\frac{d Vs}{dt} = \frac{1}{RC} (Ve-Vs)$.
L'algorithme d'Euler donne alors : $Vs(n+1) = Vs(n) + \frac{1}{RC} (E-Vs(n)) \Delta T$ où $Vs(n)$ est l'approximation de $Vs(t)$ au temps $t_n = t_0 + n \Delta T$.
On écrit le système d'équations du modèle proies-prédateurs
$ \left\{ \begin{array}{ll} \frac{dx}{dt} & = a x(t) - b x(t) y(t) \\ \frac{dy}{dt} & = -c y(t) + d x(t) y(t) \\ \end{array} \right. $ sous la forme de la méthode d'Euler $\left\{ \begin{array}{ll} u'(t) & = f(u(t))\\ u(0) & = u_0 \end{array} \right. $ ...en posant $u=(x,y)$ et $f(x,y)=(x (a-by),y (-c+d x))$
Pour pouvoir faire des calculs, on donne des valeurs à $a,b,c,d$ : respectivement $3,1,2,1.$
On commence par importer les modules numpy (pour le type array) et pylab (pour le tracé de courbes) :
>>> from numpy import * >>> from pylab import *
Puis on définit la fonction et le pas du système :
>>> def f(X): ... return array((X[0]*(3-X[1]),X[1]*(-2+X[0]))) ... >>> h=0.05
On peut maintenant programmer la méthode d'Euler, ie calculer la suite $X_0 = (1,2), X_{n+1} = X_{n} + h f(X_n)$ pour 200 valeurs (le vecteur $X$ contient les $(x_n,y_n)$) :
>>> X=zeros((2,200),float) >>> X[:,0]=array((1.,2.)) >>> for k in range(199): ... X[:,k+1]=X[:,k]+h*f(X[:,k]) ...
On trace maintenant l'évolution du nombre de proies et de prédateurs en fonction du temps :
>>> plot(X[0,:]) >>> plot(X[1,:]) >>> title(``Methode d'Euler'') >>> show()
Evolution du nombre de proies et de prédateurs en fonction du temps
...puis le diagramme de phase :
>>> figure() >>> plot(X[0,:],X[1,:]) >>> title('Portrait de phase') >>> xlabel('x') >>> ylabel('y')
Les résultats ne sont pas conformes à notre étude théorique : les nombres de proies et de prédateurs devraient varier périodiquement.
On va donc utiliser une meilleure méthode de résolution : la méthode de Runge-Kutta.
Les méthodes de Runge-Kutta sont des méthodes d'analyse numérique d'approximation de solutions d'équations différentielles. Elles portent le nom des mathématiciens Carl Runge et Martin Wilhelm Kutta.
Ces méthodes reposent sur le principe de l'itération, c'est-à-dire qu'une première estimation de la solution est utilisée pour calculer une seconde estimation, plus précise, et ainsi de suite.
La méthode de Runge-Kutta classique d'ordre quatre est un cas particulier d'usage très fréquent, noté $RK_4$.
Considérons le problème suivant : $y' = f(t, y), \quad y(t_0) = y_0 $
La méthode $RK_4$ est donnée par l'équation $y_{n+1} = y_n + \frac{h}{6} (k_1 + 2k_2 + 2k_3 + k_4) $
où
L'idée est que la valeur suivante ($y_{n+1}$) est approchée par la somme de la valeur actuelle ($y_n$) et du produit de la taille de l'intervalle ($h$) par la pente estimée.
La pente est obtenue par une moyenne pondérée de pentes :
Dans la moyenne des quatre pentes, un poids plus grand est donné aux pentes au point milieu : $pente = \frac{k_1 + 2k_2 + 2k_3 + k_4}{6}.$
La méthode $RK_4$ est une méthode d'ordre 4, ce qui signifie que l'erreur commise à chaque étape est de l'ordre de $h^5$, alors que l'erreur totale accumulée est de l'ordre de $h^4$.
Ces formules sont aussi valables pour des fonctions à valeurs vectorielles.
On passe maintenant à la programmation de cette méthode :
>>> X=zeros((2,200),float) >>> X[:,0]=array((1.,2.)) >>> for k in range(199): ... k1=f(X[:,k]) ... k2=f(X[:,k]+h/2*k1) ... k3=f(X[:,k]+h/2*k2) ... k4=f(X[:,k]+h*k3) ... X[:,k+1]=X[:,k]+h/6.*(k1+2*k2+2*k3+k4) ...
On peut alors reprendre la fin du code précédent pour tracer l'évolution en fonction du temps, et le portrait de phase.
Evolution du nombre de proies et de prédateurs en fonction du temps
Portrait de phase : évolution du nombre de proies en fonction du nombre de prédateurs
Des données concernant les captures de lynx et de lièvres, collectées au Canada entre 1845 et 1955, mettent en évidence les variations cycliques que l'on a obtenu :
Ces méthodes de résolution numérique d'une équation différentielle sont déjà programmées dans le module scipy.
Pour tracer les courbes, on importe pylab, et pour la fonction odeint résolvant des équations différentielles...
>>> from pylab import * >>> from scipy.integrate import odeint
On définit alors notre fonction dérivée :
>>> def derivee(y,t): ... """ Notre fonction derivee """ ... return array([y[0]*(3-y[1]),y[1]*(-2+y[0])])
Puis la fonction calculant la trajectoire solution...
>>> def trajectoire(y0): ... """ On integre notre equation differentielle ... ordinaire avec le point initial y0 """ ... t=arange(0.0,100.0,0.1) ... y = odeint(derivee,y0,t) .... return y[:,0],y[:,1]
Il reste plus qu'à tracer le tout :
>>> proieA, predA = trajectoire([1.0,0.9]) >>> proieB, predB = trajectoire([0.9,0.9]) >>> plot(proieA, predA) >>> plot(proieB,predB, "r--") >>> xlabel("proies") >>> ylabel("predateurs") >>> show()
Pour rafiner le modèle, on peut supposer que le taux de croissance des proies diminue lorsque la population de proies augmente : compétition pour la nourriture, l'espace, etc.
En l'absence de prédateurs, cela se traduit par $\frac{x'}{x} = a \left(1- \frac{x}{L} \right)$ où la constante $L$ représente la population maximale de proies.
Le modèle devient alors :
$\left\{ \begin{array}{ll} \frac{dx}{dt} & = ax - b xy - \frac{a}{L} x^2\\ \frac{dy}{dt} & = - c y + d xy\\ \end{array} \right. $
qui admet $(0,0)$ et $(c/d, a/b - ac/(Lbd))$ pour points d'équilibres.
Evolution du nombre de proies et de prédateurs en fonction du temps
Evolution du nombre de proies en fonction du nombre de prédateurs
La peste est causée par une bactérie : Yersinia pestis. L'identification d'un microbe responsable s'est faite par étapes successives durant la fin du XIXième. Lors de l'épidémie, la transmission peut se faire par voie respiratoire inter-humaine, par morsure ou par piqûre.
Il y a plusieurs types de pestes : bubonique, septicémique et pneumonique (ou pulmonaire).
En Europe, la dernière grande épidémie remonte à 1720 à Marseille : le Grand-Saint-Antoine entre au port. Un passager clandestin a la peste.
Les médecins du port ne décrètent qu'une quarantaine "douce"... et la moitié des 80000 Marseillais en sera victime.
On simplifie le plus possible notre modèle, pour pouvoir commencer notre modélisation.
On suppose qu'il n'y a pas de décès, pas de guérison, pas d'isolement ; un malade reste alors toujours malade et contagieux.
Si on note $x$ les réceptifs (ou susceptibles) et $y$ les contagieux, on obtient $\frac{d x}{dt} = - \beta xy, \frac{d y}{dt} = \beta xy$ avec :
Ce système s'intègre exactement.
Si l'on rajoute les sujets qui s'en sont sortis, et se retrouvent immunisés, on trouve le modèle de Kormack et McKendrick $\frac{d x}{dt} = - \beta xy, \frac{d y}{dt} = (\beta x- \gamma ) y, \frac{d z}{dt} = \gamma y$ $\gamma$ représente la probabilité pour un infecté de guérir, et $x+y+z = n$.
L'épidémie n'a lieue que si le nombre de réceptifs $x_0$ est inférieur au seuil $\gamma / \beta$.
Dans ce modèle SIR (Susceptible, Infected and Recovered) de 1947, optimiste, les malades tendent vers 0.
On peut, pour rendre ce modèle un peu plus réaliste, rajouter les morts $m(t)$ : $y'(t) = \beta xy - \gamma y - \delta y$ où $\delta y$ est le nombre de personnes infectées qui vont mourir (le nombre de morts naturelles est négligeable face à ce qui se passe avec la peste), et alors $m'(t) = \delta y$.
Pour les conditions initiales : $\gamma \approx 1$ et $\delta \approx 0$. Si la population est en bonne santé, $\beta \approx 0$.
La peste noire (1347-1351) a causé la mort d'au moins un tiers de la population européenne (25 millions de victimes).
Elle est toujours d'actualité. La peste est une des maladies bactériennes les plus dangereuses pour l'humanité, et est actuellement en recrudescence. Près de 30 000 cas de peste ont été déclarés depuis une dizaine d'années.
Les équations qui réglent le mouvement d'un pendule élastique, et la charge d'un condensateur dans un circuit RLC série, sont formellement analogues.
On peut passer de l'une à l'autre par simple changement de notation.
Dans un circuit RLC série, l'énergie électrique ne se conserve pas au cours du temps ; elle se dissipe par effet Joule dans la résistance.
De la même manière, l'énergie mécanique d'un oscillateur élastique ne se conserve pas au cours du temps : elle est dissipée par frottement de type fluide visqueux.
Des oscillations électriques ou mécaniques s'amortissent de ce fait.
Si l'on veut entretenir les oscillations, il faut un apport constant d'énergie pour compenser les pertes.
L'utilisation d'un circuit à amplificateur opérationnel permet de simuler un dipôle à résistance négative obéissant à la loi d'Ohm : $u=-R_N i$.
La résistance négative est l'élément capital qui permet d'entretenir, par apport d'énergie extérieure, les oscillations d'un système physique qui, sans elle, s'amortirait inévitablement.
La stabilisation des oscillations amorcées par une résistance négative exige dans le système des éléments non linéaires.
Dans le cas de simulation de résistance par un circuit à amplificateur opérationnel, c'est le phénomène de saturation en tension de sortie qui assure la non-linéarité indispensable à la stabilisation de l'oscillateur.
Le circuit à amplificateur opérationnel se comporte comme un puits de résistance négative, linéaire par morceaux.
Van der Pol eut l'idée d'approcher ce puits par une fonction parabolique :
$\left\{ \begin{array}{l} \frac{d^2 u}{d t^2} - \frac{w_0}{Q} \left( 1 - \frac{u^2}{A^2} \right) \frac{du}{dt} + w_0^2 u = 0\\ w_0^2 = \frac{1}{LC}, A=r i_0 \sqrt{\frac{R_0-r}{R_0}} \end{array} \right.$
Faire l'étude améliorée du système proies prédateurs : on retrouvera les graphes proposés précédement en utilisant pylab, et en reprogrammant les méthodes d'Euler et de Runge-Kutta.
Faire le même type d'étude quantitative pour la propagation de la peste et le modèle de Van der Pol.
Tenter une étude qualitative de ces problèmes.