MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Plotting a Function - more questions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg71759] Re: Plotting a Function - more questions
  • From: "Jean-Marc Gulliet" <jeanmarc.gulliet at gmail.com>
  • Date: Tue, 28 Nov 2006 06:04:13 -0500 (EST)
  • References: <20061127165228.76340.qmail@web51502.mail.yahoo.com>

On 11/27/06, Craig Reed <tharkun860 at yahoo.com> wrote:
> On 26 Nov 2006, you wrote in
> comp.soft-sys.math.mathematica:
>
> > Timing[rng = Range[1, 100000];
> >     ListPlot[Rest[FoldList[Plus, 0,
> >         (Boole[DigitCount[#1, 10, 3] > 0] & ) /@
> rng]]/
> >       rng]; ]
> >
>
> thank you for this piece of code.
>
> If I may, several questions:
>
> 1.  I'm trying to get the 'x' scale to be a log scale
> instead of linear.  I have found that changing
> 'ListPlot' to 'LogListPlot' doesn't produce a graph.
> Can you explain why?

You must load a specific add-on to be able to use LogListPlot. See
below for an example.

> 2. For my further understanding, can you explain just
> how your code works?  I've been looking key words up
> in the Help Browser, but it's been my experience that
> explanations from humans make more sense and/or are
> more complete.

Below, I have rewritten the code in a more manageable and easy to
understand format. (At least, I hope so :-) I have also added some
commentaries at the end.

In[1]:=
<< "Graphics`Graphics`"
mySearch[lowerBound_Integer, upperBound_Integer] :=
	Module[{myValues, myTests, runningCount, myResult},
		myValues = Range[lowerBound, upperBound];
		myTests = (Boole[DigitCount[#1, 10, 3] > 0] & ) /@ myValues;
		runningCount = Rest[FoldList[Plus, 0, myTests]];
		myResult = runningCount / myValues;
		myResult = DeleteCases[myResult, 0]
	]

In[3]:=
Timing[lst = mySearch[1, 100000]; ][[1]]

Out[3]=
7.453 Second

In[4]:=
DiplayTogetherArray[{ListPlot[lst], LogListPlot[lst]}];

In[5]:=
myValues = Range[20, 30]

Out[5]=
{20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}

In[6]:=
myTests = (Boole[DigitCount[#1, 10, 3] > 0] & ) /@ myValues

Out[6]=
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1}

(* FoldList returns the starting value in addition to the list of
results. Therefore, we use the function Rest to get all the elements
but the first. In our example from 20 to 30 (inclusive) we have 11
elements of interest. FoldLisr returns a list with 12 elements. The
first 0 is discarded and runningCount has now the correct length. *)

In[7]:=
runningCount = Rest[FoldList[Plus, 0, myTests]]

Out[7]=
{0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2}

(* Mathematica works on whole lists. So {1, 2, 3} / {4, 5, 6} yields
the list {1/4, 2/5, 1/3} (Note that 3/6 is automaticaly simplified to
1/3) *)

In[8]:=
myResult = runningCount / myValues

Out[8]=
          1   1   1   1   1   1   1   1
{0, 0, 0, --, --, --, --, --, --, --, --}
          23  24  25  26  27  28  29  15

(* Finally we remove the first few elements equal to zero (really
needed for when using LogListPlot *)

In[9]:=
myResult = DeleteCases[myResult, 0]

Out[9]=
 1   1   1   1   1   1   1   1
{--, --, --, --, --, --, --, --}
 23  24  25  26  27  28  29  15

Regards,
Jean-Marc


  • Prev by Date: Re: Re: SetPrecision vs N
  • Next by Date: Re: SetPrecision vs N
  • Previous by thread: Re: Unexpected warning with ArcTan
  • Next by thread: Re: sum of integrals over patial intervals != integral over whole interval