IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

problème avec exponentielle


Sujet :

Mathématiques

  1. #1
    Membre régulier Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Points : 102
    Points
    102
    Par défaut problème avec exponentielle
    bonsoir

    Je suis un peu bloqué avec un truc sous matlab, j'utilise une formule où il y a exponentielle (X) mais le soucis c'est que le X peux prendre des valeurs jusqu'a 1000 voire plus donc ca me donne comme résultas NAN "not a number" ou encore l'infini,
    comment je peux résoudre mathématiquement ce problème pour le simplifié.

    Merciii

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    il faudrait écrire ce que tu cherches à calculer pour t'aider au mieux. En général, c'est assez fastidieux.

    En première approche, tu peux essayer d'écrire X sous la forme d'une somme :
    X=X1+X2+...+XP,
    puis d'utiliser la décomposition
    exp(X)=exp(X1)*exp(X2)*...*exp(XP),
    mais ce n'est pas dit que cela fonctionne car même en choisissant les Xi assez petits pour que exp(Xi) reste calculable, il est toujours possible que le produit des exp(Xi) soit trop grand pour le calculateur.

    Pour information, le plus grand X pour lequel exp(X) est calculable est donné par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log(realmax)/log(exp(1)).
    Si cela ne fonctionne toujours pas, il faut traiter à part les puissances de 10. Par exemple, pour calculer exp(1000), on fait
    exp(1000)=exp(500+500)=exp(500)*exp(500).
    Sous matlab, j'obtiens
    mais
    Or, à la main, on voit bien qu'on a
    exp(500)*exp(500)=1.4036e+217*1.4036e+217=(1.4036*1.4036)e+(217+217)=(1.4036*1.4036)e+434
    Or, sous matlab, tu n'auras pas de problème pour calculer le carré de 1.4036.

    Moralement, tu obtiens une fonction qui ressemble à celle-ci. Je ne l'ai pas optimisée et elle peut comporter des bugs. De plus, elle renvoie le résultat sous forme d'une chaîne de caractères, il faudra t'en débrouiller.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function[expx] = myexp(x)
     
    % recuperation de l'argument maximum de l'exponetielle
    xmax = log(realmax)/log(exp(1));
    % on ecrit x=c*xmax+r
    n = floor(x/xmax); % c'est un entier
    r = x-n*xmax;
    % on a exp(x)=exp(n*xmax+r)=exp(n*xmax)*exp(r)=exp(xmax)^n*exp(r)
    % on a exp(xmax)=ae+b
    strxmax = sprintf('%0.5g',exp(xmax));
    ind_plus = findstr(strxmax,'+'); % on cherche où se trouve le signe plus
    a  = strxmax(1:ind_plus-2); % on enlève 2 car deux caractères : 'e+'
    b = strxmax(ind_plus+1:end); % la puissance de 10
    % on a
    % exp(x)=exp(xmax)^n*exp(r)=(ae+b)^n*exp(r)=exp(r)*(a^n)e+(nb)=de+(nb)
    strd = sprintf('%0.5g',exp(r)*str2num(a)^n);
    ind_plus = findstr(strd,'+');
    nb  = n*str2num(b);
    expx = [strd(1:ind_plus-2) 'e+' num2str(nb+str2num(strd(ind_plus+1:end)))];
    Sur ma machine, la fonction ne permet pas d'aller au-delà de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    myexp(99997)
     
    ans =
     
    1.3981e+43428
    C'est dû à l'implémentation mais j'espère que cela te suffira.

    Pense quand même a envoyé l'expression que tu cherches à calculer, on peut peut-être contourné le problème intelligemment, ce qui t'évitera de manipuler des chaînes de caractères.

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    il y a exponentielle (X) mais le soucis c'est que le X peux prendre des valeurs jusqu'a 1000
    Si tu nous expliquais pourquoi tu veux faire ce calcul, nous pourrions t'expliquer pourquoi ça ne marche pas. En attendant, regarde la norme IEEE 754, qui est une des premières choses que l'on devrait enseigner aux futurs informaticiens.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

Discussions similaires

  1. problème avec la fonction exponentielle
    Par dmognin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2011, 14h40
  2. Problème avec les exponentiels
    Par oranoutan dans le forum C
    Réponses: 19
    Dernier message: 21/05/2007, 12h20
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo