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 .
Pour cela, on utilise la définition de en tant que série (somme infinie) :
On remarque que l’on a besoin en particulier de calculer ainsi que . 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 :
La précision d’une telle approximation dépend beaucoup de la valeur de . 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 :
Indication
Utilisez une boucle for avec un compteur et un
accumulateur: initialisez l’accumulateur à
1.0, puis comptez de 1 à 10 en multipliant à chaque fois l’accumulateur par la
valeur du compteur.
Rappel : si vous le souhaitez, vous pouvez utiliser le raccourci r *= i pour
r = r * i.
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 SOLUTIONfactorielle(5)120.0assert 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 TESTSVé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+157Complé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 SOLUTIONpuissance(2, 4)16assert puissance(1, 10) == 1
assert puissance(2, 5) == 32
assert puissance(1.5, 3) == 3.375Ajoutez des tests (toujours avec assert) pour vérifier les cas limites : vérifiez (pour
une valeur de de votre choix) que vaut 1, que vaut 0 pour 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 SOLUTIONBilan de la partie 1¶
Vous avez maintenant les prérequis pour implanter la fonction exponentielle. Vous pouvez maintenant passer à la partie 2.