Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

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

Search the Archive

Re: Problems to find the local extrema of an InterpolatingFunction

  • To: mathgroup at smc.vnet.net
  • Subject: [mg87927] Re: Problems to find the local extrema of an InterpolatingFunction
  • From: Szabolcs Horvát <szhorvat at gmail.com>
  • Date: Sat, 19 Apr 2008 23:54:30 -0400 (EDT)
  • Organization: University of Bergen
  • References: <fuc7qh$a0q$1@smc.vnet.net>

Modeler wrote:
> Hi,
> 
> does anyone know how to find all the local extrema of an InterpolatingFunction in a specified interval? The only
> thing that seems to work is Findroot, but it only finds a single root each time. Other rootfinding commands do not seem to work. Thanks for your help.
> 

I would feel uncomfortable using FindMinimum on InterpolatingFunction 
objects because (when constructed with Interpolation) the derivative of 
an InterpolatingFunction is usually not continuous.

f = Interpolation[{1, 3, 7, 4, 2}]
Plot[{f[x], f'[x]}, {x, 1, 5}]

If the InterpolatingFunction was returned by NDSolve, or the values of 
the derivative were supplied to Interpolation, then the derivative will 
be usually continuous.

If you have the raw data points, I would suggest working with them 
directly, or at least using them to find the two data points that 
surround the extremum, and using the FindMinimum[f, {x, x0, xmin, xmax}] 
syntax to search for the mimimum in a restricted region.

Here's a tutorial on extracting data points from InterpolatingFunctions 
returned by NDSolve:

tutorial/NDSolvePackages#120436095
http://reference.wolfram.com/mathematica/tutorial/NDSolvePackages.html

And some simple ways for finding zero crossings or local minima in 
discrete data:

data = Table[Sin[x], {x, 0, 5, .2}]

Select[Partition[data, 2, 1], NonPositive[Times @@ #] &]

minPoint[{a_, b_, c_}] := b <= a && b <= c

Select[Partition[data, 3, 1], minPoint]

Ways to construct numerical derivatives from discrete data:

Differences[data]

ListConvolve[{1, -1}, data]

ListConvolve[{1, 0, -1}, data]/2

This should be enough to get you started.


  • Prev by Date: Fw: Re: DifferenitalD vs CapitalDifferenitalD
  • Next by Date: Polygon cutter
  • Previous by thread: Re: Problems to find the local extrema of an InterpolatingFunction
  • Next by thread: Re: Problems to find the local extrema of an InterpolatingFunction