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
- References:
- Re: Re: Gradient of a List
- From: DrMajorBob <drmajorbob@bigfoot.com>
- Re: Re: Gradient of a List