Re: Mathematica LogPlot Bug
- To: mathgroup at smc.vnet.net
- Subject: [mg123802] Re: Mathematica LogPlot Bug
- From: AntonioP <ant.piniz at gmail.com>
- Date: Tue, 20 Dec 2011 03:02:16 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jcf890$6t1$1@smc.vnet.net> <jchht2$im7$1@smc.vnet.net>
On Dec 17, 8:55 am, "Oleksandr Rasputinov" <oleksandr_rasputi... at hmamail.com> wrote: > On Fri, 16 Dec 2011 10:58:40 -0000, AntonioP <ant.pi... at gmail.com> wrote: > > > Hello, > > > I have to draw some functions in log scale, butLogPlotseems not to > > be able to draw them correctly if the y-value is too small. > > A simple case: > > > f[x_] = 10^(-5 x) > >LogPlot[f[x], {x, 1, 100}, PlotRange -> Full] > > > the plot should be a simple straight line for any x value, > > while at about x=61.5 there is a step and, for any greater value of x, > > the function appears to be constant. > > Nevertheless, Mathematica is able to compute the correct value of f[x] > > for any x: > > > N[f[60]] > > N[f[65]] > > N[f[80]] > > N[f[100]] > > > There is a similar problem for large y-values, as well. > > Apparently there is a y-range, about (10^-308, 10^308), outside which > >LogPlotdoesn't work correctly. > > > Any idea on how to resolve the problem? > > > Thanks, > > > Antonio > > Your range looks suspiciously similar to {$MinMachineNumber, > $MaxMachineNumber}. This is not abug; it is just thatLogPlotby default > works in machine precision. Of course, defaults are not set in stone, so: > > f[x_] = 10^(-5 x)LogPlot[f[x], {x, 1, 100}, PlotRange -> Full, WorkingPrecision -> > $MachinePrecision] > > Note that MachinePrecision (the default) and $MachinePrecision are > different. The former signifies literal machine numbers. The latter > denotes arbitrary precision numbers with the same precision as machine > reals, but crucially, with precision tracking switched on. This allows > Plot to adaptively increase the working precision (by up to > $MaxExtraPrecision base-10 digits) in order to produce an accurate plot, > whereas without precision tracking it has no way to know when numerical > errors become significant. > > The reason why N obtains the correct answers is that it can trap machine > underflow and switch to arbitrary precision even without this being > switched on explicitly. This behaviour is controlled by the system option > "CatchMachineUnderflow". For example, switching it off, we get: > > SetSystemOptions["CatchMachineUnderflow" -> False]; > N[f[100], MachinePrecision] (* gives 0. *) > N[f[100], $MachinePrecision] (* gives 1.0*^-500 *) Thanks for all the answers. I have also found this simple workaround which, I think, exploits the Mathematica's arbitrary precision arithmetic, and should work for any y-range: f[x_] = 10^(-5 x) ListLogPlot[Table[N[f[x]], {x, 0, 100, 1}], Joined -> True] to compare with: LogPlot[f[x], {x, 1, 100}, PlotRange -> Full] Antonio