Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2010

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

Search the Archive

Re: Plot function at specific points

  • To: mathgroup at smc.vnet.net
  • Subject: [mg114118] Re: Plot function at specific points
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Wed, 24 Nov 2010 06:58:49 -0500 (EST)

Istvan,

Sure, yours is a possibility. I did not use ListPlot since I took it as you
wanted to
completely avoid it. I would probably  not overload Plot but rather make my
own
myPlot that behaves like this:

ClearAll[myPlot];
SetAttributes[myPlot, HoldAll];
myPlot[func_, {x_, range_}, opts:OptionsPattern[]] /; MatchQ[range,
{__?NumericQ}] :== ListPlot[
        Transpose@Outer[{#1, #2[#1]} &, range, If[ListQ@func, func,
{func}]], opts, Joined -> True];

myPlot[args___]:==Plot[args]

This seems safer - for functions as complex as Plot, you never know what yo=
u

can break by overloading them.

Regards,
Leonid


2010/11/23 Istv=E1n Zachar <replicatorzed at gmail.com>

>  This is indeed a cheater solution : )
> And a twofolded cheater, though rather clever: first, it is messy in the
> sense that the eps threshold is something arbitrary, and second, it still
> goes over the 10000 iterations - something that I definitely want to avoi=
d
> if I have a set of explicit query-points.
> I'm sure that somehow the plotting algorithm can be instructed via the
> Method option to sample at specific locations, though I still haven't fou=
nd
> any info about such possibilities. In the meantime I've crafted the
> following workaround, following the v6 extension of Table to list iterato=
rs:
>
>
> f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6, 2=
},
> {7, 1}, {8, 1}, {9, 2}, {10, 4}}];
> g == Interpolation[{{0, 3}, {1, 4}, {2, 5}, {3, 5}, {4, 5}, {5, 4}, {6, 3=
},
> {7, 2}, {8, 1}, {9, 1}, {10, 0}}];
>
> lowRes == Range[0, 10, 2];
>
> Unprotect[Plot];
> Plot[func_, {x_, range_}, opts___] /; MatchQ[range, {__?NumericQ}] :==
> ListPlot[
>         Transpose@Outer[{#1, #2[#1]} &, range, If[ListQ@func, func,
> {func}]], opts, Joined -> True];
> Protect[Plot];
>
> Plot[{f, g}, {x, lowRes}]
> Plot[g, {x, lowRes}]
>
>
> I see no objection why this extension shouldn't be part of v9 in the futu=
re
> (or even of v8.0.1) : )
> Of course some proper option-handling must be added as well, and it must =
be
> extended to LogPlot and relatives,
> but I think I'll use this until someone can reveal the scope of Method
> inside Plot.
>
> Thanks again for the suggestions,
>
> Istvan
>
>
>
>
> On 2010.11.23. 14:51, Leonid Shifrin wrote:
>
> Hi Istvan,
>
> You are likely to get much better solutions, but here is one way (cheatin=
g
> somewhat):
>
> f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6,
>       2}, {7, 1}, {8, 1}, {9, 2}, {10, 4}}];
> lowRes == Range[0, 10, 2];
> eps == 0.001;
> cutF == Function[
>    Evaluate[
>     Module[{x},
>      Total[UnitStep[x - # + eps]*UnitStep[# + eps - x] & /@
>         lowRes] /. x -> #]]];
> Plot[f[x]*cutF[x], {x, 0, 10}, PlotRange -> {{0, 10}, {0, 9}},
>  PlotPoints -> 10000, PlotStyle -> {Thickness[0.005]}]
>
> If your f[x] is expensive to compute, you can define f[x]cutF[x] as a
> single function and
> compute f[x] lazily only when cutF[x] is non-zero.
>
> Regards,
> Leonid
>
>
> 2010/11/23 Istv=E1n Zachar <zac at freemail.hu>
>
>> Dear Group,
>>
>> is there a method to plot an InterpolatingFunction at specific pointr
>> WITHIN Plot? I am of course aware that I can use ListPlot at any time,
>> though for certain reasons I have to stick with Plot. The main reason
>> is that I have a large amount of InterpolatingFunctions which I plot
>> with Plot as default, though at request I have to plot the same
>> InterpolatingFunctions at different resolutions. PlotPoints and
>> MaxRecursion is no good here, since lower resolution has to use a
>> certain set of x-values, defined prior to plotting. Obviously I want
>> to use the same Plot setup for both high and low-resolution cases.
>> Below is a toy modell of the problem:
>>
>> f == Interpolation[{{0, 1}, {1, 2}, {2, 3}, {3, 5}, {4, 8}, {5, 5}, {6,
>> 2}, {7, 1}, {8, 1}, {9, 2}, {10, 4}}];
>> lowRes == Range[0, 10, 2];
>> Plot[f[x], {x, 0, 10}, PlotRange -> {{0, 10}, {0, 9}}]
>> ListLinePlot[{#, f@#} & /@ lowRes, PlotRange -> {{0, 10}, {0, 9}}]
>>
>> Again, what I want is to have a specific Plot call instead of the
>> ListLinePlot, but with same result as ListLinePlot.
>> Note that values of 'lowRes' may not correspond the exact x-
>> coordinates supplied to f.
>>
>> Is there a way to tell Plot explicitly the steps to use? Any idea?
>>
>> Istvan
>>
>>
>



  • Prev by Date: Re: Plot function at specific points
  • Next by Date: Re: Mathematica 8: first impressions
  • Previous by thread: Re: Plot function at specific points
  • Next by thread: Re: Plot function at specific points