{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "6e5dbc477447644f93416cba679263ec", "grade": false, "grade_id": "cell-bf82401e988f816e", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "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`).\n", "\n", "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`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Nom: \n", "- Prénom: \n", "- Groupe: " ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "f8a34692aec384515aace23af6bbeb60", "grade": false, "grade_id": "cell-a1cea05ac1387514", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "# TP 4 - Implanter la fonction exponentielle\n", "\n", "**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$. \n", "\n", "Pour cela, on utilise la définition de $e^x$ en tant que *série* (somme infinie) :\n", "\n", "$$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$$" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "c053cd9fbabf8705c00115bbbdf4be20", "grade": false, "grade_id": "cell-670b85df3798f432", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "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:\n", "$$e^x \\approx 1+\\frac{x^2}{2!}+\\frac{x^3}{3!}$$\n", "\n", "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." ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "b592cd4c53ce02242cd961adfcb00560", "grade": false, "grade_id": "cell-8ce9f4aa74ff1ade", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "## Partie 1 : Fonctions puissance et factorielle\n", "\n", "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:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "cell_type": "code", "checksum": "3dd1504f2a31dae0097e54a53ab00048", "grade": false, "grade_id": "cell-26599ba8b0db5d2c", "locked": false, "schema_version": 3, "solution": true } }, "outputs": [], "source": [ "/** Factorielle\n", " * @param n un entier\n", " * @return la valeur n! en tant que double\n", "**/\n", "double factorielle(int n) {\n", " // VOTRE CODE ICI\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "factorielle(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "04a9c49dce103a52611615563d80118b", "grade": true, "grade_id": "cell-b141e2a8fe5b4d49", "locked": true, "points": 1, "schema_version": 3, "solution": false } }, "outputs": [], "source": [ "ASSERT( factorielle(0) == 1 ); // Par convention mathématique\n", "ASSERT( factorielle(3) == 6 );\n", "ASSERT( factorielle(4) == 24 );\n", "ASSERT( factorielle(5) == 120 );" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "7dc7058d48b8cda9768706ed7f4e2cb4", "grade": false, "grade_id": "cell-4034b50f9054165a", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "5baea162ffe9ed953e12e730886f2cce", "grade": false, "grade_id": "cell-248a410c27f82b9c", "locked": true, "schema_version": 3, "solution": false } }, "outputs": [], "source": [ "factorielle(100)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "6f4c65221e462b260f2478edb1994bbe", "grade": false, "grade_id": "cell-1a440314756d1d38", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "Compléter la fonction `puissance` ci-dessous:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "cell_type": "code", "checksum": "ffcfd173b84e127cea202faa83372989", "grade": false, "grade_id": "cell-98509d177b22e222", "locked": false, "schema_version": 3, "solution": true } }, "outputs": [], "source": [ "/** Puissance\n", " * @param x un nombre de type double\n", " * @param n un entier\n", " * @return le nombre x^n de type double\n", "**/\n", "double puissance(double x, int n) {\n", " // VOTRE CODE ICI\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "puissance(2, 4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "code", "checksum": "d50c372691279c57c3325e7e9043bdc3", "grade": true, "grade_id": "cell-0c4baef17dc81ab9", "locked": true, "points": 1, "schema_version": 3, "solution": false } }, "outputs": [], "source": [ "ASSERT( puissance(1, 10) == 1 );\n", "ASSERT( puissance(2, 5) == 32 );\n", "ASSERT( puissance(1.5, 3) == 3.375 );" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "dfaa98ee5a2982e89811f76e9949a41d", "grade": false, "grade_id": "cell-471123af8e648bfb", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "Ajouter des tests pour les cas limites: $x^0$, $0^r$, $0^0$:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "cell_type": "code", "checksum": "26f5d0fd04864ff97d1bc9a9a67019d1", "grade": false, "grade_id": "cell-a852e5dd3d8aeab1", "locked": false, "schema_version": 3, "solution": true } }, "outputs": [], "source": [ "// VOTRE CODE ICI" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "editable": false, "nbgrader": { "cell_type": "markdown", "checksum": "5ac0aec683426f4e7cd7a07a9e49c04d", "grade": false, "grade_id": "cell-b9ac4bd82bc4f381", "locked": true, "schema_version": 3, "solution": false } }, "source": [ "## Bilan de la partie 1\n", "Vous avez maintenant les prérequis pour implanter la fonction exponentielle.\n", "Vous pouvez maintenant passer à la [partie 2](feuille2-exponentielle2.ipynb)." ] } ], "metadata": { "kernelspec": { "display_name": "C++11", "language": "C++11", "name": "xcpp11" }, "language_info": { "codemirror_mode": "text/x-c++src", "file_extension": ".cpp", "mimetype": "text/x-c++src", "name": "c++", "version": "-std=c++11" } }, "nbformat": 4, "nbformat_minor": 2 }