Connectez-vous pour consulter le corrigé.
MODÉLISATION MATHÉMATIQUE ET INFORMATIQUE
Durée : 3 heures
Sujet du concours Agro-Véto 2025 (concours A BCPST).
L’usage d’une calculatrice est autorisé pour cette épreuve.
Si, au cours de l’épreuve, une candidate ou un candidat repère ce qui lui semble être une erreur d’énoncé, elle ou il le signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives prises.
Le sujet se compose d’un problème en trois parties portant sur la modélisation de l’expression génétique bactérienne. La première partie présente une première approche déterministe. La seconde partie propose une seconde façon de modéliser cette situation, en utilisant une approche probabiliste et un algorithme appelé l’algorithme de Gillespie. La troisième partie fait le lien entre ces deux approches.
Les parties 1 et 2 sont parfaitement indépendantes. La partie 3 dépend des deux premières. Les résultats des deux premières parties pourront être admis pour traiter la partie 3.
Les questions 15, 16, 20, 21, 23 et 24 sont des questions algorithmiques utilisant le langage Python. Un rappel de certaines fonctions Python est donné en annexe.
MODÉLISATION DE L’EXPRESSION GÉNÉTIQUE BACTÉRIENNE
On notera \(\mathscr{E}(\lambda)\) la loi exponentielle de paramètre \(\lambda>0\) c’est-à-dire la loi de la variable aléatoire de densité
\[\begin{array}{rccl} f_\lambda : & \left[0,+\infty\right[ & \longrightarrow & \mathbb{R}\\ & x & \longmapsto & \lambda\exp(-\lambda x) \end{array}\]
Nous proposons ici deux manières de modéliser l’expression génétique bactérienne chez Escherichia coli, une famille de bactéries naturellement présente dans les intestins mais responsable de nombreuses infections humaines. Pour rappel à la première étape de l’expression génétique, l’ADN est transcrit en ARN messager sans dégradation de l’ADN. L’ARN messager devient ensuite accessible aux ribosomes qui s’y lient afin de former des protéines. Ce processus est appelé la traduction, il s’effectue sans dégradation de l’ARN messager. L’ARN messager et les protéines peuvent enfin être dégradés.
On modélise le phénomène d’expression génétique par le schéma suivant où sont notés les flux :
Les quantités seront exprimées en picogrammes et les constantes \(a\), \(b\), \(c\) et \(d\) seront strictement positives.
\(m(t)\) correspond à la quantité d’ARN messager
\(p(t)\) correspond à la quantité de protéine
\(a\) correspond au flux constant de la réaction de transcription
\(b\) correspond à la constante de vitesse de la réaction de traduction de l’ARN messager en protéine
\(c\) correspond à la constante de vitesse de la réaction de dégradation de l’ARN messager
\(d\) correspond à la constante de vitesse de la réaction de dégradation de la protéine
On s’intéressera ici au cas particulier d’une protéine répressive, ou protéine Rep, une protéine-clé dans la régulation de la duplication cellulaire (mitose) et donc dans la survie de la population bactérienne. On supposera que la mitose n’est possible que si la quantité de protéine Rep dépasse une valeur seuil \(p^\ast\) et pourra être compromise par l’ajout d’un antibiotique bactériostatique dans le milieu (Sous-Partie 3.1).
Dans tout le sujet le temps est continu, exprimé en seconde et sera noté \(t\).
Dans cette partie on supposera que les quantités d’ARN messager \(m\) et de protéine \(p\) sont des fonctions \(\mathscr{C}^1\) du temps \(t\in\mathbb{R}_+\). On notera \(m_0=m(0)\) et \(p_0=p(0)\) les conditions initiales. La situation peut alors être modélisée par le système suivant : \[\tag{1} \left\{\begin{aligned} \frac{dm}{dt} &= a-cm\\[0.6em] \frac{dp}{dt} &= bm-dp \end{aligned}\right.\] On supposera enfin que \(c\neq d\).
Quelles sont les unités des constantes \(a\), \(c\), \(b\) et \(d\) ?
Interpréter qualitativement ce qu’il se passe si on augmente la constante \(c\).
On admettra que la forme générale des solutions est : \[\tag{2} m(t)=\left(m_0-\frac{a}{c}\right)\mathrm{e}^{-ct}+\frac{a}{c}\] et \[\tag{3} p(t)=\left(p_0-\frac{b\left(m_0-\frac{a}{c}\right)}{d-c}-\frac{ab}{cd}\right)\mathrm{e}^{-dt}+\frac{b\left(m_0-\frac{a}{c}\right)}{d-c}\mathrm{e}^{-ct}+\frac{ab}{cd}\]
Calculer la limite \(m_\infty\) de \(m(t)\) quand le temps \(t\) tend vers l’infini.
Calculer l’équation de la tangente à la courbe représentative de \(m\) en zéro.
Tracer l’allure de la fonction \(m\) sur \(\left[0,+\infty\right[\) dans le cas où \(m_0>\frac{a}{c}\) et dans le cas où \(m_0<\frac{a}{c}\).
Calculer la limite \(p_\infty\) de \(p(t)\) quand le temps \(t\) tend vers l’infini et interpréter cette quantité.
Supposons le rapport \(a/d\) constant. Décrire le comportement de \(p_\infty\) en fonction de la valeur du rapport \(b/d\) et interpréter.
Supposons le rapport \(b/d\) constant. Décrire le comportement de \(p_\infty\) en fonction de la valeur du rapport \(a/c\) et interpréter.
Dans cette sous-partie nous prendrons les valeurs numériques suivantes : \[b=1\ ;\ c=1\ ;\ d=2\] et nous proposons une méthode de résolution du système (1), c’est-à-dire de retrouver les fonctions données en (2) et (3), en utilisant un changement de base.
Soit \(\vec{x}(t)=\begin{pmatrix}m(t)\\ p(t)\end{pmatrix}\). Justifier que le système (1) s’écrit sous la forme : \[\tag{4} \frac{d\vec{x}}{dt}=A\vec{x}+B\] avec \(A=\begin{pmatrix}-1 & 0\\ 1 & -2\end{pmatrix}\) et \(B=\begin{pmatrix}a\\ 0\end{pmatrix}\).
Justifier que la matrice \(A\) est diagonalisable et donner ses valeurs propres \(\lambda_1\) et \(\lambda_2\) ainsi que deux vecteurs propres associés dont la coordonnée sur la deuxième composante vaut \(1\).
En déduire une matrice \(P\) inversible telle que : \[\tag{5} A=P\begin{pmatrix}\lambda_1 & 0\\ 0 & \lambda_2\end{pmatrix}P^{-1}\]
Calculer \(P^{-1}\).
Soit \(\vec{z}=\begin{pmatrix}z_1\\ z_2\end{pmatrix}=P^{-1}\vec{x}\). Montrer que \(\vec{z}=\begin{pmatrix}m(t)\\ -m(t)+p(t)\end{pmatrix}\). En déduire que \(\vec{z}\) vérifie le système différentiel suivant : \[\tag{6} \left\{\begin{aligned} \frac{dz_1}{dt} &= -z_1+a\\[0.6em] \frac{dz_2}{dt} &= -2z_2-a \end{aligned}\right.\]
Résoudre chacune des équations du système (6).
Montrer que \(\vec{x}=\begin{pmatrix}z_1\\ z_1+z_2\end{pmatrix}\). En déduire que : \[\tag{7} \left\{\begin{aligned} m(t) &= \left(m_0-a\right)\mathrm{e}^{-t}+a\\ p(t) &= \left(m_0-a\right)\mathrm{e}^{-t}+\left(p_0-m_0+\frac{a}{2}\right)\mathrm{e}^{-2t}+\frac{a}{2} \end{aligned}\right.\]
Par quelle autre méthode aurait-on pu résoudre le système (1) ?
Dans cette partie on ne modélisera plus les quantités d’ARNm et de protéines par des fonctions continues du temps mais comme des variables aléatoires \(M_t\) et \(P_t\) dépendant du temps et prenant leurs valeurs dans l’ensemble des entiers \(\mathbb{N}\). Le flux d’ADN est toujours constant et on le supposera dorénavant entier et strictement positif : \(a\in\mathbb{N}^\ast\). On supposera également qu’il existe une suite de variables aléatoire \(T_1\),\(T_2\)… modélisant des instants telle que :
La suite \((T_k)_{k\in\mathbb{N}}\) est strictement croissante : \(T_1<T_2<\dots\)
Aucune réaction n’a lieu aux temps \(t\in\left]T_{k-1},T_k\right[\) pour tout \(k\in\mathbb{N}^\ast\).
Une (unique) réaction a lieu à chaque instant \(T_k\),\(k\in\mathbb{N}\) parmi les réactions suivantes :
\(A\) : « Transcription d’un brin d’ADN »
\(B\) : « Traduction d’un brin d’ARNm »
\(C\) : « Dégradation d’un brin d’ARNm »
\(D\) : « Dégradation d’une protéine »
Exemple : supposons que sur une expérience où \(m_0=5\) et \(p_0=10\) on ait obtenu les réactions suivantes :
| Temps (seconde) | \(42\) | \(55\) | \(77\) | \(79\) | \(100\) | \(126\) | \(138\) | \(151\) | \(188\) |
| Réaction | \(A\) | \(B\) | \(A\) | \(C\) | \(C\) | \(A\) | \(B\) | \(D\) | \(A\) |
Quelle quantité d’ARNm et de protéine a-t-on après 3 minutes ?
Représenter entre les instants \(t=0\) et \(t=200s\) l’évolution des fonctions \(t\mapsto M_t\) et \(t\mapsto P_t\) pour cette expérience-ci. Ces courbes sont appelées des trajectoires.
Exprimer \(M_{T_k}\) en fonction de \(M_{T_{k-1}}\) et \(P_{T_k}\) en fonction de \(P_{T_{k-1}}\) si la réaction ayant lieu à l’instant \(T_k\) est \(A\), \(B\), \(C\) puis \(D\).
Avertissement : Dans toute cette partie les fonctions Python demandées seront supposées précédées des lignes suivantes qui définissent les valeurs des paramètres du modèle et des conditions initiales pour les applications numériques, qu’il ne sera pas nécessaire de rappeler par la suite.
from random import random m0 = 80 p0 = 20 a = 2 b = 1 c = 1 d = 3
On définit le taux de réaction à l’instant \(t\) de la façon suivante : \[\tag{8} R_t=a+(b+c)M_t+dP_t\]
On suppose alors qu’à chaque instant \(T_k\), \(k\in\mathbb{N}\) la réaction ayant lieu est choisie parmi \(A\),\(B\),\(C\) ou \(D\) avec les probabilités suivantes : \begin{align*} \mathbb{P}(A) &= \frac{a}{R_t} \tag{9}\\ \mathbb{P}(B) &= \frac{bM_t}{R_t} \tag{10}\\ \mathbb{P}(C) &= \frac{cM_t}{R_t} \tag{11}\\ \mathbb{P}(D) &= \frac{dP_t}{R_t} \tag{12} \end{align*}
Proposer une interprétation pour le taux de réaction \(R_t\).
Comment évolue la probabilité de l’ évènement \(B\) lorsque \(M_t\) augmente à \(P_t\) constant ? Expliquer qualitativement ce qu’il se passe.
L’objectif de cette question est d’écrire une fonction Python qui permet de simuler une variable aléatoire \(X\) suivant une loi discrète à support fini \(\left\lbrace a_0,\cdots,a_{I-1}\right\rbrace\) avec \(I\in\mathbb{N}^\ast\). Pour tout \(i\in\left[\kern-0.15em\left[ {0,I-1} \right]\kern-0.15em\right]\) on notera :
\(\displaystyle\mathbb{P}(X=a_i)=p_i\) avec \(\displaystyle\sum_{i=0}^{I-1}p_i=1\).
La fonction mystere simule une réalisation d’une
variable aléatoire, laquelle ?
def mystere(p) :
X = random()
if X >= 1-p :
return 1
else:
return 0Soit U une variable aléatoire suivant une loi uniforme sur \([0,1]\). Montrer que pour tout \(i\in\left[\kern-0.15em\left[ {0,I-1} \right]\kern-0.15em\right]\) on a : \[\tag{13} \mathbb{P}(X=a_i)=\mathbb{P}\left(U\in\left[\sum_{j=0}^ip_j,\sum_{j=0}^{i+1}p_j\right]\right)\] Comment généraliser la stratégie de simulation de la question précédente au cas d’une loi discrète à support fini de taille \(I\) quelconque ? On pourra accompagner la réponse d’un schéma explicatif.
Compléter la fonction suivante qui recevra en paramètre d’entrée
une liste liste_p contenant \(I\) probabilités \(p_i\) et qui doit renvoyer le numéro \(i\in\left[\kern-0.15em\left[ {0,I-1}
\right]\kern-0.15em\right]\) de l’événement tiré au hasard.
def loi_discrete_finie(liste_p):
I = len(liste_p)
X = random()
pcumul = 0
for i in range(I) :
pcumul = ???
if ??? :
return ???En déduire une fonction Python reaction, prenant en
entrée deux arguments Mt et Pt, tirant
aléatoirement un évènement parmi \(A\),
\(B\), \(C\), \(D\)
et qui renvoie le caractère correspondant (’A’,
’B’, ’C’ ou ’D’).
Soit \(k\in\mathbb{N}^\ast\). Supposons que \(k-1\) réactions aient eu lieu et notons \(t_{k-1}\) l’instant où a eu lieu la \((k-1)\)-ième réaction et \(r_{t_{k-1}}\) le taux de réaction associé.
On pose \(\Delta_k=T_k-t_{k-1}\) la variable aléatoire de la durée avant la réaction suivante. On supposera que \(\Delta_k\) suit une loi exponentielle de paramètre \(r_{t_{k-1}}\) : \[\tag{14} \Delta_k=T_k-t_{k-1}\sim\mathscr{E}\left(r_{t_{k-1}}\right)\] et que les \(\Delta_k\) sont indépendantes.
Montrer que pour tout \(t,s>0\) l’équation suivante est vérifiée : \[\tag{15} \mathbb{P}_{\Delta_k>t}\left(\Delta_k\geqslant t+s\right)=\mathbb{P}\left(\Delta_k\geqslant s\right)\]
Justifier le choix de modéliser cette situation par une loi exponentielle.
Donner (sans calcul) l’espérance de \(\Delta_k\) et justifier le choix dans cette modélisation de choisir \(r_{t_{k-1}}\) comme paramètre.
Soit \(\mu>0\). Soit \(U\) une variable aléatoire de loi uniforme sur \([0,1]\) et soit \(\Delta=-\dfrac{\ln(U)}{\mu}\). Montrer que \(\Delta\) suit la loi exponentielle de paramètre \(\mu\) : \(\Delta\sim\mathscr{E}(\mu)\). On pourra calculer la fonction de répartition de \(\Delta\).
Écrire une fonction Python duree qui permet de
simuler le temps entre deux réactions qui suit une loi exponentielle de
paramètre \(R_t\). Cette fonction
prendra en paramètres d’entrée les valeurs Mt et Pt de
\(M_t\) et \(P_t\). On pourra utiliser la fonction
random() de l’annexe.
Cette partie réutilise les fonctions reaction et
duree des Sous-Parties 2.2 et
2.3 respectivement ainsi que le résultat de la question
12. On pourra admettre ces résultats.
Nous proposons de simuler une trajectoire de \(M_t\) et de \(P_t\) via l’algorithme suivant, dit de Gillespie :
Entrée : t_max
Initialiser une liste liste_T pour stocker les
instants des réactions, initialisée à \([0]\)
Créer deux listes liste_M et liste_P
initialisées à \([m_0]\) et \([p_0]\) respectivement
Tant que le temps ne dépasse pas t_max :
1. Simuler le temps avant la prochaine réaction
via la fonction duree
2. Stocker le dernier instant de réaction dans
la liste liste_T
3. Tirer aléatoirement une réaction parmi \(A\), \(B\), \(C\)
et \(D\) via la fonction
reaction
4. Réactualiser liste_M et
liste_P en fonction de la réaction tirée
précédemment
Modifier les différentes listes de sorte que le dernier instant
coïncide avec t_max.
Sortie :
[liste_T, liste_M et liste_P]
Compléter la fonction trajectoire suivante qui met
en œuvre l’algorithme de Gillespie et préciser à quoi
servent les lignes 24, 25 et 26.
def trajectoire(tmax):
liste_T = [0]
liste_M = [m0]
liste_P = [p0]
i = 0
while ...
Delta = ...
liste_T.append( ... )
typeR = ...
if typeR=='A' :
...
...
elif typeR=='B' :
...
...
elif typeR=='C' :
...
...
else :
...
...
i = i+1
liste_T[i] = tmax
liste_M[i] = liste_M[i-1]
liste_P[i] = liste_P[i-1]
return [liste_T,liste_M,liste_P]Dans cette partie nous continuerons de noter \(m\) et \(p\) les solutions du système déterministe (1) pour les conditions initiales fixées ainsi que \(m_\infty\) et \(p_\infty\) leur valeur limite quand \(t\) tend vers l’infini. Nous supposerons également qu’il existe \(n\) trajectoires indépendantes associées au modèle de la Partie 2 avec \(n\in\mathbb{N}^\ast\), chacune de ces trajectoires correspondant à l’évolution de la quantité d’ARN et de protéine d’une cellule bactérienne. Pour tout \(i\in\left\lbrace 1,\dots,n\right\rbrace\) on notera \(M_t^{(i)}\) et \(P_t^{(i)}\) les valeurs de la \(i\)-ème trajectoire au temps \(t\in\mathbb{R}_+\).
L’objectif des questions suivantes est de calculer les moyennes empiriques des trajectoires définies par \begin{align*} \overline{M_t} &= \frac{1}{n}\sum_{i=1}^nM_t^{(i)} \tag{16}\\ \overline{P_t} &= \frac{1}{n}\sum_{i=1}^nP_t^{(i)} \tag{17} \end{align*} pour tout \(t\in\mathbb{R}_+\) puis d’étudier leurs propriétés.
En utilisant un schéma, expliquer quelle est la difficulté de
faire les moyennes entre deux trajectoires tirées aléatoirement par la
fonction trajectoire.
Voici une fonction aligne. On suppose que dans les
listes d’instants croissants contenus dans liste_T1 et
liste_T2, le premier instant est le même ainsi que le
dernier instant.
def aligne(liste_T1,liste_M1,liste_P1,liste_T2,liste_M2,liste_P2):
i1 = 0
i2 = 0
liste_Ta = [ ]
liste_M1a = [ ]
liste_P1a = [ ]
liste_M2a = [ ]
liste_P2a = [ ]
while (i1<len(liste_T1)) and (i2<len(liste_T2)) :
if liste_T1[i1]<liste_T2[i2] :
liste_Ta.append(liste_T1[i1])
liste_M1a.append(liste_M1[i1])
liste_P1a.append(liste_P1[i1])
liste_M2a.append(liste_M2[i2-1])
liste_P2a.append(liste_P2[i2-1])
i1 = i1+1
elif liste_T1[i1]>liste_T2[i2] :
liste_Ta.append(liste_T2[i2])
liste_M1a.append(liste_M1[i1-1])
liste_P1a.append(liste_P1[i1-1])
liste_M2a.append(liste_M2[i2])
liste_P2a.append(liste_P2[i2])
i2 = i2+1
else :
liste_Ta.append(liste_T1[i1])
liste_M1a.append(liste_M1[i1])
liste_P1a.append(liste_P1[i1])
liste_M2a.append(liste_M2[i2])
liste_P2a.append(liste_P2[i2])
i1 = i1+1
i2 = i2+1
return [liste_Ta,liste_M1a,liste_P1a,liste_M2a,liste_P2a]
Que fait la partie comprise entre les lignes 10 et 16 de la
fonction aligne. ?
Que fait la partie comprise entre les lignes 24 et 29 fonction
aligne ? A quel moment est-on certain qu’elle est
exécutée ?
En déduire ce que renvoie la fonction
aligne
Soit la fonction suivante moyennes, incomplète,
censée calculer les moyennes pour \(n\)
trajectoires.
-0.9cm-0.9cm
def moyennes(tmax,n):
for i in range(n):
[liste_T,liste_M,liste_P] = trajectoire(tmax)
if i==0:
nbmoy = 1
Tmoy = liste_T
Mmoy = liste_M
Pmoy = liste_P
else:
[Tmoy,Mmoy,Pmoy,liste_M,liste_P]=aligne(Tmoy,Mmoy,Pmoy,liste_T,liste_M,liste_P)
for i in range(len(Tmoy)):
Mmoy[i] = ...
Pmoy[i] = ...
nbmoy = nbmoy+1
return [Tmoy,Mmoy,Pmoy]
Compléter les lignes 12 et 13 de la fonction
moyennes.
On supposera admis que pour tout \(i\in\mathbb{N}\) : \begin{align*} \mathbb{E}\left[P_t^{(i)}\right] &= p(t) \tag{18}\\ \mathbb{V}\left[P_t^{(i)}\right] &= \sigma^2 \tag{19} \end{align*} avec \(\sigma^2>0\). Interpréter ces égalités. Comment s’interprète une valeur élevée de \(\sigma\) dans ce contexte ?
Calculer l’espérance et la variance de \(\overline{P_t}\) et sa limite quand \(n\) tend vers l’infini et interpréter les résultats en faisant le lien avec la Partie 1. Illustrer graphiquement la différence entre une valeur élevée de \(\sigma\) et une valeur de \(\sigma\) proche de \(0\).
On suppose que, pour une cellule bactérienne donnée, la capacité de la cellule à se reproduire dépend de la quantité de protéine Rep générée qui doit être supérieure à un seuil \(p^\ast\). On supposera également que l’extinction de la population de taille \(n\) est assurée lorsque aucune cellule n’arrive à assurer une quantité de protéine supérieure à \(p^\ast\) à un certain temps.
On supposera enfin que l’ajout d’un antibiotique bactériostatique peut se modéliser par le remplacement du flux \(a\) par \(a\mathrm{e}^{-\theta}\), \(\theta\) étant la quantité d’antibiotique administrée qui est strictement positive.
On se placera dans le cas où \(d<c/2\) et on admettra que dans ce cas la fonction \(p\) est croissante.
Expliquer qualitativement comment le comportement du système est modifié lorsque l’antibiotique est ajouté. Que se passe-t-il intuitement lorsque \(\theta\) tend vers \(+\infty\) ?
On supposera que le seuil \(p^\ast\) coïncide avec la valeur limite \(p^\ast=\lim_{t\to\infty}p(t)\) (question (4)) d’une situation standard, c’est-à-dire sans l’ajout d’antiobiotique. On notera \(p_\infty\) la valeur limite de la situation avec antibiotique. Justifier que : \[\tag{20} p^\ast-p_\infty=\frac{ab\left(1-\mathrm{e}^{-\theta}\right)}{cd}\]
Justifier l’inégalité suivante pour tout \(i\in\mathbb{N}^\ast\) : \[\tag{21} \mathbb{P}\left(\left| P_t^{(i)}-p(t) \right|\geqslant p^\ast-p(t)\right)\leqslant\frac{\sigma^2}{\left(p^\ast-p(t)\right)^2}\] puis \[\tag{22} \mathbb{P}\left(P_t^{(i)}-p(t)\geqslant p^\ast-p(t)\right)\leqslant\frac{\sigma^2}{\left(p^\ast-p(t)\right)^2}\]
En déduire : \[\tag{23} \mathbb{P}\left(P_t^{(i)}-p(t)\geqslant p^\ast-p(t)\right)\leqslant\left(\frac{\sigma cd}{ab\left(1-\mathrm{e}^{-\theta}\right)}\right)^2\]
Montrer l’inégalité suivante : \[\tag{24} \mathbb{P}\left(\text{Extinction}\right)\geqslant\left(1-\left(\frac{\sigma cd}{ab\left(1-\mathrm{e}^{-\theta}\right)}\right)^2\right)^n\]
Comment se comporte le terme de droite quand \(\theta\) tend vers \(+\infty\) ?
Que dire de la probabilité d’extinction de la population de bactéries en fonction de \(\sigma\) ? A votre avis pourquoi ne retrouve-t-on pas l’hypothèse de la question 27. ? Donner une interprétation biologique au terme \(\sigma\).
Sont utiles pour ce sujet :
from random import random x = random()
La fonction random renvoie un tirage pseudo-aléatoire
d’une loi uniforme sur \([0,1]\)
import numpy as np b = np.log(a) d = np.exp(c)
Les fonctions log et exp renvoient
respectivement le logarithme népérien et l’exponentielle.
FIN DU SUJET
Le corrigé pas à pas, les aides et les explications sont disponibles dans la plateforme.
Expression génétique bactérienne : système différentiel diagonalisé, loi exponentielle et algorithme de Gillespie en Python.