Вы просто берете производную. Здесь я взял несколько градиентов, чтобы убедиться, что точка, которую мы находим, находится сверху, а не просто случайность:
import math
import matplotlib.pyplot as plt
x_array = []
y_array = []
for num in range(0, 10000):
x = num/100
y = math.sin(x) * (.99 ** x)
x_array.append(x)
y_array.append(y)
x_maximums = []
y_maximums = []
for i in range(2, len(y_array) - 2):
if y_array[i - 2] < y_array[i - 1] and y_array[i - 1] < y_array[i] and y_array[i + 2] < y_array[i + 1] and y_array[i + 1] < y_array[i]:
y_maximums.append(y_array[i])
x_maximums.append(x_array[i])
plt.plot(x_array, y_array)
plt.scatter(x_maximums, y_maximums, color='k')
plt.show()
Выходы:
ПРИМЕЧАНИЕ Излишние производные, которые я использовал, не нужны для моего поста. Я включил их, потому что возможно, что ваш набор данных имеет небольшие различия между числами, которые неправильно пометили бы некоторые из них как локальный максимум, если бы вы сравнивали только два ближайших числа (общее в экспериментальных данных). В качестве альтернативы можно взять производные, такие как:
if y_array[i - 2] < y_array[i] and y_array[i - 1] < y_array[i] and y_array[i + 2] < y_array[i] and y_array[i + 1] < y_array[i]:
Если это имеет больше смысла для вас, или, может быть, даже как-то иначе, если вы все еще получаете странные результаты!