def f(x):
return x**3 - 1.98*x**2 - 9.587*x + 6.178
def find_min_quadrisection(f, a, b, e=0.001, max_iter=1000):
"""
Поиск минимума функции на отрезке [a, b] методом деления на 4 части.
Предполагается, что функция унимодальна на отрезке.
"""
for _ in range(max_iter):
length = b - a
if length < e:
# Достигнута заданная точность
return (a + b) / 2
# Точки, делящие отрезок на 4 равные части
x1 = a + length / 4
x2 = a + length / 2
x3 = a + 3 * length / 4
f1, f2, f3 = f(x1), f(x2), f(x3)
# Определяем, в каком подинтервале находится минимум
if f1 <= f2 and f1 <= f3:
# Минимум в левом подинтервале [a, x2]
b = x2
elif f2 <= f1 and f2 <= f3:
# Минимум в среднем подинтервале [x1, x3]
a = x1
b = x3
else: # f3 минимальное
# Минимум в правом подинтервале [x2, b]
a = x2
# Если превышено максимальное число итераций, возвращаем середину
return (a + b) / 2
# Поиск минимума на отрезке [-5, 5]
min_x = find_min_quadrisection(f, -5, 5)
print(f"Точка минимума: {min_x:.8f}")
print(f"Значение функции в минимуме: {f(min_x):.8f}")