Calcul exponentielle par développement limité

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
Deesmon
Messages: 5
Enregistré le: 05 Mar 2010, 17:31

Calcul exponentielle par développement limité

par Deesmon » 05 Mar 2010, 17:46

Bonjour.

Pour un projet de calculatrice scientifique, je dois calculer la fonction exponentielle.
J'ai choisis les développement limité.
Le calcul en lui même ne pose pas de problème et marche même très bien.
Mais exponentielle croissant très très vite. Un problème de précision gênant apparait pour de grande valeur si je fixe le plus grand exposant n du polynôme (1+x/1! + x^2/2! + x^3/3! + ... + x^n/n!) à une constante.

Quand n tend vers l'infini n! prend le dessus sur x^n et la fonction x^n/n! tend vers 0.

Il faut donc que je calcul la valeur de n pour une valeur x en fonction d'un reste voulu.
Pour cela il me semble qu'il y a la formule de Taylor avec reste ( http://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Taylor#Traitement_du_reste )

J'ai cependant un peu de mal à démarrer le problème pour obtenir ce fameux algorithme qui me permettrais d'obtenir des valeurs décentes d'exponentielle.
C'est pourquoi je recherche quelques éclaircissements sur la démarche à suivre.

Dans tout les cas, merci de m'avoir lu.



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 05 Mar 2010, 18:08

salut,

On peut procéder avec l'algo suivant sans pour autant connaitre la valeur de n a lavance
Code: Tout sélectionner
ratio = 1;//contient la fraction x^n/n!
i = 0 //l'indice de parcourt (pour le DSE on mettrait n, mais c moins intuitif...
ecart = 1000;//la precision du resultat
EPSILONE = 0.0001//la precision minimum souhaitée
NOMBRE_MAX //le nombre maximum pour pas faire une boucle infinie...inutile ici mais simple mesure de précaution XD
tant que ecart > EPSILONE && i < NOMBRE_MAX
 ratio = ratio*x/(i+1)//contient x^n*x/n!(n+1)
 sommeActuelle = sommeActuelle + ratio;//mise a jour de la valeur calculée de lexp
 ecart = e - sommeActuelle
 i++;
fin tant que
la vie est une fête :)

Deesmon
Messages: 5
Enregistré le: 05 Mar 2010, 17:31

par Deesmon » 05 Mar 2010, 18:44

Tout d'abord merci.

Il y a cependant deux petits points que je n'arrive pas bien à comprendre.

Alors EPSILONE = 0.0001, on veut donc que le reste soit inférieur à 0.0001.
Tu fixes ecart = 1000 (précision souhaitée) je suis pas sur de comprendre, la précision souhaité est pas fixée par epsilone ?
et ecart = e - sommeActuelle ?
e fait référence à quoi ?

En gros tu fais une boucles qui tant qu'on a pas la précision voulu (fixé par EPSILON et contrôlée par ecart) Tu fais la sommes des monômes du polynôme 1+x/1! + x^2/2! + x^3/3! + ... + x^n/n! .

C'est ok mais je ne vois pas du tout le rôle joué par ecart = 1000 et ecart = e - sommeActuelle.

En tout cas merci, semaine difficile, la fatigue qui pèse sur mes épaules m'aide pas tellement pour boucler ce projet.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 05 Mar 2010, 21:34

salut,

ben en fait e c'est exp(1).
Mais je suis parti dans l'idée que tu cherches un N (entier naturel) tel que


Ce qui implique de connaitre e. J'ai fait un lien un peu (trop) hatif avec d'autres souvenirs ...

D'ailleurs ca me rappele aussi la notion de reste pour les séries, mais pas plus que ca lol
la vie est une fête :)

Deesmon
Messages: 5
Enregistré le: 05 Mar 2010, 17:31

par Deesmon » 05 Mar 2010, 22:08

Mais ecart = e - sommeActuelle.
Si je parcours l'algo pour x = 3.
On rentre une fois dans la boucle.
sommeActuelle = 3/1 = 3

et ensuite ecart = e - sommeActuelle = e -3 e~2.71828183
ecart est négatif

ecart < EPSILONE
On sort de la boucle

Alors soit il y a quelque chose que je n'ai pas saisi, ou alors il y a une petite erreur ^^

Je vais me coucher et reprendre ça avec un de mes camarades qui a une meilleur approche scientifique des mathématiques que moi. On a tout coder en langage objet à partir d'un objet polynôme. C'est clairement moins rapide qu'une simple méthode exp, sin, cos ou autre ... mais j'aime beaucoup l'approche objet alors comme on était libre d'aborder le sujet, j'ai choisis cela pour le fun.
Enfin bref vu que je procède ainsi travailler avec le reste me permettrait de généraliser tout cela.

Encore merci pour le temps que tu m'as accordé.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21515
Enregistré le: 11 Nov 2009, 22:53

par Ben314 » 05 Mar 2010, 22:23

Salut,
Le petit problème, c'est de savoir ce que tu entend par "précision" : si tu utilise un langage "standard" (i.e. qui ne fait pas de calcul formel), les différents types destinés à recevoir des "réels" ont une précision relative, c'est à dire que, comme les réels sont stockés sous la forme mantise+exposant, la précision est définie sur la mantise.
Pour être plus clair, tu as un certain nombre de chiffre de précision, si ton nombre est de l'ordre de 10^50, seuls les 12 premiers chiffres sont connus et dans ce cas, tu est précis à environ 10^48 prés.
Un nombre proche de 1 sera lui précis à 10^-12 prés.
Enfin un nombre proche de 10^-20 est précis à 10^-32 prés...

Conclusion, il ne faut pas que tu mesure la précision en terme de différence égale à epsilon.
Pour parler "programation", vu la vitesse de convergence de la série de l'exponentielle, perso, je m'emerderais pas, je ferait texto l'algo proposé par fatal error et ma condition d'arrêt serait "avant-dernier terme calculé=dernier terme calculé" (attention à comprendre que, vu sa précision relative, ce test est trés trés différent d'un test qui dirait "somme ajoutée=0".
Par exemple si la somme S est de l'ordre de 10^5 et que le terme ajouté ratio vaut environ 10^-8, pour l'ordi, ratio n'est absolument pas nul, mais S+ratio est bien égal à S.

Code: Tout sélectionner
ratio = 1;//contient la fraction x^n/n!
i = 1 //l'indice de parcourt (pour le DSE on mettrait n, mais c moins intuitif...
sommeActuelle = 1;
sommeAncienne = 0;// n'importe quelle valeur différente de sommeActuelle
tant que sommeActuelle != sommeAncienne
 ratio = ratio*x/i //contient x^(n-1)*x/(n-1)!n
 sommeAncienne=Sommeactuelle;
 sommeActuelle = sommeActuelle + ratio;//mise a jour de la valeur calculée de lexp
 i++;
fin tant que
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Deesmon
Messages: 5
Enregistré le: 05 Mar 2010, 17:31

par Deesmon » 06 Mar 2010, 09:05

Je programme en java, j'ai utilisé la classe BigDecimal qui me permet de me soustraire des problèmes d'intervalles lié au codage binaire des réels. (Je suppose qu'elle gère cela avec des chaînes de caractère)

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 06 Mar 2010, 11:54

re,

jai trouvé un truc pour majorer le reste du DSE de e :
lien

Du coup, on cherche d'abord le n tel que le reste soit inférieur a précision, pis apres on somme jusqu'a ce n.

(ps : on s'en tape de comment BigDecimal encode les nombres :id: , tant qu'il le fait bien.)
la vie est une fête :)

Deesmon
Messages: 5
Enregistré le: 05 Mar 2010, 17:31

par Deesmon » 06 Mar 2010, 12:00

C'est tout simplement parfait =)

Merci beaucoup :++:

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 26 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite