Re: Inverse Interpolation

• To: mathgroup at smc.vnet.net
• Subject: [mg120969] Re: Inverse Interpolation
• From: "Alexey Popkov" <lehin.p at gmail.com>
• Date: Fri, 19 Aug 2011 06:35:08 -0400 (EDT)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com
• References: <j2iens\$bkv\$1@smc.vnet.net>
• Reply-to: "Alexey Popkov" <lehin.p at gmail.com>

```"WetBlanket" <wyvern864 at gmail.com> wrote: news:j2iens\$bkv\$1 at smc.vnet.net...
> Previously, the following code could be used to use the Plot functions
> algorithm to select point at which to evaluate a function to assist in
> obtaining a good numerical interpolation.  In Version 8 this code does
> not seem to work ( at least for me).  Can someone assist me by showing
> how this task is best accomplished in Version 8.  I use the Cos
> function in this example for simplicity.  Clearly, numerical
> interpolation is not needed to obtain an inverse for the Cos.
>
> list={};
> F = Cos[x];
>
> Plot[ (  ss=F;  AppendTo[list, {ss,x}]; ss), {x,-1,1}, PlotPoints-
>>1000,
> PlotRange->All, AxesLabel->{"x","F"}]
>
> Thanks for the help.

Evaluation of your code in Mathematica 7.0.1 gives error:

AppendTo::rvalue: {} is not a variable with a value, so its value cannot be
changed. >>

Tracing of the evaluation shows that AppendTo is called with '{}' as the
first argument instead of the 'list' variable:

AppendTo[{},{0.540304,-0.999998}]

It means that 'list' is somehow evaluated inside of AppendTo in spite of the
HoldFirst attribute of AppendTo:

In[7]:= Attributes@AppendTo
Out[7]= {HoldFirst, Protected}

Looks like a bug or at least a big inconsistency.

One workaround is to use undocumented option Evaluated->False:

Plot[(ss = F; AppendTo[list, {ss, x}]; ss), {x, -1, 1}, PlotPoints -> 1000,
PlotRange -> All, AxesLabel -> {"x", "F"}, Evaluated -> False]

With this option your code works as expected. Another way is to define your
function with restriction to numeric values only and move AppendTo inside of
the function code:

list = {};
f[x_?NumericQ] := (AppendTo[list, {ss = Cos[x], x}]; ss); Plot[
f[x], {x, -1, 1}, PlotPoints -> 100, PlotRange -> All,
AxesLabel -> {"x", "F"}]

Note that there is convenient and much more computationally and
memory-efficient way to collect evaluation points using Reap and Sow:

results =
Reap[Plot[(Sow[{x, ss = F}]; ss), {x, -1, 1}, PlotPoints -> 1000,
PlotRange -> All, AxesLabel -> {"x", "F"}]];
plot = results[[1]]
list = results[[2]]

```

• Prev by Date: Speeding Up Known Integrations
• Next by Date: Re: Treat subscripted variables as symbols
• Previous by thread: Re: Inverse Interpolation
• Next by thread: First-order PDE with side condition