Licence CC BY-NC-ND

Introduction au problème

Dans ce tutoriel, nous allons nous fixer pour but de calculer numériquement n’importe quelle intégrale. Pour illustrer ce tutoriel, nous allons nous baser sur le calcul de l’intégrale de la fonction ff qui à xx associe ex2\mathrm{e}^{-x^2} sur l’intervalle [1,3][-1, 3]. Nous allons alors trouver des algorithmes permettant d’approcher le mieux possible la valeur de son intégrale.

Bien sûr, puisque nous ne connaissons pas la valeur de cette intégrale, nous ne pourrons pas vérifier que les algorithmes vus donnent bien le bon résultat. Nous allons alors les vérifier sur une autre intégrale, à savoir celle de la fonction cosinus sur l’intervalle [0,π][0, \pi].

Présentation du problème

Nous voulons calculer numériquement l’intégrale de ff, le problème étant que nous n’en connaissons pas de primitive explicite. La situation est mauvaise, et pour le moment, nous n’avons aucune idée de comment calculer cette intégrale.

Changeons d’aire

Pourtant, un simple changement de point de vue rend ce problème plus simple. Plaçons-nous d’un point de vue graphique en nous rappelant que l’intégrale d’une fonction correspond à l’aire sous sa courbe représentative. Ainsi, calculer l’intégrale d’une fonction revient à trouver la surface sous sa courbe représentative. La question qui vient alors est la suivante.

Comment calculer cette aire ?

Nous pourrions tourner en rond en disant qu’il s’agit de l’intégrale de la fonction associée à cette courbe, mais ce ne serait pas très productif…

Il nous faut ruser. Nous avons le graphe de la fonction à notre disposition, nous devrions alors être capable d’en tirer quelque chose et de calculer l’aire voulue. Bien sûr l’histoire n’est pas aussi simple et obtenir une valeur exacte de cette aire est compliqué.

Nous devrons nous contenter d’une valeur approchée de cette aire. Pour cela, nous allons approcher la courbe de notre fonction par la courbe d’une autre fonction, dont nous connaissons la valeur de l’aire. Dis comme ça, ça à l’air simple, mais encore faut-il savoir par quelle fonction nous allons l’approcher. Nous allons voir qu’il existe plusieurs manières de le faire. Certaines sont plus précises et permettent d’avoir une meilleure approximation en moins de calcul (bien sûr, tout cela dépend également de la forme de la fonction que l’on veut intégrer et de ce qu’on connaît d’elle).

Approximation de la courbe

Nous avons décidé d’approcher la courbe de notre fonction par la courbe d’une autre fonction dont nous connaissons l’intégrale. Il nous reste à trouver quelle fonction nous allons utiliser pour cela. Regardons la courbe représentative de la fonction, peut-être nous donnera-t-elle une idée.

La fonction f.
La fonction ff sur l’intervalle [1,3][-1, 3].

Trouver une fonction autre que ff dont la courbe approche suffisamment bien cette courbe semble compliqué. Là encore, il va nous falloir ruser.

Découpage de la fonction

Plutôt que de chercher une fonction qui approche ff sur tout l’intervalle, nous allons découper l’intervalle en plusieurs morceaux et approcher la fonction sur chacun des intervalles par une fonction différente. Le travail est alors plus facile.

Par exemple, pour intégrer ff de -1 à 3, on peut l’approcher par une fonction différente sur chaque intervalle de longueur 0,5. Le plus simple est de l’approcher par une fonction constante de manière à avoir à chaque fois l’aire d’un rectangle à calculer. On obtient alors cette approximation.

On essaie avec des rectangles ?
On essaie avec des rectangles ?

Quoi ? Mais ça n’approche pas bien du tout la courbe. Les aires seront beaucoup trop différentes.

C’est vrai que les deux courbes ne sont pas trop proches. Mais en diminuant la longueur des intervalles, les deux courbes sont de plus en plus proches, comme on peut le voir sur le graphe ci-dessous (en bleu la courbe représentative de la fonction et en vert les rectangles).

Là c’est déjà mieux.
Là c’est déjà mieux.

Calcul de l’aire

Il nous faut maintenant calculer l’aire approchée. On va séparer notre intervalle en 8 et calculer l’aire des 8 rectangles obtenus. On a  que la largeur de chaque rectangle est 3(1)8=0,5\frac{3 - (-1)}{8} = 0{,}5 . Il nous faut maintenant les hauteurs :

  • la hauteur du premier rectangle est f(1)f(-1) ;
  • la hauteur du deuxième rectangle est f(0,5)f(-0{,}5) ;
  • la hauteur du troisième rectangle est f(0)f(0).

En fait, la hauteur du kème rectangle est f(1+0,5k)f(-1 + 0{,}5 k). On additionne ces différentes aires.

Ik=080,5×f(1+0,5k)=0,5k=08f(1+0,5k).I \approx \sum_{k = 0}^{8} 0{,}5 \times f(-1 + 0{,}5 k) = 0{,}5 \sum_{k = 0}^{8} f(-1 + 0{,}5 k).

Le symbole \sum introduit ici est le symbole de la somme. k=08f(1+0,5k)\sum_{k = 0}^{8} f(-1 + 0{,}5 k) se lit comme « la somme pour kk allant de 0 à 10 des f(1+0,5k)f(-1 + 0{,}5k) », c’est-à-dire comme

f(1)+f(0,5)+f(0)++f(2,5)+f(3).f(-1) + f(-0{,}5) + f(0) + \ldots + f(2{,}5) + f(3).

Formalisation

Maintenant que nous avons une méthode, il ne nous reste plus qu’à la formaliser. Considérons alors les fonctions continues sur l’intervalle [a,b][a, b]. Cet intervalle étant un intervalle fermé borné, alors, d’après le théorème des bornes, l’image de [a,b][a, b] par ff est un intervalle fermé borné. Ceci nous assure que ff ne « parte pas vers l’infini » (pour ne pas avoir de rectangle d’aire infinie).

Certaines fonctions ont des limites infinies et leur intégrale est quand même finie (01ttdt\int_0^1 \frac{\sqrt{t}}{t} \mathrm{d}t par exemple) mais nous n’allons pas en tenir compte ici.

Une fois que ceci est assuré, nous pouvons appliquer la méthode que nous avons trouvée. Rappelons-nous qu’elle consiste à faire deux choses.

  1. Diviser l’intervalle [a,b][a, b] en nn petits intervalles de même longueur.
  2. Remplacer l’aire de ff sur ces intervalles par l’aire de petits rectangles.

Division de l’intervalle

Pour diviser [a,b][a, b] en intervalles, posons pour tout entier kk de [ ⁣[0,n] ⁣][\![0, n]\!],

xk=a+kban. x_k = a + k \frac{b - a}{n}.

On a ainsi une subdivision de notre intervalle. Les xkx_k sont les abscisses des points de cette subdivision.

Nommons un peu tout ce que nous venons d’utiliser :

  • nn est le nombres de tranches de la subdivision ;
  • δ=ban\delta = \frac{b - a}{n} est le pas de la subdivision (c’est la distance entre deux points).

Les xkx_k peuvent également être définis par récurrence :

{x0=ak[ ⁣[0,n1] ⁣],xk+1=xk+δ \left\{ \begin{aligned} &x_0 = a\\ &\forall k \in [\![ 0, n - 1]\!], x_{k + 1} = x_k + \delta \end{aligned} \right.

Calcul de l’intégrale

Maintenant que nous avons subdivisé notre intervalle, nous pouvons utiliser la relation de Chasles pour remarquer ceci :

I(f)=abf(t)dt=k=0n1xkxk+1f(t)dt. I(f) = \int_a^b f(t) \mathrm{d}t = \sum_{k = 0}^{n - 1} \int_{x_k}^{x_{k + 1}} f(t) \mathrm{d}t.

Il ne reste plus qu’à remplacer la fonction ff sur chacun des intervalles [xk,xk+1][x_k, x_{k + 1}] par une fonction gkg_k constante.

On obtiendra alors une approximation de I(f)I(f).

I(f)k=0n1xkxk+1gk(t)dt. I(f) \approx \sum_{k = 0}^{n - 1} \int_{x_k}^{x_{k + 1}} g_k(t) \mathrm{d}t.

Pour correspondre à la méthode que nous avons utilisée, il faut gk(x)=f(xk)g_k(x) = f(x_k). On a alors que l’aire de chaque rectangle est

Rk(f)=xkxk+1gk(t)dt=xkxk+1f(xk)dt. R_k(f) = \int_{x_k}^{x_{k + 1}} g_k(t) \mathrm{d}t = \int_{x_k}^{x_{k + 1}} f(x_k) \mathrm{d}t.

L’intégrale d’une constante sur un intervalle est cette constante multipliée par la longueur de l’intervalle, donc

Rk(f)=(xk+1xk)f(xk)=δf(xk). R_k(f) = (x_{k + 1} - x_k) f(x_k) = \delta f(x_k).

On peut maintenant passer à l’approximation de l’aire totale sous la courbe :

I(f)k=0n1Rk(x)=k=0n1δf(xk). I(f) \approx \sum_{k = 0}^{n - 1} R_k(x) = \sum_{k = 0}^{n - 1} \delta f(x_k).

On peut sortir la constante δ\delta de la somme et on obtient comme résultat final :

I(f)δk=0n1f(xk). \boxed{I(f) \approx \delta \sum_{k = 0}^{n - 1} f(x_k)}.

La méthode que nous venons de trouver porte un nom. Il s’agit de la méthode des rectangles qui consiste à remplacer la fonction ff sur chaque [xk,xk+1][x_k, x_{k + 1}] par une fonction constante. Notons qu nous aurions aussi pu choisir gk(x)=f(ki+1)g_k(x) = f(k_{i + 1}). On peut alors faire ces deux méthodes des rectangles :

  • la méthode des rectangles à gauchegk(x)=f(xk)g_k(x) = f(x_k) ;
  • la méthode des rectangles à droitegk(x)=f(xk+1)g_k(x) = f(x_{k + 1}).

La méthode des rectangles correspond aux sommes de Riemann qui peuvent être utilisées pour définir la notion d’intégration.

Algorithme et vérification

Maintenant que nous avons trouvé une formule, utilisons-la pour écrire un algorithme en Python. Écrivons la méthode des rectangles à gauche.

def rectangle(f, a, b, n):
    somme = 0
    pas = (b - a) / n
    x = a 
    for i in range(0, n): # On calcule la somme des f(x_i)
        somme += f(x)
        x += pas
    return somme * pas    # On retourne cette somme fois le pas     

Ici, rectangle prend en paramètre la fonction f à intégrer, les deux bornes d’intégration a et b et le nombre de tranches n à utiliser pour la subdivision.

Pour vérifier si notre algorithme fonctionne, utilisons le sur des fonctions dont nous connaissons l’intégrale. Par exemple,

0πcos(t)dt=[sin(xt)]0π=0.\int_0^\pi \cos(t) \mathrm{d}t = \left[ \sin(xt) \right]_0^\pi = 0.

On peut alors essayer de voir ce que donne rectangle(cos, 0, pi, 100). Diviser l’intervalle en 100 semble suffisant pour obtenir une bonne valeur. Nous obtenons 0,0314, associé à ce graphe.

La méthode des rectangles sur la fonction cosinus
La méthode des rectangles sur la fonction cosinus.

La méthode semble alors fonctionner. Mais ce petit test ne peut pas suffire à nous convaincre qu’elle donne des résultats satisfaisants dans tous les cas. Nous pouvons alors la tester sur d’autres fonctions pour voir ce qu’on obtient.


Reste à voir ce qu’elle donne sur notre exemple.

from math import exp

def f(x):
    return exp(-(x*x))

print(rectangle(f, 0, 1, 100))

On obtient environ 0,749979.