一千萬個為什麽

搜索

如何查找範圍內的所有局部最小值/最大值

我想找到:

範圍內的所有本地最大值 範圍內的所有本地最小值

從這些點我可以插入和組合函數的上下邊界。我真正感興趣的是這些邊界的平均功能。

該圖的數據模型: GetRLine3[MMStdata, IO: 1][x_: x] := ListInterpolation[#, InterpolationOrder -> IO, Method -> "Spline"][x] & /@ (({{#[[1]]}, #[[2]]}) & /@ # & /@ MMStdata); data = Transpose[{# + RandomReal[]*0.1 & /@ Range[-10, 30, 0.4], Tanh[#] + (Sech[2 x - 0.5]/1.5 + 1.5) /. x -> # & /@ Range[-4, 4, 0.08]}]; xLimits = {[email protected]#1, [email protected]#1} & @@ Transpose[data]; f = D[GetRLine3[{data}, 3][x], x];

編輯: 作為我的努力: minimums = DeleteDuplicates[Round[x /. Last[FindMinimum[f, {x, #}]] & /@ Transpose[data][[1]], 0.0001]] minimumvalues = (f /. x -> #)[[1]] & /@ minimums; minimumData := Transpose[{minimums, minimumvalues}]; maximums = DeleteDuplicates[Round[x /. Last[FindMaximum[f, {x, #}]] & /@ Transpose[data][[1]], 0.0001]]; maximumsvalues = (f /. x -> #)[[1]] & /@ maximums; maximumsData := Transpose[{maximums, maximumsvalues}];

maxf = Max[{GetRLine3[{maximumsData}, 3][x], f}] minf = Min[{GetRLine3[{minimumData}, 3][x], f}] mf = Mean[{maxf, minf}]

This was what I was trying to make: 我仍然收到很少的警告,我確信這不是最好的解決方案。我不喜歡 DeleteDuplicates @ Round @ 部分,但必須使插值功能正常工作。

最佳答案

這可以使用NDSolve中的事件位置來完成。我從下面開始(註意f稍微修改了你所擁有的,主要是重新縮放它)。 GetRLine3[MMStdata, IO: 1][x_: x] := ListInterpolation[#, InterpolationOrder -> IO, Method -> "Spline"][ x] & /@ (({{#[[1]]}, #[[2]]}) & /@ # & /@ MMStdata); data = Transpose[{# + RandomReal[]*0.1 & /@ Range[-10, 30, 0.4], Tanh[#] + (Sech[2 x - 0.5]/1.5 + 1.5) /. x -> # & /@ Range[-4, 4, 0.08]}];

xLimits = {[email protected]#1, [email protected]#1} & @@ Transpose[data]; f = First[100*D[GetRLine3[{data}, 3][x], x]];

我們將使用NDSolve重新捕獲f,並找到導數在此過程中消失的點。 vals = Reap[ soln = y[x] /. First[NDSolve[{y'[x] == Evaluate[D[f, x]], y[-9.9] == (f /. x -> -9.9)}, y[x], {x, -9.9, 30}, Method -> {"EventLocator", "Event" -> y'[x], "EventAction" :> Sow[{x, y[x]}]}]]][[2, 1]];

目視檢查: Plot[f, {x, -9.9, 30}, Epilog -> {PointSize[Medium], Red, Point[vals]}]

轉載註明原文: 如何查找範圍內的所有局部最小值/最大值