import math
# функция
def f(x):
return 0.85*x**2 - 4.148*x + 7.71
# --- 1. Метод дихотомии ---
def dichotomy(a, b, eps):
delta = eps / 2
while (b - a) > eps:
x0 = (a + b) / 2
x1 = x0 - delta
x2 = x0 + delta
if f(x1) < f(x2):
b = x2
else:
a = x1
x_min = (a + b) / 2
return x_min, f(x_min)
# --- 2. Метод золотого сечения ---
def golden_section(a, b, eps):
tau = (math.sqrt(5) - 1) / 2
x1 = a + (1 - tau) * (b - a)
x2 = a + tau * (b - a)
f1 = f(x1)
f2 = f(x2)
while (b - a) > eps:
if f1 > f2:
a = x1
x1 = x2
f1 = f2
x2 = a + tau * (b - a)
f2 = f(x2)
else:
b = x2
x2 = x1
f2 = f1
x1 = a + (1 - tau) * (b - a)
f1 = f(x1)
x_min = (a + b) / 2
return x_min, f(x_min)
# --- 3. Метод Фибоначчи ---
def fibonacci_method(a, b, eps):
# генерируем числа Фибоначчи
fib = [1, 1]
while fib[-1] < (b - a) / eps:
fib.append(fib[-1] + fib[-2])
n = len(fib) - 1
x1 = a + (fib[n-2] / fib[n]) * (b - a)
x2 = a + (fib[n-1] / fib[n]) * (b - a)
f1 = f(x1)
f2 = f(x2)
for k in range(1, n-1):
if f1 > f2:
a = x1
x1 = x2
f1 = f2
x2 = a + (fib[n-k-1] / fib[n-k]) * (b - a)
f2 = f(x2)
else:
b = x2
x2 = x1
f2 = f1
x1 = a + (fib[n-k-2] / fib[n-k]) * (b - a)
f1 = f(x1)
x_min = (a + b) / 2
return x_min, f(x_min)
# --- запуск ---
a, b = 1, 6
eps = 0.01
print("Дихотомия:", dichotomy(a, b, eps))
print("Золотое сечение:", golden_section(a, b, eps))
print("Фибоначчи:", fibonacci_method(a, b, eps))