Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 26-02-2020 16:43:43

Cédrix
Membre
Inscription : 15-08-2019
Messages : 21

algorithme Python d'approximation de e

Bonjour,
pourquoi ce script Python ne fonctionne-t-il pas si je tape par exemple precision(2) pour avoir une valeur approchée de e à 0,01 près par la somme des factorielles ?
(Problème de float et fonction ???).
Merci de votre aide.
C.
from math import factorial
from math import e
def e(n):
    e=1
    for k in range(1,n+1):
        e=e+1/factorial(k)
    return e
def precision(p):
    n=1
    while abs(e(n)-e)>10**(-p):
        n=n+1
    return n,e(n)

Hors ligne

#2 26-02-2020 17:45:22

Maenwe
Membre confirmé
Inscription : 06-09-2019
Messages : 356

Re : algorithme Python d'approximation de e

Bonjour,
Tout ce que tu as écris est parfait à une exception près, le nom d'une de tes fonctions ... Vois tu laquelle, pourquoi, et comment corriger le tire ?

Dernière modification par Maenwe (26-02-2020 18:38:39)

Hors ligne

#3 26-02-2020 18:42:05

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 14 515

Re : algorithme Python d'approximation de e

Salut,

Plusieurs éléments à pointer du doigt.
1. Tu importes e, la valeur de l'exponentielle. J'ignorais que e était importable tel quel. J'avais toujours importé exp... et calculer exp(n)...
    Quand j'ai vu, je me suis dit que e était tellement banale comme lettre que ce n'étais pas prudent...
    Bingo, ça n'a pas loupé si tu as besoin de e =2,718... si dans ta fonction tu réinitialises e à 1, tu en fais une variable banale que tu vas incrémenter ensuite des inverses de la factorielle et tu pers toute référence au e importé...
    Je l'ai donc appelé ex.
2. Cela corrigé, ça ne marche pas quand même....
    A cause des 2 boucles et de la gestion des n, k...
    J'ai testé e(n) tout seul il donnait bien une valeur plus précise à chaque tour de boucle for...
    Le problème est que ton while appelle n fois e(n) et que à chaque fois e(n) repart du début...
    Il aurait fallu que ton while appelle e(n) qui calcule une valeur de ex à partir d'une valeur de k, les garde en mémoire, et renvoie ex à précision()  qui teste :
    La précision attendue est-elle obtenue? --> Oui, je sors, non je rappelle e(n), qui incrémente k, recalcule ex...
    Ca l'instruction yield qui permet ça... 
    le nombre de tours nécessaires est donné par k, la précision par p ou n...
3. il est vivement conseillé de ne pas créer une fonction ayant le même nom, une variable ou une constante existantes...
   j'ai rebaptisé e(n) en expo(n).
Ce soir, venant de faire 400 km dans des conditions atmosphériques assez pénibles par épisodes, je n'ai pas envie de me prendre le chou avec yield...
Alors je t'ai refait refait un petit truc qui fonctionne.


from math import factorial
from math import e

def expo(n):
    ex,k=1,0
    while abs(ex-e)>10**(-n):
        k+=1    
        ex+=1/factorial(k)
    return ex,k

def precision(p):
    ex,k=expo(p)
    return ex,e,abs(ex-e),k

print(precision(10))
 

Sortie :
2.7182818284467594, 2.718281828459045, 1.2285727990501982e-11, 13)
>>>

@+

[EDIT]
Effectivement Maenwe a raison, ça marchait avec la seule correction e(n) --> expo(n)
Cela dit les remarques sur la non-ergonomie du script restent valables.

Dernière modification par yoshi (26-02-2020 18:49:16)


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 27-02-2020 12:18:04

Cédrix
Membre
Inscription : 15-08-2019
Messages : 21

Re : algorithme Python d'approximation de e

Merci beaucoup à vous yoshi pour cette réponse très complète et pointue (comme toujours) !
C.

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt dix-huit moins trente
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums