TP : implanter la fonction exponentielle (2/5)

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 \(r\) : \(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
double factorielle(int n) {
    double accululateur = 1;
    for (int i = 1; i <= n; i++) {
        accumulateur= i*accumulateur;
    }
    return accumulateur;
}
/// END SOLUTION
/// BEGIN SOLUTION
double puissance(double x, int n) {
    double r = 1;
    for(int i = 0; i < n; i++) {
        r = r*x;
    }
    return r;
}
/// END SOLUTION
/** Exponentielle tronquée à un certain rang r
 * @param x un nombre à virgule flottante en double précision
 * @param r un nombre entier positif
 * @return 1 + x^1/1!  + x^2/2! + x^3/3! + ...  + x^r/r!
**/
double expRang(double x, int r) {
    /// BEGIN SOLUTION
    double estimation = 0;
    for (int i=0; i <= r; i++) {
        estimation += puissance(x,i) / factorielle(i);
    }
    return estimation;
    /// END SOLUTION
}

Notes aux enseignants

Si expRang ne donne pas les résultats corrects alors qu’elle a l’air correcte, plusieurs possibilités :

  • Confusion de variables (factorielle(x) ou factorielle(r) au lieu de factorielle(k), etc.).

  • Fonction puissance ou fonction factorielle pas correcte (utilisation de double au lieu de int qui n’est pas faite assez proprement dans ces fonctions, ou problème avec les cas limites).

expRang(5,1)
CHECK( expRang(6, 0) == 1  ) // 6^0/1
CHECK( expRang(6, 1) == 7  ) // 6^0/1 + 6/1
CHECK( expRang(6, 2) == 25 ) // 6^0/1 + 6/1 + 36/2
CHECK( 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 \(e^6=403,429\cdots\).

Dans la cellule ci-dessous, calculez une approximation de la valeur de \(e^{6}\) et 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

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

/// BEGIN SOLUTION
expRang(10,22)
/// END SOLUTION

Que constatez vous?

BEGIN SOLUTION

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

END SOLUTION

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

/// BEGIN SOLUTION
expRang(10, 32)
/// END SOLUTION

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.