Advertisement
Guest User

Untitled

a guest
Aug 24th, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.91 KB | None | 0 0
  1. import math
  2.  
  3. # заданная унимодальная функция
  4. def f(x): return pow(x, 3) - x + pow(math.e, -x)
  5.  
  6. # def generateRandomMass(a, b, step): return [f(x) if x != 0 else 0 for x in np.arange(a, b, step)]
  7.  
  8. def passivSearch():    
  9.     eps = 0.1                        # заданная погрешность                  
  10.     N = (2 - eps)/eps                 # узнаем с каким шагом дробить массив при заданной погрешности
  11.     N = round(N)
  12.     print(N)
  13.  
  14.     dotXmass = [k/(N+1) for k in range(1, (N+1))]   # генерируем массив точек с высчитанным шагом для нашей погрешности
  15.     dotYmass = [f(x) for x in dotXmass]             # Высчитываем значения функции в этих точках
  16.     print(dotXmass)
  17.     print(dotYmass)
  18.  
  19.  
  20.     # задаем начальные значения перед циклом
  21.     lastPair = []
  22.     selectedMLength = len(dotXmass)
  23.     a, b = 0, len(dotXmass)
  24.     # пока длина выбранного отрезка больше одного числа, то делаем срезы
  25.     while selectedMLength > 1:
  26.         if selectedMLength % 2 == 0:                                    # если длина выбранного отрезка четная -
  27.             c, d = selectedMLength//2 - 1, selectedMLength//2           # задаем позиции точек c и d на отрезке dotX
  28.         else:                                                           # иначе
  29.             c, d = (selectedMLength-1)//2 - 1, (selectedMLength-1)//2   # вычитаем 1, что бы получить четный массив и делаем левый отрезок чуть меньше=)
  30.  
  31.         # последние записанные данные - это последняя пара в которой и есть минимум
  32.         lastPair = [dotYmass[c], dotYmass[d]]
  33.  
  34.          # если f(c) < f(d)
  35.         if dotYmass[c] < dotYmass[d]:
  36.             b, a = d, 0 # Обновляем a, b под срез [a:d]
  37.             dotXmass = dotXmass[a:b]            # Обрезаем массив под новые значения
  38.             dotYmass = dotYmass[a:b]
  39.             selectedMLength =  len(dotXmass)    # Обновляем длину нашего отрезка
  40.         else:
  41.             a, b = d, len(dotXmass)             # обновляем a, b под сред [d:b]
  42.             dotXmass = dotXmass[d:b]            # обрезаем массив под новые значения
  43.             dotYmass = dotYmass[d:b]
  44.             selectedMLength = len(dotXmass)     # длина=)
  45.  
  46.  
  47.  
  48.     print(lastPair)  
  49.     # сравниваем последнюю пару и возвращаем значения
  50.     if lastPair[0] < lastPair[1]: min = lastPair[0]
  51.     else: min = lastPair[1]
  52.     return min
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement