Пробные точки:
Алгоритм:
Ключевое свойство: на каждой итерации — только 1 новое вычисление .

Почему это работает: точка нового отрезка совпадает с точкой старого отрезка (и наоборот), поэтому значение уже известно.
На каждой итерации отрезок сокращается в раз.
Число итераций:
Число вычислений функции:
Пример: ,
Сравнение:
| Метод | Вычислений |
|---|---|
| Равномерный поиск | 10 001 |
| Дихотомия | 27 |
| Золотое сечение | 19 |
Пример: на ,
Минимум в точке , .
| Итерация | Отрезок | ||||||
|---|---|---|---|---|---|---|---|
| 1 | 0 | 10 | 3.82 | 6.18 | 1.67 | 8.07 | |
| 2 | 0 | 6.18 | 2.36 | 3.82 | 1.73 | 1.67 | |
| 3 | 2.36 | 6.18 | 3.82 | 4.72 | 1.67 | 4.12 | |
| 4 | 2.36 | 4.72 | 3.26 | 3.82 | 1.07 | 1.67 | |
| 5 | 2.36 | 3.82 | 2.92 | 3.26 | 1.01 | 1.07 | |
| 6 | 2.92 | 3.82 | 3.26 | 3.47 | 1.07 | 1.22 |
→ ещё одна итерация.
Идея: для заданного числа вычислений минимизировать конечную длину отрезка неопределённости.
Числа Фибоначчи: , ,
Пробные точки на -й итерации:
Свойство: метод Фибоначчи оптимален — при заданном даёт наименьший конечный отрезок среди всех прямых методов.
Вход: отрезок , число вычислений (задаёт точность)
Точность:
Число вычислений для заданной :

Пример: , вычислений ( итераций)
Для той же точности методом золотого сечения: .
Недостаток: нужно заранее знать (или ), нельзя добавить вычислений «на ходу».
| Метод | Вычислений | Нужно знать заранее? | Оптимальность |
|---|---|---|---|
| Равномерный поиск | Нет | Не оптимален | |
| Дихотомия | Нет | Не оптимален | |
| Золотое сечение | Нет | Почти оптимален | |
| Фибоначчи | Да | Оптимален |
Задача: ,
| Метод | Вычислений |
|---|---|
| Равномерный поиск | 10 001 |
| Дихотомия | 28 |
| Золотое сечение | 20 |
| Фибоначчи | 20 |
Вывод: золотое сечение и Фибоначчи дают практически одинаковый результат, но золотое сечение не требует знания заранее — поэтому на практике предпочитают именно его.

На графике: длина отрезка неопределённости в зависимости от числа вычислений функции.
import math
def golden_section(f, a, b, eps=1e-6):
alpha = (math.sqrt(5) - 1) / 2 # ≈ 0.618
x1 = b - alpha * (b - a)
x2 = a + alpha * (b - a)
f1, f2 = f(x1), f(x2)
iterations = 0
while abs(b - a) > eps:
iterations += 1
if f1 < f2:
b, x2, f2 = x2, x1, f1
x1 = b - alpha * (b - a)
f1 = f(x1)
else:
a, x1, f1 = x1, x2, f2
x2 = a + alpha * (b - a)
f2 = f(x2)
return (a + b) / 2, f((a + b) / 2), iterations
result = golden_section(lambda x: x**2 - 6*x + 10, 0, 10)
print(f"x*={result[0]:.6f}, f(x*)={result[1]:.6f}, iter={result[2]}")
# x*=3.000000, f(x*)=1.000000, iter=25
def dichotomy(f, a, b, eps=1e-6, delta=1e-8):
iterations = 0
while (b - a) / 2 > eps:
iterations += 1
xm = (a + b) / 2
if f(xm - delta) < f(xm + delta):
b = xm
else:
a = xm
return (a + b) / 2, f((a + b) / 2), iterations
def fibonacci_method(f, a, b, n=20):
fib = [0, 1]
for _ in range(2, n + 2):
fib.append(fib[-1] + fib[-2])
x1 = a + fib[n - 1] / fib[n + 1] * (b - a)
x2 = a + fib[n] / fib[n + 1] * (b - a)
f1, f2 = f(x1), f(x2)
for k in range(1, n):
if f1 < f2:
b, x2, f2 = x2, x1, f1
x1 = a + fib[n - k - 1] / fib[n - k + 1] * (b - a)
f1 = f(x1)
else:
a, x1, f1 = x1, x2, f2
x2 = a + fib[n - k] / fib[n - k + 1] * (b - a)
f2 = f(x2)
return (a + b) / 2, f((a + b) / 2)
f = lambda x: x**2 - 6*x + 10
a, b, eps = 0, 10, 1e-6
print("Метод золотого сечения:")
x, fx, n = golden_section(f, a, b, eps)
print(f" x*={x:.8f}, f(x*)={fx:.8f}, вычислений={2+n}")
print("Метод дихотомии:")
x, fx, n = dichotomy(f, a, b, eps)
print(f" x*={x:.8f}, f(x*)={fx:.8f}, вычислений={2*n}")
print("Метод Фибоначчи (n=25):")
x, fx = fibonacci_method(f, a, b, 25)
print(f" x*={x:.8f}, f(x*)={fx:.8f}, вычислений=26")
# Золотое сечение: 27 вычислений
# Дихотомия: 42 вычислений
# Фибоначчи: 26 вычислений
Основная литература:
Дополнительная литература:
Онлайн-ресурсы:
Кратко пробегитесь по плану: начнём с постановки задачи и унимодальности, затем прямые методы (перебор, дихотомия, золотое сечение, Фибоначчи), сравнение эффективности и программная реализация.
Дайте чёткую постановку задачи: найти минимум функции на отрезке. Подчеркните, что это базовая задача, из которой строятся многомерные методы.
Унимодальность — ключевое предположение, без которого прямые методы не работают.
Дихотомия — первый адаптивный метод.
Золотое сечение — один из самых эффективных прямых методов.
Метод Фибоначчи — оптимальный по числу вычислений среди прямых методов.