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 (1/5)

Imaginez que vous développez la nouvelle librairie de fonctions mathématiques de Python. Au départ, les seules opérations auxquelles vous avez le droit sont les opérations arithmétiques usuelles telles que + * / %. Notre but aujourd’hui est d’écrire la fonction qui calcule exe^x.

Pour cela, on utilise la définition de exe^x en tant que série (somme infinie) :

ex=n=0+xnn!=1+x+x22!+x33!++xnn!+e^x = \sum_{n=0}^{+\infty} \frac{x^n}{n!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} +\cdots+\frac{x^n}{n!}+\cdots

On remarque que l’on a besoin en particulier de calculer xnx^n ainsi que n!n!. Ce sera l’objet de la première partie. Dans la deuxième partie, on calculera une approximation de la fonction exponentielle en la tronquant à un nombre fixé de termes; par exemple : ex1+x22!+x33!e^x \simeq 1+\frac{x^2}{2!}+\frac{x^3}{3!}

La précision d’une telle approximation dépend beaucoup de la valeur de xx. Dans la partie 4 on utilisera une méthode adaptative : on fixera cette fois la précision relative souhaitée et on calculera autant de termes que nécessaire pour atteindre cette précision. Pour cela on aura préalablement défini -- et implanté ! -- dans la partie 3 ce que l’on entend par précision relative.

Partie 1 : fonctions puissance et factorielle

Le but de cette partie est d’écrire les fonctions factorielle et puissance et de vérifier que l’on obtient bien les résultats attendus. Complétez la fonction factorielle ci-dessous puis vérifiez les résultats des cellules suivantes :

def factorielle(n):
    """Factorielle
    @param n un entier positif ou nul
    @return la valeur n! en tant que nombre à virgule flottante (float)
    """
    ### BEGIN SOLUTION
    r = 1.0
    for i in range(1, n + 1):
        r *= i  # Rappel: c'est équivalent à r = r * i
    return r
    ### END SOLUTION
factorielle(5)
120.0
assert factorielle(0) == 1  # Par convention mathématique
assert factorielle(3) == 6
assert factorielle(4) == 24
assert factorielle(5) == 120
assert type(factorielle(0)) == float
### BEGIN HIDDEN TESTS
assert factorielle(8) == 40320
### END HIDDEN TESTS

Vérifiez l’ordre de grandeur du calcul suivant. Si la valeur est aberrante, vérifiez l’utilisation du type double à toutes les étapes du calcul.

factorielle(100)
9.33262154439441e+157

Complétez la fonction puissance ci-dessous, puis vérifiez les résultats des cellules suivantes :

def puissance(x, n):
    """Puissance
    @param x un nombre de type float
    @param n un entier positif ou nul
    @return le nombre x^n de type float
    """
    ### BEGIN SOLUTION
    r = 1
    for i in range(n):
        r *= x
    return r
    ### END SOLUTION
puissance(2, 4)
16
assert puissance(1, 10) == 1
assert puissance(2, 5) == 32
assert puissance(1.5, 3) == 3.375

Ajoutez des tests (toujours avec assert) pour vérifier les cas limites : vérifiez (pour une valeur de xx de votre choix) que x0x^0 vaut 1, que 0r0^r vaut 0 pour rr non nul, et que 00 vaut 1 :

### BEGIN SOLUTION
assert puissance(3, 0) == 1
assert puissance(0, 3) == 0
assert puissance(0, 0) == 1
### END SOLUTION

Bilan de la partie 1

Vous avez maintenant les prérequis pour implanter la fonction exponentielle. Vous pouvez maintenant passer à la partie 2.