Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I am trying to plot a very simple function f[x_]:=Exp[-x]/x on a log-log scale like this

LogLogPlot[f[x], {x, 10^(-5), 10^7}]

Mathematica graphics

The problem is that for large values of x the plot suddenly jumps to 1 instead of going to zero as it should. I have tried to tabulate the values and increase working precision but it doesn't go away. The problem does not appear if I use

LogLogPlot[Exp[-x]/x, {x, 10^(-5), 10^7}]

Mathematica graphics

Anyone can explain me what is happening?

share|improve this question

marked as duplicate by Michael E2, Yves Klett, m_goldberg, Sjoerd C. de Vries, bobthechemist Feb 28 at 1:57

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

    
Hey I edited to format your code. In the future, you can format code on your own by selecting the code block and pressing ctrl+k –  gpap Feb 26 at 16:42
    
There are some weird things going on here. What version of Mathematica are you using? 8, 9 or 10 for the Raspberry Pi? They give different results. Normally I'd say, just use WorkingPrecision -> 20 if you're getting runaway errors from machine precision. But in this case using that option in v9 gives incorrect results. –  Szabolcs Feb 26 at 16:55
    
Yep, I was halfway editing my comment to suggest changing the WorkingPrecision. Then I tried it and, in v9 on OSX at least, it goes to 1 regardless how high WorkingPrecision is. –  gpap Feb 26 at 16:59
2  
one more thing, if I were to plot directly the function Exp[-x]/x, so without difining f first, then it works perfectly. But the function has more parameters etc so I can't leave it like that. What to do? –  mia Feb 26 at 17:14
2  
I would file a bug report to WR... –  gpap Feb 26 at 17:17

3 Answers 3

Just to show LogLogPlot is getting the correct values:

 f[x_] := Exp[-x]/x
 ListLogLogPlot[
     Sort[Reap[
          LogLogPlot[fx=f[x], {x, 10^(-5), 10^7}, 
              EvaluationMonitor :> Sow[{x, fx}]]][[2, 1]]], 
              Joined -> True, PlotRange -> All]

enter image description here

Of course setting a sensible plot range in ListLogLogPlot gives the expected result.

 ListLogLogPlot[
   Sort[Reap[
     LogLogPlot[fx = f[x], {x, 10^(-5), 10^7}, 
          EvaluationMonitor :> Sow[{x, fx}]]][[2, 1]]], Joined -> True, 
          PlotMarkers -> Graphics[Point[{0, 0}]], PlotRange -> {10^-8, 10^7}]

enter image description here

share|improve this answer
    
I'm not sure that 10^-3619123 is the correct value.. Or maybe I don't get it :) –  Öskå Feb 27 at 15:19
    
Exp[-10^7]/10^7 // N -> O(10^-4342952). I honestly don't know what it should be... –  george2079 Feb 27 at 15:27
    
It should be reported as a serious bug I guess :) –  Öskå Feb 27 at 15:33
    
Just for fun your formula gives the same thing if I request 10 million digits (!) precision on the Coth .. –  george2079 Feb 27 at 15:59
    
or breaking out the pencil and paper : 10^(-10^7 Log[10, E] - 7) // N -> 1.516 10^-4342952 –  george2079 Feb 27 at 16:09

Or since:

$$e^x=1+\frac{2}{-\coth \left(\frac{x}{2}\right)-1}$$

f[x_] := (1 + (2/(-1 - Coth[x/2])))/x
LogLogPlot[f[x], {x, 10^(-5), 10^7}]

enter image description here

Also, by using Mathematica you can find that

ExpToTrig[Exp[-x]]
(* => Cosh[x] - Sinh[x] *)

Thus using

f[x_] := (Cosh[x] - Sinh[x])/x

produces the same Plot.

share|improve this answer
    
Well.., the bug appears with plotting Exp[-x] as well. If the actual f[x] has Exp[-x] it is still possible to use the equivalence. (I guess?) –  Öskå Feb 26 at 17:40
    
One can define mexp[x_]:=(1 + (2/(-1 + Coth[-x/2]))) and use it instead of Exp[-x] everywhere (since Exp[-x] seems to be the issue). –  Öskå Feb 26 at 17:43
    
Thank you, you are very creative, I would have never thought about writing the exponential like that :) –  mia Feb 26 at 17:47
    
@mia, I edited so Mathematica thinks for you :) –  Öskå Feb 26 at 17:54
    
I would have thought that cosh-sinh would lead to same strange behavior but apparently it works with that as well :). thanks again! –  mia Feb 26 at 18:29

This appears to be some sort of bug in LogLogPlot. Note that you can always compute the function at specific values of x as in most other procedural languages and use one of the List*Plot functions:

With[{x = 10^Range[-5, 7, 0.01]},
    ListLogLogPlot[Transpose@{x, f[x]}, Joined -> True, 
        PlotRange -> {{1*^-5, 1*^7}, {1*^-9, 1*^6}}]]

The only drawback here is that you won't have the benefit of the adaptive sampling in Plot-like functions, but a lot of the time you can live without it.

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.