Модуль: Тернарный поиск


2. Тернарный поиск: начало (Python)

☰ Теория

Тернарный поиск
Тернарный поиск нужен нам для поиска максимума или минимума унимодальной функции на отрезке [l, r]. Унимодальной функция является тогда, когда у нее на отрезке есть один экстремум.
Поиск максимальных значений функции часто используется для оптимизационных задач. Например, нам надо найти максимально возможный угол прямоугольного треугольника, при котором площадь будет наибольшей.  Для этого мы переберём углы от 0 до 90, и на этом отрезке ищем площадь, которая сначала возрастет, а потом будет уменьшаться, т.е. функция будет унимодальной.
 
Принцип работы
Принцип работы схож с двоичным поиском, но у нас, возможно, возникнет случай при делении отрезка пополам, когда у нас середина отрезка попадет ровно на экстремум, и  внятного результата мы не получим.
Поэтому, чтобы избежать подобного случая, надо делить отрезок не на две части, а на три, и ту часть в которой нет экстремума, отбрасываем и т.д., до тех пор пока границы не сойдутся на результате.
 
import math


def f(hypo, alpha):
    alpha = (alpha * math.pi)/180
    return 0.5 * hypo * hypo * math.cos(alpha) * math.sin(alpha)


l = 0.
r = 90.
EPS = 1e-6;
hypo = 100
while r - l >= EPS:
    m1 = l + (r - l) / 3
    m2 = r - (r - l) / 3
    if f(hypo, m1) < f(hypo, m2):
        l = m1
    else:
        r = m2

print((l + r) / 2)

Тернарный поиск можно модифицировать, используя метод золотого сечения, который увеличивает скорость сходимости примерно в 2 раза.
 
Источники
1)  тернарный поиск и метод золотого сечения
2)  тернарный поиск


 

Найти минимум функции \(y=x \cdot x - b \cdot x + 100\), где коэффициент b вводится с клавиатуры.
 
Примеры
Входные данные Выходные данные
1 10 5


Примечание
Внимательно смотрите, что ваш алгоритм ищет: максимум или минимум.
 

Вставьте недостающие фрагменты кода
Python
Напишите программу ниже
import math

def f(x, b):
# здесь должна быть ваша функция                          
l = -100
r = 100
EPS = 1e-6

b = int(input())    
print((l + r) / 2)