Это просто идея, своего рода идея под другим углом, и, возможно, очень плохая идея, но, поскольку дифференциация не работает, что-то вроде этого может быть мыслью.
Сначала необходимо определить минимальный значимый интервал по оси X. На вашей фигуре, если вы считаете, что это слишком мало, вы получите ложные срабатывания от ударов. Концептуально это похоже на идею сглаживания ваших данных. Назовите этот интервал дх.
Далее, используя скользящее окно размера dx, сгенерируйте кривую скользящего среднего, соответствующую вашей кривой. Есть много разных способов сделать это (удалить статистические выбросы или использовать больше или меньше точек в окне). Назовите эту кривую g (x), а исходную кривую f (x). Кроме того, создайте кривую h (x), которая дает некоторую меру изменчивости данных в скользящем окне, которое вы используете для вычисления g (x) (стандартное отклонение должно работать нормально, если вы используете несколько точек из интервала).
Теперь начнем вычислять кривые вида c_m (x) = | f (x) - g (x) | - м * ч (х). Вы можете начать с m = 1. Любые точки x, для которых c_m (x) положительна, являются кандидатами в локальные мин / макс. В зависимости от того, сколько хитов вы получите, вы можете начать увеличивать или уменьшать m. Вы можете сделать это аналогично поиску в binarys: если вы хотите больше точек, сделайте m = (min + m) / 2, а если вы хотите меньше точек, сделайте m = (max + m) / 2 (настраивая min и макс соответственно).
Итак, вот пример того, что я предлагаю. Допустим, у нас есть следующие серии:
f(x) = [ 1, 2, 4, 3, 2, 3, 6, 7, 8, 7,
5, 4, 3, 2, 2, 3, 2, 3, 5, 8, 9]
Мы выбираем dx = 5. Построим g (x), взяв простое среднее значение точек вокруг x:
g(x) = [2.3, 2.5, 2.4, 2.8, 3.6, 4.2, 5.2, 6.2, 6.6, 6.2,
5.4, 4.2, 3.2, 2.8, 2.4, 2.4, 3.0, 4.2, 5.4, 6.3, 7.3]
h(x) = [1.2, 1.1, 1.0, 0.7, 1.4, 2.4, 2.3, 1.7, 1.0, 1.5,
1.9, 1.7, 1.2, 0.7, 0.5, 0.6, 1.1, 2.1, 2.7, 2.4, 1.7]
При m = 1 получаем:
c(x) = [0.1, xxx, 0.6, xxx, 0.2, xxx, xxx, xxx, 0.4, xxx,
xxx, xxx, xxx, 0.1, xxx, 0.0, xxx, xxx, xxx, xxx, 0.0]
Похоже, это сработало довольно хорошо. Не стесняйтесь делиться мыслями. Обратите внимание, что это может быть более или менее эквивалентно дифференцированию, учитывая теорему о среднем значении.