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.