Skip to content
Snippets Groups Projects
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: Python 3 (ipykernel)
  language: python
  name: python3

+++ {"nbgrader": {"grade": false, "grade_id": "cell-a7cb2ec64ca805b6", "locked": true, "schema_version": 3, "solution": false}}

TP : implanter la fonction exponentielle (2/5)

+++ {"nbgrader": {"grade": false, "grade_id": "cell-dfc454aa3b53f790", "locked": true, "schema_version": 3, "solution": false}}

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!}

+++ {"nbgrader": {"grade": false, "grade_id": "cell-b916e98c49f6f97c", "locked": true, "schema_version": 3, "solution": false}}

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.

---
nbgrader:
  grade: false
  grade_id: cell-ed4b87cdbd09b4b1
  locked: false
  schema_version: 3
  solution: true
---
### BEGIN SOLUTION
def factorielle(n):
    r = 1
    for i in range(1, n+1):# (int i = 1; i <= n; i++) {
        r = i*r
    return r
### END SOLUTION
---
nbgrader:
  grade: false
  grade_id: cell-40704048f0f43a58
  locked: false
  schema_version: 3
  solution: true
---
### BEGIN SOLUTION
def puissance(x, n):
    r = 1
    for i in range(n):#(int i = 0; i < n; i++) {
        r = r*x
    return r
### END SOLUTION
---
nbgrader:
  grade: false
  grade_id: cell-583ab182274bf121
  locked: false
  schema_version: 3
  solution: true
tags: []
---
def expRang(x, r):
    """ Exponentielle tronquée à un certain rang r
      Paramètre x : un nombre à virgule flottante en double précision
      Paramètre r :  un nombre entier positif
      Renvoie 1 + x^1/1!  + x^2/2! + x^3/3! + ...  + x^r/r!
    """
    ### BEGIN SOLUTION
    e = 0
    for i in range(r+1):#(int i=0; i <= r; i++) 
        e += puissance(x,i) / factorielle(i)
    return e
    ### END SOLUTION
expRang(5,1)
---
nbgrader:
  grade: true
  grade_id: cell-0841e8afc22ba740
  locked: true
  points: 1
  schema_version: 3
  solution: false
---
assert( expRang(6, 0) == 1  ) # 6^0/1
assert( expRang(6, 1) == 7  ) # 6^0/1 + 6/1
assert( expRang(6, 2) == 25 ) # 6^0/1 + 6/1 + 36/2
assert( expRang(6, 3) == 61 ) # 6^0/1 + 6/1 + 36/2 + 36*6/6

+++ {"nbgrader": {"grade": false, "grade_id": "cell-162792f03bec12d9", "locked": true, "schema_version": 3, "solution": false}}

Plus on augmente le rang, plus on se rapproche de la valeur de e^6=403,429\cdots.

Dans la cellule ci-dessous, utilisez votre fonction expRang pour calculer une approximation de e^{6} au rang 10, puis augmentez le rang jusqu'à ce que la valeur affichée ne change plus (la valeur ajoutée est trop petite pour changer l'affichage).

---
nbgrader:
  grade: false
  grade_id: cell-c845f3c8812b2ff5
  locked: false
  schema_version: 3
  solution: true
---
### BEGIN SOLUTION
expRang(6,24)
### END SOLUTION

+++ {"nbgrader": {"grade": false, "grade_id": "cell-b586c5b168fc5914", "locked": true, "schema_version": 3, "solution": false}}

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

---
nbgrader:
  grade: false
  grade_id: cell-586d52cbad6530df
  locked: false
  schema_version: 3
  solution: true
---
### BEGIN SOLUTION
expRang(10,22)
### END SOLUTION

+++ {"nbgrader": {"grade": true, "grade_id": "cell-6e01d081ee0b9bd2", "locked": false, "points": 1, "schema_version": 3, "solution": true}}

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

+++ {"nbgrader": {"grade": false, "grade_id": "cell-e1f369de58992c8b", "locked": true, "schema_version": 3, "solution": false}}

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

---
nbgrader:
  grade: false
  grade_id: cell-9ab12e4a0fe9cddb
  locked: false
  schema_version: 3
  solution: true
---
### BEGIN SOLUTION
expRang(10, 32)
### END SOLUTION

+++ {"nbgrader": {"grade": false, "grade_id": "cell-c9a5001fba7bb1a4", "locked": true, "schema_version": 3, "solution": false}}

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.