Message Boards Message Boards

Suggestions for speeding up this plot?

Posted 8 years ago
POSTED BY: Bryan Lettner
7 Replies

Your function definition contains errors and, probably, it must be

HairyStarfish[a_, plotpts_, thickness_, imagesize_] := 
 ParametricPlot[{Sum[(2/3)^k Sin[(3/2)^k t], {k, 0, a}], 
   Sum[(-(2/3))^k Cos[(3/2)^k t], {k, 0, a}]}, {t, 0, 2^(a + 1) Pi}, 
  MaxRecursion -> 5, Axes -> False, PlotPoints -> plotpts, 
  PlotStyle -> {Thickness[thickness], Black}, 
  PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, 
  ImageSize -> {imagesize, Automatic}]

Am I right?

You may try ListPlot with ParallelTable, after you have estimated a reasonable increment for t that does not make you lose too much detail.

POSTED BY: Gianluca Gorni
Posted 8 years ago
POSTED BY: Bryan Lettner

You also get it a bit faster by wrapping the inner bit into an Evaluate:

myHairyStarfish[a_, plotpts_, thickness_, imagesize_] := 
 ParametricPlot[
  Evaluate[{Sum[(2/3)^k Sin[(3/2)^k t], {k, 0, a}], 
    Sum[(-(2/3))^k Cos[(3/2)^k t], {k, 0, a}]}], {t, 0, 2^(a + 1) Pi},
   MaxRecursion -> 5, Axes -> False, PlotPoints -> plotpts, 
  PlotStyle -> {Thickness[thickness], Black}, 
  PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, 
  ImageSize -> {imagesize, Automatic}]

AbsoluteTiming[myHairyStarfish[11, 15000, 0.00004, 500]]

On my computer it goes from 5.75 secs to 2.94 secs.

Cheers,

Marco

POSTED BY: Marco Thiel
POSTED BY: Vitaliy Kaurov
Posted 8 years ago

Thank you. Yes, I generally Export directly to TIFF... I omitted for simplicity. Would SVG or PDF offer advantages over TIFF in this particular case? I'm new to the idea of a vector format.

Unfortunately, compilation does not appear to increase the speed. Although, I'm guessing I am doing something wrong, since I have never compiled anything before. Here is a comparison:

myHairyStarfish[a_, plotpts_, thickness_, imagesize_] := 
 ParametricPlot[
  Evaluate[{Sum[(2/3)^k Sin[(3/2)^k t], {k, 0, a}], 
    Sum[(-(2/3))^k Cos[(3/2)^k t], {k, 0, a}]}]
  , {t, 0, 2^(a + 1) Pi}, MaxRecursion -> 5, Axes -> False, 
  PlotPoints -> plotpts, PlotStyle -> {Thickness[thickness], Black}, 
  PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, 
  ImageSize -> {imagesize, Automatic}]

myHairyStarfish[11, 15000, 0.00004, 500]

takes 2.02 seconds.

cf = Compile[{t}, Sum[{(2/3)^k Sin[(3/2)^k t], (-(2/3))^k Cos[(3/2)^k t]}, {k, 0, 11}], 
CompilationTarget -> "C", Parallelization -> True]

ParametricPlot[
 cf[t]
 , {t, 0, 2^(11 + 1) Pi}, MaxRecursion -> 5, Axes -> False, 
 PlotPoints -> 15000, PlotStyle -> {Thickness[0.00004], Black}, 
 PlotRange -> {{-2.5, 2.5}, {-2.5, 2.5}}, 
 ImageSize -> {500, Automatic}]

takes 2.42 seconds.

But cf[t] still seems to be evaluating within ParametricPlot, so that's probably why. Is there a way to take cf[t] from cf[0] to cf[2^(a + 1) Pi] first, then plot it after?

POSTED BY: Bryan Lettner

Using compilation and machine real numbers may be tricky here. You are going to calculate Sin and Cos of numbers that are of the order of 10^12. Can you trust the results?

POSTED BY: Gianluca Gorni
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract