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 r = 1;
    for (int i = 1; i <= n; i++) {
        r = i*r;
    }
    return r;
}
/// 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 e = 0;
    for (int i=0; i <= r; i++) {
        e += puissance(x,i) / factorielle(i);
    }
    return e;
    /// END SOLUTION
}
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.