MathGroup Archive 2011

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

Search the Archive

Re: Inverse Interpolation

  • To: mathgroup at
  • Subject: [mg120969] Re: Inverse Interpolation
  • From: "Alexey Popkov" <lehin.p at>
  • Date: Fri, 19 Aug 2011 06:35:08 -0400 (EDT)
  • Delivered-to:
  • References: <j2iens$bkv$>
  • Reply-to: "Alexey Popkov" <lehin.p at>

"WetBlanket" <wyvern864 at> wrote: news:j2iens$bkv$1 at
> 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-
> 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:


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