Série de Taylor de la fonction exponentielle

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
djidane110
Messages: 4
Enregistré le: 29 Oct 2008, 09:16

Série de Taylor de la fonction exponentielle

par djidane110 » 18 Déc 2008, 18:07

Bonjour à tous,

Voilà je développe une application Java mais ne pouvant me servir de la fonction Math.exp(double x), la fonction exponentielle, je voudrais la ré-implémenter.

Je me suis donc naturellement dirigé vers la série de Taylor de cette fonction. Tant que le nombre entré est positif, cela ne pose aucun problème, mais une fois qu'on veut avoir le résultat avec comme entrée un nombre négatif, cela ne va plus.

Je vous rappelle la série (si je ne me trompe pas) :


Et voici ma méthode :
[CODE]
public static double exp(double x)
{
double sum = 1; // La somme totale
double fact = 1; // La factorielle
double pow = 1; // La puissance

double sumPreced = sum;
int max = 1;

for (int i=1; i Comme vous le voyez, pas de soucis pour les positifs

Pour exp(-31) : 1.481123116788269E-4
Voulu : 3.442477108469977E-14
=> Par contre, pour les négatifs, des erreurs énormes


Peut-être me suis-je trompé dans la formule ? A moins que la série ne soit bonne que pour les positifs ? Ou bien dans mon implémentation ?

Voilà, je suis ouvert à toute suggestion !

Merci d'avance !



nyafai
Membre Relatif
Messages: 173
Enregistré le: 13 Avr 2006, 22:17

par nyafai » 18 Déc 2008, 18:27

ce n'est qu'une suggestion mais tu peux toujours utiliser exp(x) =1/exp(-x) pour x<0 et utiliser ce que tu as déjà fait pour le dénominateur.
Ceci dit ca ne répond pas à ta question mais ca fait trop longtemps que je n'ai pas fait de DSE pour te répondre

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

par fatal_error » 18 Déc 2008, 18:29

salut,

plusieurs remarques d'ordre info :
normalement, on ecrit par guide de style
if(cond)
{

}
else
{

}
Bon, c'est pas méchant mais bon.
Ensuite, si on ne connait pas la condition d'arret, il vaut mieux utiliser un while :
while((result-resultprece)<epsilone)
avec epsilone la précision recherchée

Ensuite, on peut coder mochement pour optimiser
for(i=0;(res-resultprec<epsilone);i++)
Apres faudrait regarder coté assembleur ou comparer sur une grosse profondeur en temps dexec

Pour finir,
exp(x)=\sum_{k=0}^\infty \frac{x^n}{n!}
pour tout x appartient a IR.
la preuve avec d'alembert :
en l'infini quelquesoit x

Ce que tu peux faire, c'est par exemple faire un test si le nombre est positif ou négatif (je sais pas pourquoi ca marche pas, mais de toute facon, c'est joli donc je propose)
int pas=1;
if(nombre négatif) //désolé, le pseudo-code cam fait pousser des boutons
{
while(cond)
pas=0-pas;//pas va valoir respectivement -1 ou 1 (fonction des puissances de n)
}


Autre remarque : faut éviter les doubles autant que possibles, ca fait des erreurs, donc pour la factorielle et la puissance préfère des int.
la vie est une fête :)

Avatar de l’utilisateur
mathelot
Habitué(e)
Messages: 13686
Enregistré le: 08 Juin 2006, 08:55

par mathelot » 18 Déc 2008, 18:47

djidane110 a écrit:Tant que le nombre entré est positif, cela ne pose aucun problème, mais une fois qu'on veut avoir le résultat avec comme entrée un nombre négatif, cela ne va plus.


oui, tout à fait.

pour x>0 la série est à termes positifs, il y a des retenues
quand on additionne
qui ne remontent pas trop loin dans le début du développement binaire
de

pour les x<0, on passe sans cesse au complément , ça doit générer une incertitude croissante à chaque addition.

d'où plutôt utiliser
pour

Doraki
Habitué(e)
Messages: 5021
Enregistré le: 20 Aoû 2008, 12:07

par Doraki » 18 Déc 2008, 21:01

pour x <0, il faut inverser e^-x oui

Avec ta procédure actuelle il y a plein d'erreur d'arrondis qui se font au début du calcul quand les nombres manipulés sont encore de l'ordre de 1.

Pour x > 0, la somme augmente rapidement, donc ces erreurs deviennent de plus en plus négligeable face aux nombres manipulés. Donc on s'en fout.

Pour x < 0, c'est le contraire, les erreurs faites au début prennent de plus en plus d'importance alors que les nombres manipulés diminuent.
Et donc c'est le résultat théorique final qui est négligeable devant les erreurs d'arrondi que tu fais donc c'est pas cool.

djidane110
Messages: 4
Enregistré le: 29 Oct 2008, 09:16

par djidane110 » 19 Déc 2008, 10:28

Tout d'abord, merci à tous, ca a résolu mon problème !

Il me suffisait donc simplement, dans le cas d'un négatif, d'utiliser :


Par contre, quelques remarques concernant mon code... ^^

Tout d'abord, je me défends en disant que cette méthode se trouve dans une classe de test.
Ensuite,

fatal_error a écrit:normalement, on ecrit par guide de style
if(cond)
{

}
else
{

}

Pas forcément dans le cas où il n'y a qu'une instruction qui suit la condition.

En ce qui concerne la condition d'arrêt, tu as tout à fait raison, une boucle while aurait été préférable.

fatal_error a écrit:Autre remarque : faut éviter les doubles autant que possibles, ca fait des erreurs, donc pour la factorielle et la puissance préfère des int.


Par contre, je sais pas si tu as fait attention, mais ce que je voulais c'est l'exponentielle d'un nombre réel... et donc utiliser un entier pour la factorielle, ok, mais pour la puissance, ce serait ridicule... !

Mais bon ! Merci de ces remarques tout de même, le code ne sera que plus condensé !

Merci à tous !

djidane110
Messages: 4
Enregistré le: 29 Oct 2008, 09:16

par djidane110 » 19 Déc 2008, 10:50

djidane110 a écrit:Par contre, je sais pas si tu as fait attention, mais ce que je voulais c'est l'exponentielle d'un nombre réel... et donc utiliser un entier pour la factorielle, ok, mais pour la puissance, ce serait ridicule... !


Je retire ce que j'ai dis sur la factorielle ^^
Et je me rappelle donc pourquoi j'ai mis un double !

En effet, imagine que tu fais 88 itérations, ta factorielle vaut :
1.8548264225739836E134
Il faudra m'expliquer comment tu places ca dans un entier !

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

par fatal_error » 19 Déc 2008, 11:29

ok, au temps pour moi.
Je reviens juste sur
Pas forcément dans le cas où il n'y a qu'une instruction qui suit la condition.

Peut -etre que vos exigences sont pas les mêmes, chez nous iveulent leurs accolades (dont on peut s'en passer j'en conviens :marteau: ).
la vie est une fête :)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 75 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