transfert

Dans cet article, on s’intéresse à une méthode d’approximation d’une intégrale grâce à Python, qui fait appel au théorème de transfert. Bien qu’elle soit hors programme, cette méthode a déjà été employée dans plusieurs sujets de concours. Il est donc intéressant de la connaître pour gagner du temps le jour J.

 

Principe de la méthode

L’idée de la méthode que je te présente est une utilisation détournée du théorème de transfert pour les variables à densité.

On se fixe une fonction \(f\) continue sur un intervalle \([a,b]\) (avec \(a<b\) réels). On cherche à obtenir une approximation de l’intégrale :
\[I=\int_a^bf(t)dt\]

On sait que si \(U\) est une variable aléatoire qui suit la loi uniforme sur \([a,b]\), alors une densité de \(U\) est la fonction :
\[t\mapsto\left\{\begin{array}{cl}\frac{1}{b-a}&\text{si }t\in[a,b] \\ 0&\text{sinon}\end{array}\right.\]

Donc, d’après le théorème de transfert, \(f(U)\) admet une espérance finie et \(E\big(f(U)\big)=\int_a^bf(t)\frac{1}{b-a}dt\). Autrement dit :
\[I=(b-a)E\big(f(U)\big)\]

Ce résultat est extrêmement intéressant pour nous. En effet, l’espérance d’une variable aléatoire se simule assez facilement en Python : il suffit de simuler \(f(U)\) un grand nombre de fois et de calculer la moyenne des simulations.

 

Quelques exemples

Exemple 1 : approximation de \(\pi\)

Un résultat classique d’analyse (qui se prouve grâce à un changement de variable, à toi de jouer !) permet d’affirmer :
\[\pi=\int_{-1}^1 2\sqrt{1-t^2}dt\]

La fonction \(f:t\mapsto 2\sqrt{1-t^2}\) est continue sur \([-1,1]\).

Donc, d’après le raisonnement précédent, si on prend \(U\) une variable aléatoire qui suit la loi uniforme sur \([-1,1]\), alors \(\pi=2E\big(f(U)\big)\).

On a aussi le résultat classique suivant : si \(V\) suit une loi uniforme sur \([0,1]\), alors la variable \(2V-1\) suit une loi uniforme sur \([-1,1]\).

Pour afficher une valeur approchée de \(\pi\), on peut donc utiliser le programme :

 

 

Exemple 2 : généralisation à certaines intégrales impropres

Pour approcher des intégrales impropres, la loi uniforme ne nous suffira pas, on va cette fois faire intervenir des variables dont le support sera \(\mathbb R_+\), ou \(\mathbb R\)…

Par exemple, on se propose d’approcher avec Python l’intégrale :
\[I=\int_0^{+\infty}\cos(t)e^{-t}dt\]

Soit \(X\) une variable qui suit la loi exponentielle de paramètre 1. Alors une densité de \(X\) est :
\[t\mapsto\left\{\begin{array}{cl}e^{-t}&\text{si }t\geq 0 \\ 0&\text{si }t<0\end{array}\right.\]

Et donc, par le théorème de transfert : \(I=E\big(\cos(X)\big)\).

On peut donc utiliser le programme suivant :

 

 

Exemple 3 : approximation d’une primitive

On peut également utiliser cette méthode pour approximer des intégrales de fonctions qui n’ont pas de primitive connue, pour justement tenter d’approcher une primitive.

Par exemple, considérons la fonction \(g:x\mapsto e^{-x^2}\). Cette fonction est continue sur \(\mathbb R\), elle admet donc des primitives, par exemple la fonction \(G:x\mapsto\int_0^xe^{-t^2}dt\)

Cependant, les maths montrent qu’on ne peut pas exprimer cette primitive avec les fonctions usuelles (exponentielle, sinus, cosinus, logarithme, etc).

D’où l’intérêt d’une fonction Python qui renverrait une valeur approchée de \(G(x)\) quel que soit le réel \(x\).

On va faire le raisonnement pour \(x\) positif. Lorsque \(x\) est négatif, le raisonnement est le même, mais il faut remplacer \([0,x]\) par \([x,0]\).

La fonction \(g\) est continue sur \([0,x]\), donc on peut appliquer le théorème de transfert : si \(U\) suit la loi uniforme sur \([0,x]\), on a :
\[G(x)=xE\big(g(U)\big)\]

De plus, si \(V\hookrightarrow\mathcal U([0,1])\) alors \(xV\hookrightarrow\mathcal U([0,x])\)

On peut donc utiliser la fonction Python G(x) suivante, qui renvoie une approximation de la valeur de la primitive \(G\) évaluée en \(x\) :

 

 

⚠️ Attention : cette fonction Python diffère des fonctions « classiques », en deux sens :

  • Premièrement, la valeur renvoyée reste une approximation. C’est pour cela que dans la partie suivante on se demande combien de simulations on doit faire pour avoir une bonne approximation.
  • Deuxièmement, comme elle utilise des simulations de variables aléatoires, elle ne renvoie jamais la même valeur (même si les valeurs renvoyées sont proches).

 

Comment obtenir une approximation aussi précise que l’on souhaite ?

Dans les exemples précédents, on a approché l’espérance en calculant la moyenne de 10 000 simulations. Cependant, bien que cette valeur soit « grande », on n’a aucune information sur la précision de l’approximation renvoyée. On pourrait donc avoir envie de chercher pour quelle valeur de \(n\), nombre de simulations effectuées, on pourrait avoir une approximation à \(\varepsilon\) près (avec \(\varepsilon\) quelconque dans \(\mathbb R_+^*\)), avec une probabilité d’au moins 99 % par exemple.

Ainsi, soit \((X_n)_{n\in\mathbb N^*}\) une suite de variables indépendantes suivant toutes la même loi que \(f(U)\).

On pose \(S_n=X_1+\cdots+X_n\).

On cherche donc \(n\) tel que :
\[P\left(\left|\frac{S_n}n-I\right|\geq\varepsilon\right)\leq 10^{-2}\quad\quad (*)\]

Or, d’après l’inégalité de Bienaymé-Tchebychev :
\[P\left(\left|\frac{S_n}n-I\right|\geq\varepsilon\right)\leq\frac{V\left(\frac{S_n}n\right)}{\varepsilon^2}=\frac{\frac1{n^2}V(S_n)}{\varepsilon^2}\]

Or, d’après le théorème des bornes atteintes, \(f\) est bornée sur \([a,b]\) et donc \(f(U)\) est bornée : elle admet donc une variance.

D’après la formule de König-Huygens et le théorème de transfert :
\[V(f(U))=\int_a^b(f(t))^2dt-\left(\int_a^bf(t)dt\right)^2\leq (b-a)\sup_{t\in[a,b]}\big(f(t)\big)^2\]

De plus, par indépendance des \((X_n)_{n\in\mathbb N^*}\), on a : \(V(X_1+\cdots+X_n)=V(X_1)+\cdots+V(X_n)=nV(f(U))\).

D’où :
\[P\left(\left|\frac{S_n}n-I\right|\geq\varepsilon\right)\leq\frac{(b-a)\sup_{[a,b]}f^2}{n\varepsilon^2}\]

Ainsi, pour que \((*)\) soit vérifiée, il suffit que \(\frac{(b-a)\sup_{[a,b]}f^2}{n\varepsilon^2}\leq 10^{-2}\), c’est-à-dire : \(n\geq\frac{100(b-a)\sup_{[a,b]}f^2}{\varepsilon^2}\).

Reprenons l’exemple 1 précédent pour voir comment tout ceci s’applique concrètement.

Pour \(a=-1\), \(b=1\) et \(f(t)=2\sqrt{1-t^2}\), on a \(\sup_{[a,b]}f^2=4\).

En prenant \(\varepsilon=10^{-2}\), pour que \((*)\) soit vérifiée, il suffit que \(n\geq 8\times 10^6\).

Autrement dit : pour avoir une approximation de \(\pi\) au centième près avec une probabilité d’au moins 99 %, il suffit de remplacer 10 000 par 8 000 000 dans le programme de l’exemple 1.

 

Conclusion

Pour conclure, faisons une liste de l’essentiel de ce que tu dois retenir dans cet article. Clairement, la dernière partie de cet article est un approfondissement, ça ne tombera pas aux concours ECG. En revanche, il faut que tu aies compris et que tu saches reproduire :

  • La méthode pour effectuer le passage de l’intégrale à l’espérance d’une variable du type \(f(U)\) : cf. exemple 1.
    Exercice. Quelles justifications mathématiques et quel programme Python écrirais-tu pour approcher l’intégrale \(\int_0^1\frac{dt}{1+t^3}\) ?
  • La généralisation dans l’exemple 2.
    Exercice. Quelles justifications mathématiques et quel programme Python écrirais-tu pour approcher l’intégrale \(\int_{-\infty}^{+\infty}e^{-x^4}dx\) ? Indication : loi normale…
  • Si tu souhaites encore t’entraîner, tu peux faire des sujets de concours qui manipulent cette méthode : par exemple le problème d’Ecricome 2008 et celui d’EDHEC 2017.

 

N’hésite pas à consulter toutes nos ressources mathématiques.