Avant de terminer cette feuille, assurez-vous que tout fonctionne comme voulu. Tout d'abord, redémarrez le noyau (dans le menu, sélectionner Kernel -> Restart
) puis exécutez toutes les cellules (dans le menu, sélectionner Cell -> Run All
).
Vérifiez que vous avez édité la cellule ci-dessous, ainsi que toutes les cellules marquées avec VOTRE CODE ICI
ou VOTRE RÉPONSE ICI
.
Imaginez que vous développez la nouvelle librairie de fonctions mathématiques du C++
. 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 $e^x$.
Pour cela, on utilise la définition de $e^x$ en tant que série (somme infinie) :
$$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 $x^n$ ainsi que $n!$. Ce sera l'objet de la première partie. Dans la partie 2, on calculera une approximation de la fonction exponnentielle en la tronquant à un nombre de terme fixé; par exemple: $$e^x \approx 1+\frac{x^2}{2!}+\frac{x^3}{3!}$$
La précision d'une telle approximation dépend beaucoup de la valeur de $x$. 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.
Le but de cette partie est d'écrire les fonctions factorielle
et puissance
(vues en TD) et de vérifier que l'on obtient bien les résultats attendus. Compléter la fonction factorielle
ci-dessous puis vérifiez les résultats des cellules suivantes:
/** Factorielle
* @param n un entier
* @return la valeur n! en tant que double
**/
double factorielle(int n) {
// VOTRE CODE ICI
}
factorielle(5)
ASSERT( factorielle(0) == 1 ); // Par convention mathématique
ASSERT( factorielle(3) == 6 );
ASSERT( factorielle(4) == 24 );
ASSERT( factorielle(5) == 120 );
Vérifier l'ordre de grandeur du calcul suivant. Si la valeur est aberrante vérifier l'utilisation du type double
à toutes les étapes du calcul.
factorielle(100)
Compléter la fonction puissance
ci-dessous:
/** Puissance
* @param x un nombre de type double
* @param n un entier
* @return le nombre x^n de type double
**/
double puissance(double x, int n) {
// VOTRE CODE ICI
}
puissance(2, 4)
ASSERT( puissance(1, 10) == 1 );
ASSERT( puissance(2, 5) == 32 );
ASSERT( puissance(1.5, 3) == 3.375 );
Ajouter des tests pour les cas limites: $x^0$, $0^r$, $0^0$:
// VOTRE CODE ICI