       • To: mathgroup at smc.vnet.net
• Subject: [mg50152] Re: Adaptive FunctionInterpolation[] ?
• From: "franjesus" <franjesus at hotmail.com>
• Date: Wed, 18 Aug 2004 01:19:59 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

```Now, I have this version that works with Mathematica v5. Makes use of
NIntegrate EvaluationMonitor option.
Module[{acc, g, gridpts, iarrays, niacc, pts, vars, vol}, acc =
AccuracyGoal /. \ {opts} /. AccuracyGoal -> 6; vol = Times @@
({x}[[All, 3]] - {x}[[All, 2]]); niacc = -Log[10, 10^-acc vol]; vars =
{x}[[All, 1]]; pts = {}; NIntegrate[expr, x, AccuracyGoal -> niacc,
EvaluationMonitor :> AppendTo[pts, {x}]]; pts = Partition[Flatten[pts],
Length[vars]]; gridpts = ( Union[pts[[All, #1]], {x}[[1, {2, 3}]]] &)
/@ Range[Length[vars]]; iarrays = expr /. Outer[Thread[vars -> {##1}]
&, Sequence @@ gridpts];     ListInterpolation[iarrays, gridpts]     ]

Carl K. Woll wrote: >
Hi Frank, >
If you're interested, I can give you the workaround that I used when I came
across this problem. My solution used the fact that NIntegrate must
adaptively choose its integration points in order to accurately determine
the numerical integral. Hence, if I use NIntegrate, and remember the data
points which NIntegrate uses in its routines, I can use these data points to
interpolate the desired function. I have no idea how good this approach
is compared to other adaptive routines, but it required very little
work from me to develop (that is, I didn't need to figure out an
adaptive routine). Putting the above idea into a function yields the
following:  AdaptiveFunctionInterpolation[expr_, x__, opts___?OptionQ] := >
Module[{acc, g, gridpts, iarrays, niacc, pts, vars, vol},
acc = AccuracyGoal /. {opts} /. AccuracyGoal -> 6;
vol = Times @@ ({x}[[All,3]] - {x}[[All,2]]);
niacc = -Log[10, 10^-acc vol]; > vars = {x}[[All,1]];
pts = {};
With[{v = vars}, Evaluate[g @@ (Pattern[#, _] & ) /@ vars] := Module[{}, pts
= {v, pts}; expr]];
NIntegrate[g @@ vars, x, AccuracyGoal -> niacc];
pts = Partition[Flatten[pts], Length[vars]];
gridpts = (Union[pts[[All,#1]], {x}[[1,{2, 3}]]] & ) /@ Range[Length[vars]];
iarrays = expr /. Outer[Thread[vars -> {##1}] & , Sequence @@ gridpts];
ListInterpolation[iarrays, gridpts] ]

```

• Prev by Date: Re: Playing with numbers
• Next by Date: Re: GUIKit: user defined properties?