Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TP : implanter la fonction exponentielle (2/5)

Partie 2 : calculer une somme infinie?

La définition mathématique de l’exponentielle suppose de calculer une somme infinie. Ce n’est pas possible en pratique! On propose donc d’implanter la fonction suivante qui calcule une approximation de la fonction exponentielle obtenue en tronquant la somme à un certain rang rr : exn=0rxnn!e^x \approx \sum_{n=0}^r \frac{x^n}{n!}

Copier-collez dans les deux cellules suivantes vos fonctions puissance et factorielle de la partie 1, puis complétez l’implantation de la fonction expRang et vérifiez qu’elle passe les tests fournis.

### BEGIN SOLUTION
def factorielle(n):
    r = 1
    for i in range(1, n + 1):  # (int i = 1; i <= n; i++) {
        r = i * r
    return r


### END SOLUTION
### BEGIN SOLUTION
def puissance(x, n):
    r = 1
    for i in range(n):  # (int i = 0; i < n; i++) {
        r = r * x
    return r


### END SOLUTION
def expRang(x, r):
    """Exponentielle tronquée à un certain rang r
    Paramètre x : un nombre à virgule flottante en double précision
    Paramètre r :  un nombre entier positif
    Renvoie 1 + x^1/1!  + x^2/2! + x^3/3! + ...  + x^r/r!
    """
    ### BEGIN SOLUTION
    e = 0
    for i in range(r + 1):  # (int i=0; i <= r; i++)
        e += puissance(x, i) / factorielle(i)
    return e
    ### END SOLUTION
expRang(5, 1)
6.0
assert expRang(6, 0) == 1  # 6^0/1
assert expRang(6, 1) == 7  # 6^0/1 + 6/1
assert expRang(6, 2) == 25  # 6^0/1 + 6/1 + 36/2
assert expRang(6, 3) == 61  # 6^0/1 + 6/1 + 36/2 + 36*6/6

Plus on augmente le rang, plus on se rapproche de la valeur de e6=403,429e^6=403,429\cdots.

Dans la cellule ci-dessous, utilisez votre fonction expRang pour calculer une approximation de e6e^{6} au rang 10, puis augmentez le rang jusqu’à ce que la valeur affichée ne change plus (la valeur ajoutée est trop petite pour changer l’affichage).

### BEGIN SOLUTION
expRang(6, 24)
### END SOLUTION
403.4287911175401

Calculez maintenant une approximation de la valeur de e10=22026,46e^{10}=22026,46\cdots avec le même rang :

### BEGIN SOLUTION
expRang(10, 22)
### END SOLUTION
22019.951758120904

Que constatez vous?

BEGIN SOLUTION

La précision est bien moins bonne que l’exemple de e6e^6 malgré l’utilisation du même rang. Le rang nécessaire pour obtenir une bonne précision dépend donc du réel xx pour lequel on veut calculer exe^x.

END SOLUTION

Augmentez le rang jusqu’à ce que la valeur affichée ne change plus :

### BEGIN SOLUTION
expRang(10, 32)
### END SOLUTION
22026.465632423035

Bilan de la partie 2

Bravo, vous avez implanté une approximation de la fonction exponentielle en tronquant sa formule à un certain rang. Cependant, au vu des exemples ci-dessus, l’utilisateur souhaiterait spécifier non pas le rang, mais la précision qu’il souhaite obtenir. Pour cela il faut d’abord formaliser cette idée de précision. C’est l’objet de la partie 3.