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.