Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- # заданная унимодальная функция
- def f(x): return pow(x, 3) - x + pow(math.e, -x)
- # def generateRandomMass(a, b, step): return [f(x) if x != 0 else 0 for x in np.arange(a, b, step)]
- def passivSearch():
- eps = 0.1 # заданная погрешность
- N = (2 - eps)/eps # узнаем с каким шагом дробить массив при заданной погрешности
- N = round(N)
- print(N)
- dotXmass = [k/(N+1) for k in range(1, (N+1))] # генерируем массив точек с высчитанным шагом для нашей погрешности
- dotYmass = [f(x) for x in dotXmass] # Высчитываем значения функции в этих точках
- print(dotXmass)
- print(dotYmass)
- # задаем начальные значения перед циклом
- lastPair = []
- selectedMLength = len(dotXmass)
- a, b = 0, len(dotXmass)
- # пока длина выбранного отрезка больше одного числа, то делаем срезы
- while selectedMLength > 1:
- if selectedMLength % 2 == 0: # если длина выбранного отрезка четная -
- c, d = selectedMLength//2 - 1, selectedMLength//2 # задаем позиции точек c и d на отрезке dotX
- else: # иначе
- c, d = (selectedMLength-1)//2 - 1, (selectedMLength-1)//2 # вычитаем 1, что бы получить четный массив и делаем левый отрезок чуть меньше=)
- # последние записанные данные - это последняя пара в которой и есть минимум
- lastPair = [dotYmass[c], dotYmass[d]]
- # если f(c) < f(d)
- if dotYmass[c] < dotYmass[d]:
- b, a = d, 0 # Обновляем a, b под срез [a:d]
- dotXmass = dotXmass[a:b] # Обрезаем массив под новые значения
- dotYmass = dotYmass[a:b]
- selectedMLength = len(dotXmass) # Обновляем длину нашего отрезка
- else:
- a, b = d, len(dotXmass) # обновляем a, b под сред [d:b]
- dotXmass = dotXmass[d:b] # обрезаем массив под новые значения
- dotYmass = dotYmass[d:b]
- selectedMLength = len(dotXmass) # длина=)
- print(lastPair)
- # сравниваем последнюю пару и возвращаем значения
- if lastPair[0] < lastPair[1]: min = lastPair[0]
- else: min = lastPair[1]
- return min
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement