MathGroup Archive 2007

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

Search the Archive

Re: Re: Re: Gradient of a List

  • To: mathgroup at smc.vnet.net
  • Subject: [mg82684] Re: [mg82647] Re: [mg82614] Re: Gradient of a List
  • From: DrMajorBob <drmajorbob at bigfoot.com>
  • Date: Sun, 28 Oct 2007 04:05:22 -0500 (EST)
  • References: <10340059.1193232789565.JavaMail.root@m35> <ffpps9$l54$1@smc.vnet.net> <10446382.1193425327958.JavaMail.root@m35> <200710271000.GAA11027@smc.vnet.net> <25720629.1193544603482.JavaMail.root@m35>
  • Reply-to: drmajorbob at bigfoot.com

min and max aren't defined in that piece of code. It's from a notebook  
that starts with my earlier solution:

data = Table[{x + RandomReal[], Sin@x + 0.1 RandomReal[]}, {x, 0, Pi,
     0.1}];
f = Interpolation[data, InterpolationOrder -> 3];
{min, max} = data[[Ordering[data][[{1, -1}]], 1]];
Quiet@Plot[f'[x], {x, min, max}, PlotRange -> All]

which defined min and max broad enough, apparently, to work with the other  
code and new data. I'd forgotten to reset min and max whenever the data 
changes, and I wasn't getting error messages, so...

Sorry for the confusion.

Bobby

On Sat, 27 Oct 2007 11:50:55 -0500, Syd Geraghty <sydgeraghty at mac.com>  
wrote:

> Bobby,
>
> There is something amiss in the line
>
> Plot[g[data, 0.5]'[x], {x, min, max}, PlotRange -> All]
>
> below. I have been trying different fixes for ten minutes but have not
> succeeded so I thought I would ask your help.
>
> Cheers ... Syd
>
> Syd Geraghty B.Sc., M.Sc.
> sydgeraghty at mac.com
> San Jose, CA
>
> My System
>
> MacOS X V 10.4 .10
> MacBook Pro 2.33 Ghz Intel Core 2 Duo  2GB RAM
>
> On Oct 27, 2007, at 3:00 AM, DrMajorBob wrote:
>
>> Scott,
>>
>> I hadn't noticed I was perturbing the x-values and using UNperturbed x  
>> to
>> calculate y. No wonder the result looked so awful!
>>
>> Your Gaussian smoothing works amazingly well in this situation.
>>
>> I think I'd write it this way, however:
>>
>> ClearAll[pdf, g, x, data]
>> pdf[xIdeal_, sig_] = Exp[-((# - xIdeal)/sig)^2/2]/(Sqrt[2 Pi] sig) &;
>> g[data_, sigma_] := g[data, sigma] = Function[{x},
>>     Evaluate@Block[{x0, y0},
>>       {x0, y0} = Transpose@data;
>>       y0.Normalize[pdf[x, sigma] /@ x0, Total]]]
>>
>> data = Table[{x + RandomReal[], Sin@x + 0.1 RandomReal[]}, {x, 0, Pi,
>>      0.1}];
>> Plot[g[data, 0.5]'[x], {x, min, max}, PlotRange -> All]
>>
>> Notice the "just-in-time" definition of g.
>>
>> Bobby
>>
>> On Fri, 26 Oct 2007 04:21:23 -0500, Scott Hemphill
>> <hemphill at hemphills.net> wrote:
>>
>>> DrMajorBob <drmajorbob at bigfoot.com> writes:
>>>
>>>> data = Table[{x + RandomReal[], Sin@x + 0.1 RandomReal[]}, {x, 0, Pi,
>>>>      0.1}];
>>>> f = Interpolation[data, InterpolationOrder -> 3];
>>>> {min, max} = data[[Ordering[data][[{1, -1}]], 1]];
>>>> Quiet@Plot[f'[x], {x, min, max}, PlotRange -> All]
>>>>
>>>> I use Quiet because Plot sometimes samples outside the data range and
>>>> throws the InterpolatingFunction::dmval message.
>>>>
>>>> Notice, however, the result isn't even close to Cos[x], and it changes
>>>> quite a bit if you change the InterpolationOrder.
>>>
>>> Of course, these problems are because of the noise in both the x and y
>>> data values.  Since Interpolation insists on passing exactly through
>>> the points given, the interpolating function has to wiggle around a
>>> lot to fit all the noise.  The OP may not have any noise in his
>>> independent variables (x,y) and may have little or none in his
>>> function values.
>>>
>>> Still, yours is an interesting problem.  One way of handling it would
>>> be to interpolate via weighted averages.  For example, you could
>>> assign a Gaussian weight to all the function values based on how close
>>> the x value is to the x coordinates of the data:
>>>
>>> (* Gaussian centered at x0, with standard deviation sig *)
>>>
>>> pdf[x_,x0_,sig_] := 1/(Sqrt[2Pi]sig) Exp[-(x-x0)^2/(2sig^2)];
>>>
>>> (* Gaussian weighted average of data, using sig = 0.5 *)
>>> (* try using other values for sig *)
>>>
>>> g[x_] = Block[{x0,y0,w},
>>>   x0 = data[[All,1]];       (* x-coordinates of data *)
>>>   y0 = data[[All,2]];       (* y-coordinates of data *)
>>>   w = pdf[x,#,0.5]& /@ x0;  (* weight the x-coordinates *)
>>>   w /= Plus @@ w;           (* Normalize the weights *)
>>>   w . y0                    (* Return interpolated function value *)
>>> ];
>>>
>>> Now you have a continuous function g[x], and you can plot it as well
>>> as g'[x].  (Of course it is inefficient, since it recalculates all the
>>> weights every time you call it.  You could enter "foo[x_]g[x];" and >>> then "foo[x]" wouldn't have that problem.)
>>>
>>> One nice feature of Gaussian weights happens if you have a set of
>>> equally spaced data points.  If they extend infinitely in both
>>> positive and negative directions, or *equivalently* the function
>>> values are zero beyond the region of interest, then you can omit the
>>> normalization step.  (One example is in image processing, where the
>>> region beyond the boundaries of the image may be assumed to be black.)
>>> Then the Gaussian weighting is equivalent to convolution(1) with a
>>> Gaussian kernel.  This convolution has some nice properties.  For
>>> example, it is infinitely differentiable, because the Gaussian is.
>>> Also, you can express its derivatives in the same form as the
>>> convolution itself, i.e. the convolution of a Gaussian with a set of
>>> data points.
>>>
>>> The OP might be able to use the two-dimensional version of the the
>>> Gaussian weighted interpolation above, but Mathematica's built-in
>>> polynomial interpolation might work perfectly well.
>>>
>>> (1) when I speak of convolution with a "data point" (x0,y0), I really
>>>     mean convolving with the function y0*DiracDelta[x0].  The result
>>>     is a y0 times a Gaussian centered at x0.  Convolution with a
>>>     collection of data points gives the sum of all the Gaussians.
>>>
>>>> On Wed, 24 Oct 2007 03:34:28 -0500, olalla <operez009 at ikasle.ehu.es>
>>>> wrote:
>>>>
>>>>> Hi everybody,
>>>>>
>>>>> Does anybody know how can I get the "gradient" of a list of points ?
>>>>>
>>>>> My real problem is:
>>>>>
>>>>> I have a scalar field previously obtained numerically that for a
>>>>> given point (xi,yi) takes a value f(xi,yi). What I want to do is an
>>>>> estimation of the gradient of this scalar field BUT I haven't got any
>>>>> analytical function that expresses  my field so I can't use the Grad
>>>>> function.
>>>>>
>>>>> How can I solve this using Mathematica?
>>>>>
>>>>> Thanks in advance
>>>>>
>>>>> Olalla, Bilbao UPV/EHU
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> DrMajorBob at bigfoot.com
>>>>
>>>
>>
>>
>>
>> --
>> DrMajorBob at bigfoot.com
>>
>
>



-- 

DrMajorBob at bigfoot.com


  • Prev by Date: NSolve keeps on running forever
  • Next by Date: Parallel computations
  • Previous by thread: Re: Re: Gradient of a List
  • Next by thread: remove whitespace