Re: Plot function at specific points
- To: mathgroup at smc.vnet.net
- Subject: [mg114114] Re: Plot function at specific points
- From: "István Zachar" <replicatorzed at gmail.com>
- Date: Wed, 24 Nov 2010 06:58:05 -0500 (EST)
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 avoid 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
found any info about such possibilities. In the meantime I've crafted
the following workaround, following the v6 extension of Table to list
iterators:
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
future (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
> (cheating 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 <mailto: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
>
>